diff --git a/.gitignore b/.gitignore index 11203de33..47f80db59 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ tmp .idea build dist +.angular \ No newline at end of file diff --git a/angular.json b/angular.json new file mode 100644 index 000000000..e9b5423a2 --- /dev/null +++ b/angular.json @@ -0,0 +1,103 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "kommonitor-client": { + "projectType": "application", + "schematics": {}, + "root": "app", + "sourceRoot": "app", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/kommonitor-client", + "index": "app/index.html", + "main": "app/main.ts", + "polyfills": [ + "zone.js" + ], + "tsConfig": "tsconfig.app.json", + "assets": [ + "app/" + ], + "styles": [ + "app/app.css", + "node_modules/bootstrap/dist/css/bootstrap.min.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "latest-angular:build", + "port": 8000 + }, + "configurations": { + "production": { + "browserTarget": "kommonitor-client:build:production" + }, + "development": { + "browserTarget": "kommonitor-client:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "kommonitor-client:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing" + ], + "tsConfig": "tsconfig.spec.json", + "assets": [ + "app/favicon.ico" + ], + "styles": [ + "app/app.css", + "node_modules/bootstrap/dist/css/bootstrap.min.css" + ], + "scripts": [] + } + } + } + } + } + } + \ No newline at end of file diff --git a/app/app-upgraded-providers.ts b/app/app-upgraded-providers.ts new file mode 100644 index 000000000..025d6c4f0 --- /dev/null +++ b/app/app-upgraded-providers.ts @@ -0,0 +1,178 @@ +import { Injector, Injectable } from '@angular/core'; +import { KommonitorElementVisibilityHelperService } from "util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.service"; +import { kommonitorCacheHelperService } from 'util/genericServices/kommonitorCacheHelperService/kommonitor-cache-helper-service.module'; +import {kommonitorBatchUpdateHelperService} from 'util/genericServices/kommonitorBatchUpdateHelperService/kommonitor-batch-update-helper-service.module'; +import {kommonitorConfigStorageService} from 'util/genericServices/kommonitorConfigStorageService/kommonitor-config-storage-service.module'; +import {kommonitorDataExchangeService} from 'util/genericServices/kommonitorDataExchangeService/kommonitor-data-exchange-service.module'; +import {kommonitorDataGridHelperService} from 'util/genericServices/kommonitorDataGridHelperService/kommonitor-data-grid-helper-service.module'; +import {kommonitorDiagramHelperService} from 'util/genericServices/kommonitorDiagramHelperService/kommonitor-diagram-helper-service.module'; +import {kommonitorFilterHelperService} from 'util/genericServices/kommonitorFilterHelperService/kommonitor-filter-helper-service.module'; +import {kommonitorImporterHelperService} from 'util/genericServices/kommonitorImporterHelperService/kommonitor-importer-helper-service.module'; +import {kommonitorKeycloackHelperService} from 'util/genericServices/kommonitorKeycloakHelperService/kommonitor-keycloak-helper-service.module' +import {kommonitorMultistepFormHelperService} from 'util/genericServices/kommonitorMultiStepFormHelperService/kommonitor-multi-step-form-helper-service.module' +import {kommonitorScriptHelperService} from'util/genericServices/kommonitorScriptHelperService/kommonitor-script-helper-service.module'; +import {kommonitorShareHelperService} from 'util/genericServices/kommonitorShareHelperService/kommonitor-share-helper-service.module' +import {kommonitorSingleFeatureMapHelperService} from 'util/genericServices/kommonitorSingleFeatureMapHelperService/kommonitor-single-feature-map-helper-service.module' +import {kommonitorVisualStyleHelperService} from 'util/genericServices/kommonitorVisualStyleHelperService/kommonitor-visual-style-helper-service.module' + +export function kommonitorCacheHelperServiceFactory(injector:any){ + return injector.get('kommonitorCacheHelperService'); +} +export const ajskommonitorCacheHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorCacheHelperService', + useFactory:kommonitorCacheHelperServiceFactory , + }; + + +export function kommonitorBatchUpdateHelperServiceFactory (injector:any){ + return injector.get('kommonitorBatchUpdateHelperService') +} + +export const ajskommonitorBatchUpdateHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorBatchUpdateHelperService', + useFactory:kommonitorBatchUpdateHelperServiceFactory , + }; + + export function kommonitorConfigStorageServiceFactory (injector:any){ + return injector.get('kommonitorConfigStorageService') +} + +export const ajskommonitorConfigStorageServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorConfigStorageService', + useFactory:kommonitorConfigStorageServiceFactory, + }; +//data exchange + export function kommonitorDataExchangeServiceFactory (injector:any){ + return injector.get('kommonitorDataExchangeService') +} + +export const ajskommonitorDataExchangeServiceeProvider: any = { + deps: ['$injector'], + provide: 'kommonitorDataExchangeService', + useFactory:kommonitorDataExchangeServiceFactory, + }; +//data grid helper + export function kommonitorDataGridHelperServiceFactory (injector:any){ + return injector.get('kommonitorDataGridHelperService') +} + +export const ajskommonitorDataGridHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorDataGridHelperService', + useFactory:kommonitorDataGridHelperServiceFactory, + }; +//diagram helper + export function kommonitorDiagramHelperServiceFactory (injector:any){ + return injector.get('kommonitorDiagramHelperService') +} + +export const ajskommonitorDiagramHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorDiagramHelperService', + useFactory:kommonitorDiagramHelperServiceFactory, + }; + + //filter helper + export function kommonitorFilterHelperServiceFactory (injector:any){ + return injector.get('kommonitorFilterHelperService') +} + +export const ajskommonitorFilterHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorFilterHelperService', + useFactory:kommonitorFilterHelperServiceFactory, + }; + +//keycloack helper + export function kommonitorKeycloackHelperServiceFactory (injector:any){ + return injector.get('kommonitorKeycloackHelperService') +} + +export const ajskommonitorKeycloackHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorKeycloackHelperService', + useFactory:kommonitorKeycloackHelperServiceFactory, + }; + + //multistep form + export function kommonitorMultiStepFormHelperServiceFactory (injector:any){ + return injector.get('kommonitorMultiStepFormHelperService') +} + +export const ajskommonitorMultiStepFormHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorMultiStepFormHelperService', + useFactory:kommonitorMultiStepFormHelperServiceFactory, + }; + +//script helpet + +export function kommonitorScriptHelperServiceFactory (injector:any){ + return injector.get('kommonitorScriptHelperService') +} + +export const ajskommonitorScriptHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorScriptHelperService', + useFactory:kommonitorScriptHelperServiceFactory, + }; +//share Helper +export function kommonitorShareHelperServiceFactory (injector:any){ + return injector.get('kommonitorShareHelperService') +} + +export const ajskommonitorShareHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorShareHelperService', + useFactory:kommonitorShareHelperServiceFactory, + }; + +//single feature map helper +export function kommonitorSingleFeatureMapServiceFactory (injector:any){ + return injector.get('kommonitorSingleFeatureMapService') +} + +export const ajskommonitorSingleFeatureMapServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorSingleFeatureMapService', + useFactory:kommonitorSingleFeatureMapServiceFactory, + }; + + + +//visually style helper + +export function kommonitorVisualStyleHelperServiceFactory (injector:any){ + return injector.get('kommonitorVisualStyleHelperService') +} + +export const ajskommonitorVisualStyleHelperServiceProvider: any = { + deps: ['$injector'], + provide: 'kommonitorVisualStyleHelperService', + useFactory:kommonitorVisualStyleHelperServiceFactory, + }; + + + + + + + + export const serviceProviders: any[] = [ + ajskommonitorCacheHelperServiceProvider, + ajskommonitorBatchUpdateHelperServiceProvider, + ajskommonitorConfigStorageServiceProvider, + ajskommonitorDataExchangeServiceeProvider, + ajskommonitorDataGridHelperServiceProvider, + ajskommonitorDiagramHelperServiceProvider, + ajskommonitorFilterHelperServiceProvider, +ajskommonitorKeycloackHelperServiceProvider, +ajskommonitorMultiStepFormHelperServiceProvider, +ajskommonitorScriptHelperServiceProvider, +ajskommonitorShareHelperServiceProvider, +ajskommonitorSingleFeatureMapServiceProvider, +ajskommonitorVisualStyleHelperServiceProvider + ]; diff --git a/app/app.ajs.js b/app/app.ajs.js new file mode 100644 index 000000000..bc2871254 --- /dev/null +++ b/app/app.ajs.js @@ -0,0 +1,436 @@ +"use strict"; +if (/MSIE 9/i.test(navigator.userAgent) || /MSIE 10/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent)) { + // This is internet explorer 9, 10 or 11 + window.alert('Internet Explorer erkannt. Für eine optimale Nutzung von KomMonitor nutzen Sie nach Möglichkeit die Browser Firefox oder Chrome.'); +} +if (/Edge\/\d./i.test(navigator.userAgent)) { + // This is Microsoft Edge + window.alert('Microsoft Edge erkannt. Für eine optimale Nutzung von KomMonitor nutzen Sie nach Möglichkeit die Browser Firefox oder Chrome.'); +} +var env = {}; +// for jspdf insert backwards compatibility according to https://github.com/parallax/jsPDF/releases/tag/v2.0.0 +window.jsPDF = window.jspdf.jsPDF; +// Declare app level module which depends on views, and components +var appModule = angular.module('kommonitorClient', ['ngRoute', 'kommonitorUserInterface', 'kommonitorAdmin']); +var controlsServiceName = 'ControlsConfigService'; +var auth = {}; +/* + LOAD CONFIG FILES FROM CONFIG STORAGE SERVER +*/ +function ajaxCall_keycloakConfig(configStorageServerConfig) { + console.log("try to fetch keycloak config file"); + return $.ajax({ + url: configStorageServerConfig.targetUrlToConfigStorageServer_keycloakConfig, + success: function (result) { + console.log("keycloak config file fetched"); + window.__env.keycloakConfig = result; + return; + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + console.log("Use keycloak.json local backup default values"); + } + }); +} +function ajaxCall_appConfig(configStorageServerConfig) { + console.log("try to fetch app config file"); + return $.ajax({ + url: configStorageServerConfig.targetUrlToConfigStorageServer_appConfig, + success: function (result) { + console.log("app config file fetched"); + window.__env.appConfig = result; + return; + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + console.log("Use env.js local backup default values"); + } + }); +} +function ajaxCall_controlsConfig(configStorageServerConfig) { + console.log("try to fetch controls config file"); + return $.ajax({ + url: configStorageServerConfig.targetUrlToConfigStorageServer_controlsConfig, + success: function (result) { + console.log("controls config file fetched"); + window.__env.controlsConfig = result; + return; + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + console.log("Use controls-config.json local backup default values that has no widget restrictions."); + } + }); +} +/* + LOAD CONFIG FILES FROM LOCAL BACKUP FILES +*/ +function ajaxCall_keycloakConfig_localBackup(configStorageServerConfig) { + return $.ajax({ + url: "./config/keycloak_backup.json", + success: function (result) { + console.log("local keycloak config file with default values fetched"); + window.__env.keycloakConfig = result; + return; + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + console.log("Error parsing local keycloak.json backup file"); + } + }); +} +function ajaxCall_controlsConfig_localBackup(configStorageServerConfig) { + return $.ajax({ + url: "./config/controls-config_backup.json", + success: function (result) { + console.log("local controls-config file with default values fetched"); + window.__env.controlsConfig = result; + return; + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + console.log("Error parsing local controlsConfig.json backup file"); + } + }); +} +function loadAppConfigScriptDynamically(scriptUrl) { + return new Promise(function (res, rej) { + let script = document.createElement('script'); + script.src = scriptUrl; + script.type = 'text/javascript'; + script.onError = rej; + script.async = true; + script.onload = res; + script.addEventListener('error', rej); + script.addEventListener('load', res); + document.head.appendChild(script); + }); +} +function ajaxCall_configServerFile() { + return $.ajax({ + url: "./config/config-storage-server.json", + success: function (result) { + window.__env = window.__env || {}; + window.__env.configStorageServerConfig = result; + // inject script tag dynamically to DOM to load ENV variables + console.log("dynamically load env.js"); + const event = loadAppConfigScriptDynamically(window.__env.configStorageServerConfig.targetUrlToConfigStorageServer_appConfig) + .then(() => { console.log("loaded"); }) + .catch(() => { + console.log("Error while loading app config from client config storage server. Will use defaults instead"); + alert("Error while loading app config from client config storage server. Will use defaults instead."); + }); + return $.when(ajaxCall_keycloakConfig(window.__env.configStorageServerConfig), ajaxCall_controlsConfig(window.__env.configStorageServerConfig), ajaxCall_appConfig(window.__env.configStorageServerConfig)).then(function (ajax1Results, ajax2Results, ajax3Results) { + console.log("all configs have been loaded"); + initAngularComponents(); + bootstrapApplication(); + return; + }, function () { + // on fail + console.log("all configs have been loaded - at least some from local backup values. See console log for details"); + initAngularComponents(); + bootstrapApplication(); + return; + }); + } + }); +} +var loadConfigsThenApp = function () { + console.log("start loading required config files"); + $.when(ajaxCall_keycloakConfig_localBackup(window.__env.configStorageServerConfig), ajaxCall_controlsConfig_localBackup(window.__env.configStorageServerConfig)).then(function (ajax1Results, ajax2Results) { + console.log("local backup configs have been loaded in case config server is not reachable."); + ajaxCall_configServerFile(); + }, function () { + // on fail + console.log("all configs have been loaded - at least some from local backup values. See console log for details"); + ajaxCall_configServerFile(); + }); +}; +function initAngularComponents() { + console.log("Start to initialize required AngularJS components"); + // Import variables if present (from env.js) + if (window) { + Object.assign(env, window.__env); + } + // Register environment in AngularJS as constant + appModule.constant('__env', env); + // MathJx directive + appModule.directive("mathjaxBind", function () { + return { + restrict: "EA", + controller: [ + "$scope", + "$element", + "$attrs", + function ($scope, $element, $attrs) { + $scope.$watch($attrs.mathjaxBind, function (texExpression) { + $element.html(texExpression); + // only if texExpression contains the special character '$' which is used to mark tex code + // then call MathJax function + if (texExpression && texExpression.includes("$")) { + MathJax.typesetPromise([$element[0]]); + } + }); + }, + ], + }; + }); + // custom unique filter + appModule.filter('unique', function () { + return function (collection, primaryKey) { + var output = [], keys = []; + var splitKeys = primaryKey.split('.'); //split by period + angular.forEach(collection, function (item) { + var key = {}; + angular.copy(item, key); + for (var i = 0; i < splitKeys.length; i++) { + key = key[splitKeys[i]]; //the beauty of loosely typed js :) + } + if (keys.indexOf(key) === -1) { + keys.push(key); + output.push(item); + } + }); + return output; + }; + }); + appModule.service(controlsServiceName, ['$http', function ($http) { + window.__env.config = null; + // var resourcePath = window.__env.configStorageServerConfig ? window.__env.configStorageServerConfig.targetUrlToConfigStorageServer_controlsConfig : './config/controls-config_backup.json'; + var resourcePath = './config/controls-config_backup.json'; + var promise = $http.get(resourcePath).then(function (response) { + // window.__env.config = response.data; + window.__env.config = window.__env.controlsConfig; + }); + return { + promise: promise, + setData: function (response) { + window.__env.config = window.__env.controlsConfig; + }, + getControlsConfig: function () { + return window.__env.config; + } + }; + }]); + appModule. + config(['$routeProvider', + function config($routeProvider) { + $routeProvider. + when('/', { + template: '', + resolve: { + controlsServiceName: function (ControlsConfigService) { + return ControlsConfigService.promise; + } + } + }). + when('/administration', { + template: '', + resolve: { + 'auth': function (Auth, $q, $location) { + if (window.__env.enableKeycloakSecurity) { + if (Auth.keycloak.authenticated) { + if (Auth.keycloak.tokenParsed + && Auth.keycloak.tokenParsed.realm_access + && Auth.keycloak.tokenParsed.realm_access.roles + && Auth.keycloak.tokenParsed.realm_access.roles.some(role => role.endsWith("-creator") || role.endsWith("-publisher") || role.endsWith("-editor"))) { + Auth.keycloak.showAdminView = true; + } + if (Auth.keycloak.showAdminView) { + return true; + } + else { + return $q.reject('Not Authenticated'); + } + } + else { + Auth.keycloak.login({ + redirectUri: $location.absUrl() + }); + } + } + else { + } + } + } + }). + otherwise('/'); + } + ]) + .run(function ($rootScope, $location, Auth) { + // register listener to watch route changes + $rootScope.$on("$routeChangeError", function (event, next, current) { + $location.path("/"); + }); + }); + if (!env.enableDebug) { + if (window) { + window.console.log = function () { }; + } + } + if (window.__env.enableKeycloakSecurity) { + appModule.factory('authInterceptor', ['$q', 'Auth', function ($q, Auth) { + return { + request: function (config) { + var deferred = $q.defer(); + if (Auth.keycloak.token && urlRequiresKeycloakAuthHeader(config.url)) { + Auth.keycloak.updateToken(5).then(function () { + config.headers = config.headers || {}; + config.headers.Authorization = 'Bearer ' + Auth.keycloak.token; + deferred.resolve(config); + }).catch(function () { + deferred.reject('Failed to refresh token'); + console.error('Failed to refresh token. Will redirect to Login screen'); + auth.keycloak.login(); + }); + return deferred.promise; + } + else { + return config; + } + } + }; + }]); + appModule.config(['$httpProvider', function ($httpProvider) { + $httpProvider.interceptors.push('authInterceptor'); + }]); + } + if (env.encryption.enabled) { + appModule.factory('encryptionInterceptor', ['$q', function ($q) { + return { + response: function (response) { + // if encrypted, then will look like: + // {encryptedData: encryptedData} + // using AES-CBC + if (response.data.encryptedData) { + try { + var encryptedString = response.data.encryptedData; + var decryptedJson = decryptAesCBC(encryptedString); + response.data = decryptedJson; + return response; + } + catch (error) { + console.error(error); + return response; + } + } + return response; + }, + }; + }]); + appModule.config(['$httpProvider', function ($httpProvider) { + $httpProvider.interceptors.push('encryptionInterceptor'); + }]); + } +} +function bootstrapApplication() { + if (window.__env.enableKeycloakSecurity) { + var keycloakAdapter = new Keycloak(window.__env.configStorageServerConfig.targetUrlToConfigStorageServer_keycloakConfig); + // https://www.keycloak.org/docs/latest/securing_apps/#session-status-iframe + // https://www.keycloak.org/docs/latest/securing_apps/#_modern_browsers + keycloakAdapter.init({ + onLoad: 'check-sso', + checkLoginIframe: false, + silentCheckSsoFallback: false + }).then(function (authenticated) { + console.log(authenticated ? 'User is authenticated!' : 'User is not authenticated!'); + auth.keycloak = keycloakAdapter; + appModule.factory('Auth', function () { + return auth; + }); + try { + console.debug('Trying to bootstrap application.'); + angular.bootstrap(document, [appModule.name]); + } + catch (e) { + console.error('Application bootstrapping failed.'); + console.error(e); + } + }).catch(function () { + console.log('Failed to initialize authentication adapter. Will try to bootstrap application without keycloak security'); + alert('Failed to initialize keycloak authentication adapter. Will try to bootstrap application without keycloak security'); + window.__env.enableKeycloakSecurity = false; + bootstrapApplication(); + }); + } + else { + var keycloakAdapter = new Keycloak(keycloakConfig_forDirectInit); + auth.keycloak = keycloakAdapter; + appModule.factory('Auth', function () { + return auth; + }); + try { + console.debug('Trying to bootstrap application.'); + angular.bootstrap(document, [appModule.name]); + } + catch (e) { + console.error('Application bootstrapping failed.'); + console.error(e); + } + } +} +angular.element(document).ready(function ($http) { + // load configs before doing anything else + loadConfigsThenApp(); +}); +var urlRequiresKeycloakAuthHeader = function (url) { + // /admin/ is used to make admin requests against keycloak + if (url.includes("/admin/")) { + return false; + } + // ORS isochrones and directions requests + if (url.includes("isochrones")) { + return false; + } + if (url.includes("routes")) { + return false; + } + // for KomMonitor public requests we do not need any authentication + if (url.includes("/public/")) { + return false; + } + return true; +}; +var isBase64 = function (str) { + var notBase64 = /[^A-Z0-9+\/=]/i; + const isString = (typeof str === 'string' || str instanceof String); + if (!isString) { + let invalidType; + if (str === null) { + invalidType = 'null'; + } + else { + invalidType = typeof str; + if (invalidType === 'object' && str.constructor && str.constructor.hasOwnProperty('name')) { + invalidType = str.constructor.name; + } + else { + invalidType = `a ${invalidType}`; + } + } + throw new TypeError(`Expected string but received ${invalidType}.`); + } + const len = str.length; + if (!len || len % 4 !== 0 || notBase64.test(str)) { + return false; + } + const firstPaddingChar = str.indexOf('='); + return firstPaddingChar === -1 || + firstPaddingChar === len - 1 || + (firstPaddingChar === len - 2 && str[len - 1] === '='); +}; +var decryptAesCBC = function (encryptedString) { + var hashedKey = CryptoJS.SHA256(env.encryption.password); + // from BASE64 encoded encrypted string + var encryptedWordArray = CryptoJS.enc.Base64.parse(encryptedString); + // get IV from beginning + var iv = CryptoJS.lib.WordArray.create(encryptedWordArray.words.slice(0, (env.encryption.ivLength_byte) / 4)); + var decrypted = CryptoJS.AES.decrypt({ + ciphertext: CryptoJS.lib.WordArray.create(encryptedWordArray.words.slice(env.encryption.ivLength_byte / 4)) + }, hashedKey, { iv: iv }); + var decryptedString = decrypted.toString(CryptoJS.enc.Utf8); + var decryptedJson = JSON.parse(decryptedString); + // sometimes a response might still be BASE64 encoded in addition + // if so, then resolve that + if ((typeof decryptedJson === 'string' || decryptedJson instanceof String) && isBase64(decryptedJson)) { + decryptedJson = CryptoJS.enc.Base64.parse(decryptedJson).toString(CryptoJS.enc.Utf8); + decryptedJson = JSON.parse(decryptedJson); + } + return decryptedJson; +}; +//# sourceMappingURL=app.ajs.js.map \ No newline at end of file diff --git a/app/app.ajs.js.map b/app/app.ajs.js.map new file mode 100644 index 000000000..d850c81a5 --- /dev/null +++ b/app/app.ajs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.ajs.js","sourceRoot":"","sources":["app.ajs.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/app.js b/app/app.ajs.ts similarity index 90% rename from app/app.js rename to app/app.ajs.ts index caf0bf986..7754630de 100644 --- a/app/app.js +++ b/app/app.ajs.ts @@ -1,3 +1,6 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + if (/MSIE 9/i.test(navigator.userAgent) || /MSIE 10/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent)) { // This is internet explorer 9, 10 or 11 window.alert('Internet Explorer erkannt. Für eine optimale Nutzung von KomMonitor nutzen Sie nach Möglichkeit die Browser Firefox oder Chrome.'); @@ -376,58 +379,55 @@ function initAngularComponents(){ } -function bootstrapApplication(){ - - if(window.__env.enableKeycloakSecurity){ - var keycloakAdapter = new Keycloak(window.__env.configStorageServerConfig.targetUrlToConfigStorageServer_keycloakConfig); - // https://www.keycloak.org/docs/latest/securing_apps/#session-status-iframe - // https://www.keycloak.org/docs/latest/securing_apps/#_modern_browsers - - keycloakAdapter.init({ - onLoad: 'check-sso', - checkLoginIframe: false, - silentCheckSsoFallback: false - }).then(function (authenticated) { - console.log(authenticated ? 'User is authenticated!' : 'User is not authenticated!'); - auth.keycloak = keycloakAdapter; - appModule.factory('Auth', function () { - return auth; +async function bootstrapApplication() { + if (window.__env.enableKeycloakSecurity) { + try { + const keycloakAdapter = new Keycloak(window.__env.configStorageServerConfig.targetUrlToConfigStorageServer_keycloakConfig); + const authenticated = await keycloakAdapter.init({ + onLoad: 'check-sso', + checkLoginIframe: false, + silentCheckSsoFallback: false }); - try { - console.debug('Trying to bootstrap application.'); - angular.bootstrap(document, [appModule.name]); - } - catch (e) { - console.error('Application bootstrapping failed.'); - console.error(e); + + console.log(authenticated ? 'User is authenticated!' : 'User is not authenticated!'); + + if (authenticated) { + window.__env.keycloak = keycloakAdapter; + } else { + console.log('Failed to initialize authentication adapter. Will try to bootstrap application without keycloak security'); + alert('Failed to initialize keycloak authentication adapter. Will try to bootstrap application without keycloak security'); + window.__env.enableKeycloakSecurity = false; + await bootstrapApplication(); } - }).catch(function () { - console.log('Failed to initialize authentication adapter. Will try to bootstrap application without keycloak security'); - alert('Failed to initialize keycloak authentication adapter. Will try to bootstrap application without keycloak security'); - window.__env.enableKeycloakSecurity = false; - bootstrapApplication(); - }); + } catch (e) { + console.error('Application bootstrapping failed.'); + console.error(e); + } + } else { + window.__env.keycloak = new Keycloak(keycloakConfig_forDirectInit); } - else{ - var keycloakAdapter = new Keycloak(keycloakConfig_forDirectInit); - auth.keycloak = keycloakAdapter; - appModule.factory('Auth', function () { - return auth; - }); - try { - console.debug('Trying to bootstrap application.'); - angular.bootstrap(document, [appModule.name]); - } - catch (e) { - console.error('Application bootstrapping failed.'); - console.error(e); - } + if (environment.production) { + enableProdMode(); } + platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch(err => console.error(err)); } + + + + + + + + + + + angular.element(document).ready(function ($http) { // load configs before doing anything else diff --git a/app/app.module.js b/app/app.module.js new file mode 100644 index 000000000..54a972858 --- /dev/null +++ b/app/app.module.js @@ -0,0 +1,20 @@ +import { __decorate } from "tslib"; +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { InfoModalModule } from 'components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.module'; +export let AppModule = class AppModule { + constructor(upgrade) { + this.upgrade = upgrade; + } + ngDoBootstrap() { + this.upgrade.bootstrap(document.documentElement, ['kommonitorClient']); + } +}; +AppModule = __decorate([ + NgModule({ + imports: [ + BrowserModule, InfoModalModule + ], + }) +], AppModule); +//# sourceMappingURL=app.module.js.map \ No newline at end of file diff --git a/app/app.module.js.map b/app/app.module.js.map new file mode 100644 index 000000000..de975f22e --- /dev/null +++ b/app/app.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.module.js","sourceRoot":"","sources":["app.module.ts"],"names":[],"mappings":";AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,mFAAmF,CAAC;AAO7G,WAAM,SAAS,GAAf,MAAM,SAAS;IAClB,YAAoB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IAAI,CAAC;IAC/C,aAAa;QACT,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACzE,CAAC;CACN,CAAA;AALY,SAAS;IANrB,QAAQ,CAAC;QACR,OAAO,EAAE;YACP,aAAa,EAAC,eAAe;SAC9B;KAEF,CAAC;GACW,SAAS,CAKrB"} \ No newline at end of file diff --git a/app/app.module.ts b/app/app.module.ts new file mode 100644 index 000000000..300f86616 --- /dev/null +++ b/app/app.module.ts @@ -0,0 +1,36 @@ +import { DoBootstrap, NgModule, Injector } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { UpgradeModule, setAngularJSGlobal } from '@angular/upgrade/static'; +import { InfoModalModule } from 'components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.module'; +import { VersionInfoModule } from 'components/kommonitorUserInterface/kommonitorControls/versionInfo/version-info.module'; +import { ajskommonitorCacheHelperServiceProvider,ajskommonitorBatchUpdateHelperServiceProvider,ajskommonitorConfigStorageServiceProvider,ajskommonitorDataExchangeServiceeProvider,ajskommonitorDataGridHelperServiceProvider,ajskommonitorDiagramHelperServiceProvider,ajskommonitorFilterHelperServiceProvider,ajskommonitorKeycloackHelperServiceProvider,ajskommonitorMultiStepFormHelperServiceProvider, ajskommonitorSingleFeatureMapServiceProvider } from 'app-upgraded-providers'; + +declare var angular: any; // Declare the AngularJS global variable + +@NgModule({ + imports: [ + BrowserModule, + UpgradeModule, + InfoModalModule, + VersionInfoModule + ], + providers:[ +ajskommonitorCacheHelperServiceProvider,ajskommonitorBatchUpdateHelperServiceProvider, +ajskommonitorConfigStorageServiceProvider,ajskommonitorKeycloackHelperServiceProvider, +ajskommonitorMultiStepFormHelperServiceProvider,ajskommonitorDataExchangeServiceeProvider, +ajskommonitorDataGridHelperServiceProvider,ajskommonitorSingleFeatureMapServiceProvider, +ajskommonitorDiagramHelperServiceProvider,ajskommonitorFilterHelperServiceProvider + ] + // ... +}) +export class AppModule implements DoBootstrap { + constructor(private upgrade: UpgradeModule, private injector: Injector) { + setAngularJSGlobal(angular); // Set the AngularJS global object for @angular/upgrade/static + } + + ngDoBootstrap() { + // Bootstrap the AngularJS application + const angularJSModule = angular.module('kommonitorClient', []); + this.upgrade.bootstrap(document.documentElement, [angularJSModule.name], { strictDi: false }); + } +} diff --git a/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.js b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.js index a064c5cd0..07ca46ab4 100644 --- a/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.js +++ b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.js @@ -1,205 +1,159 @@ +"use strict"; angular.module('adminAppConfig').component('adminAppConfig', { - templateUrl: "components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function AppConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - this.kommonitorConfigStorageServiceInstance = kommonitorConfigStorageService; - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - $scope.codeMirrorEditor = undefined; - - $scope.missingRequiredParameters = []; - $scope.missingRequiredParameters_string = ""; - - $scope.keywordsInConfig = ["window.__env", "window.__env.appTitle", "window.__env.enableKeycloakSecurity", "window.__env.encryption", - "window.__env.FEATURE_ID_PROPERTY_NAME", "window.__env.FEATURE_NAME_PROPERTY_NAME", - "window.__env.VALID_START_DATE_PROPERTY_NAME", "window.__env.VALID_END_DATE_PROPERTY_NAME", "window.__env.indicatorDatePrefix", - "window.__env.apiUrl", "window.__env.targetUrlToProcessingEngine", "window.__env.targetUrlToReachabilityService_ORS", - "window.__env.targetUrlToImporterService", "window.__env.simplifyGeometriesParameterName", "window.__env.simplifyGeometriesOptions", - "window.__env.simplifyGeometries", "window.__env.numberOfDecimals", "window.__env.initialLatitude", "window.__env.initialLongitude", - "window.__env.initialZoomLevel", "window.__env.minZoomLevel", "window.__env.maxZoomLevel", "window.__env.baseLayers", "window.__env.initialIndicatorId", - "window.__env.initialSpatialUnitName", "window.__env.useTransparencyOnIndicator", "window.__env.useOutlierDetectionOnIndicator", - "window.__env.classifyZeroSeparately", "window.__env.classifyUsingWholeTimeseries", "window.__env.updateIntervalOptions", - "window.__env.indicatorCreationTypeOptions", "window.__env.indicatorUnitOptions", "window.__env.indicatorTypeOptions", - "window.__env.wmsDatasets", "window.__env.wfsDatasets", "window.__env.isAdvancedMode", "window.__env.showAdvancedModeSwitch", - "window.__env.customLogoURL", "window.__env.customLogo_onClickURL", "window.__env.customLogoWidth", "window.__env.customGreetingsContact_name", - "window.__env.customGreetingsContact_organisation", "window.__env.customGreetingsContact_mail"]; - - $scope.appConfigTemplate = undefined; - $scope.appConfigTmp = undefined; - $scope.appConfigCurrent = undefined; - $scope.appConfigNew = undefined; - - $scope.configSettingInvalid = false; - - $scope.init = async function(){ - await $http.get('./config/env_backup.js', {'responseType': 'text'}).then(function (response) { - $scope.appConfigTemplate = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_backupTemplate"); - }); - - // set in app.js - $scope.appConfigTmp = __env.appConfig; - $scope.appConfigCurrent = __env.appConfig; - $scope.appConfigNew = __env.appConfig; - kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_current"); - - $scope.initCodeEditor(); - - $scope.onChangeAppConfig(); - - $scope.$digest(); - }; - - $scope.initCodeEditor = function(){ - $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("appConfigEditor"), { - lineNumbers: true, - autoRefresh:true, - mode: "javascript", - gutters: ["CodeMirror-lint-markers"], - lint: { - "getAnnotations": $scope.validateCode, - "async": true - } - }); - - $scope.codeMirrorEditor.setSize(null, 450); - - $scope.codeMirrorEditor.on('change',function(cMirror){ - // get value right from instance - $scope.appConfigTmp = $scope.codeMirrorEditor.getValue(); - }); - - $scope.codeMirrorEditor.setValue($scope.appConfigCurrent); - }; - - $scope.validateCode = function(cm, updateLinting, options){ - // call the built in css linter from addon/lint/css-lint.js - try { - $scope.lintingIssues = CodeMirror.lint.javascript(cm, options); - - updateLinting($scope.lintingIssues); - } catch (error) { - console.error("Error while linting app config script code. Error is: \n" + error); - } - - $scope.onChangeAppConfig(); - - }; - - $scope.resetDefaultConfig = async function(){ - $scope.appConfigCurrent = $scope.appConfigTemplate; - $scope.appConfigNew = $scope.appConfigTemplate; - $scope.appConfigTmp = $scope.appConfigTemplate; - - $scope.onChangeAppConfig(); - - // update config on server - $scope.editAppConfig(); - - $scope.codeMirrorEditor.setValue($scope.appConfigCurrent); - }; - - $scope.isConfigSettingInvalid = function(configString){ - var isInvalid = true; - - isInvalid = ! $scope.keywordsInConfig.every(keyword => configString.includes(keyword)); - $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => ! configString.includes(keyword)); - $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); - - if ($scope.lintingIssues && $scope.lintingIssues.length > 0){ - var errors = $scope.lintingIssues.filter(issue => issue.severity === 'error'); - if(errors && errors.length > 0){ - isInvalid = true; - } - } - - return isInvalid; - }; - - $scope.onChangeAppConfig = function(){ - // check by searching for keywords - - var configString = $scope.appConfigTmp; - - $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); - - $timeout(function(){ - $scope.appConfigNew = configString; - }); - - $timeout(function(){ - // kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_new"); - document.getElementById('appConfig_new').innerHTML = - PR.prettyPrintOne($scope.appConfigNew, - 'javascript', true); - }, 250); - - $timeout(function(){ - $scope.$digest(); - }); - }; - - $scope.init(); - - $scope.editAppConfig = async function(){ - $timeout(function () { - $scope.loadingData = true; - }); - - $scope.errorMessagePart = undefined; - - try { - var addConfigResponse = await kommonitorConfigStorageService.postAppConfig($scope.appConfigTmp); - - var newCurrentConfig = await kommonitorConfigStorageService.getAppConfig(); - $timeout(function(){ - $scope.appConfigCurrent = newCurrentConfig; - }); - - $timeout(function(){ - // kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_new"); - document.getElementById('appConfig_current').innerHTML = - PR.prettyPrintOne($scope.appConfigCurrent, - 'javascript', true); - }, 250); - - $("#appConfigEditSuccessAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } catch (error) { - if (error.data) { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#appConfigEditErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - - }; - - $scope.hideSuccessAlert = function () { - $("#appConfigEditSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function () { - $("#appConfigEditErrorAlert").hide(); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function AppConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + this.kommonitorConfigStorageServiceInstance = kommonitorConfigStorageService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.codeMirrorEditor = undefined; + $scope.missingRequiredParameters = []; + $scope.missingRequiredParameters_string = ""; + $scope.keywordsInConfig = ["window.__env", "window.__env.appTitle", "window.__env.enableKeycloakSecurity", "window.__env.encryption", + "window.__env.FEATURE_ID_PROPERTY_NAME", "window.__env.FEATURE_NAME_PROPERTY_NAME", + "window.__env.VALID_START_DATE_PROPERTY_NAME", "window.__env.VALID_END_DATE_PROPERTY_NAME", "window.__env.indicatorDatePrefix", + "window.__env.apiUrl", "window.__env.targetUrlToProcessingEngine", "window.__env.targetUrlToReachabilityService_ORS", + "window.__env.targetUrlToImporterService", "window.__env.simplifyGeometriesParameterName", "window.__env.simplifyGeometriesOptions", + "window.__env.simplifyGeometries", "window.__env.numberOfDecimals", "window.__env.initialLatitude", "window.__env.initialLongitude", + "window.__env.initialZoomLevel", "window.__env.minZoomLevel", "window.__env.maxZoomLevel", "window.__env.baseLayers", "window.__env.initialIndicatorId", + "window.__env.initialSpatialUnitName", "window.__env.useTransparencyOnIndicator", "window.__env.useOutlierDetectionOnIndicator", + "window.__env.classifyZeroSeparately", "window.__env.classifyUsingWholeTimeseries", "window.__env.updateIntervalOptions", + "window.__env.indicatorCreationTypeOptions", "window.__env.indicatorUnitOptions", "window.__env.indicatorTypeOptions", + "window.__env.wmsDatasets", "window.__env.wfsDatasets", "window.__env.isAdvancedMode", "window.__env.showAdvancedModeSwitch", + "window.__env.customLogoURL", "window.__env.customLogo_onClickURL", "window.__env.customLogoWidth", "window.__env.customGreetingsContact_name", + "window.__env.customGreetingsContact_organisation", "window.__env.customGreetingsContact_mail"]; + $scope.appConfigTemplate = undefined; + $scope.appConfigTmp = undefined; + $scope.appConfigCurrent = undefined; + $scope.appConfigNew = undefined; + $scope.configSettingInvalid = false; + $scope.init = async function () { + await $http.get('./config/env_backup.js', { 'responseType': 'text' }).then(function (response) { + $scope.appConfigTemplate = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_backupTemplate"); + }); + // set in app.js + $scope.appConfigTmp = __env.appConfig; + $scope.appConfigCurrent = __env.appConfig; + $scope.appConfigNew = __env.appConfig; + kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_current"); + $scope.initCodeEditor(); + $scope.onChangeAppConfig(); + $scope.$digest(); + }; + $scope.initCodeEditor = function () { + $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("appConfigEditor"), { + lineNumbers: true, + autoRefresh: true, + mode: "javascript", + gutters: ["CodeMirror-lint-markers"], + lint: { + "getAnnotations": $scope.validateCode, + "async": true + } + }); + $scope.codeMirrorEditor.setSize(null, 450); + $scope.codeMirrorEditor.on('change', function (cMirror) { + // get value right from instance + $scope.appConfigTmp = $scope.codeMirrorEditor.getValue(); + }); + $scope.codeMirrorEditor.setValue($scope.appConfigCurrent); + }; + $scope.validateCode = function (cm, updateLinting, options) { + // call the built in css linter from addon/lint/css-lint.js + try { + $scope.lintingIssues = CodeMirror.lint.javascript(cm, options); + updateLinting($scope.lintingIssues); + } + catch (error) { + console.error("Error while linting app config script code. Error is: \n" + error); + } + $scope.onChangeAppConfig(); + }; + $scope.resetDefaultConfig = async function () { + $scope.appConfigCurrent = $scope.appConfigTemplate; + $scope.appConfigNew = $scope.appConfigTemplate; + $scope.appConfigTmp = $scope.appConfigTemplate; + $scope.onChangeAppConfig(); + // update config on server + $scope.editAppConfig(); + $scope.codeMirrorEditor.setValue($scope.appConfigCurrent); + }; + $scope.isConfigSettingInvalid = function (configString) { + var isInvalid = true; + isInvalid = !$scope.keywordsInConfig.every(keyword => configString.includes(keyword)); + $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => !configString.includes(keyword)); + $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); + if ($scope.lintingIssues && $scope.lintingIssues.length > 0) { + var errors = $scope.lintingIssues.filter(issue => issue.severity === 'error'); + if (errors && errors.length > 0) { + isInvalid = true; + } + } + return isInvalid; + }; + $scope.onChangeAppConfig = function () { + // check by searching for keywords + var configString = $scope.appConfigTmp; + $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); + $timeout(function () { + $scope.appConfigNew = configString; + }); + $timeout(function () { + // kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_new"); + document.getElementById('appConfig_new').innerHTML = + PR.prettyPrintOne($scope.appConfigNew, 'javascript', true); + }, 250); + $timeout(function () { + $scope.$digest(); + }); + }; + $scope.init(); + $scope.editAppConfig = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.errorMessagePart = undefined; + try { + var addConfigResponse = await kommonitorConfigStorageService.postAppConfig($scope.appConfigTmp); + var newCurrentConfig = await kommonitorConfigStorageService.getAppConfig(); + $timeout(function () { + $scope.appConfigCurrent = newCurrentConfig; + }); + $timeout(function () { + // kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_new"); + document.getElementById('appConfig_current').innerHTML = + PR.prettyPrintOne($scope.appConfigCurrent, 'javascript', true); + }, 250); + $("#appConfigEditSuccessAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#appConfigEditErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + }; + $scope.hideSuccessAlert = function () { + $("#appConfigEditSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#appConfigEditErrorAlert").hide(); + }; + } + ] }); +//# sourceMappingURL=admin-app-config.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.js.map b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.js.map new file mode 100644 index 000000000..62694404b --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-app-config.component.js","sourceRoot":"","sources":["admin-app-config.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.ts b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.ts new file mode 100644 index 000000000..a064c5cd0 --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.component.ts @@ -0,0 +1,205 @@ +angular.module('adminAppConfig').component('adminAppConfig', { + templateUrl: "components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function AppConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + this.kommonitorConfigStorageServiceInstance = kommonitorConfigStorageService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + $scope.codeMirrorEditor = undefined; + + $scope.missingRequiredParameters = []; + $scope.missingRequiredParameters_string = ""; + + $scope.keywordsInConfig = ["window.__env", "window.__env.appTitle", "window.__env.enableKeycloakSecurity", "window.__env.encryption", + "window.__env.FEATURE_ID_PROPERTY_NAME", "window.__env.FEATURE_NAME_PROPERTY_NAME", + "window.__env.VALID_START_DATE_PROPERTY_NAME", "window.__env.VALID_END_DATE_PROPERTY_NAME", "window.__env.indicatorDatePrefix", + "window.__env.apiUrl", "window.__env.targetUrlToProcessingEngine", "window.__env.targetUrlToReachabilityService_ORS", + "window.__env.targetUrlToImporterService", "window.__env.simplifyGeometriesParameterName", "window.__env.simplifyGeometriesOptions", + "window.__env.simplifyGeometries", "window.__env.numberOfDecimals", "window.__env.initialLatitude", "window.__env.initialLongitude", + "window.__env.initialZoomLevel", "window.__env.minZoomLevel", "window.__env.maxZoomLevel", "window.__env.baseLayers", "window.__env.initialIndicatorId", + "window.__env.initialSpatialUnitName", "window.__env.useTransparencyOnIndicator", "window.__env.useOutlierDetectionOnIndicator", + "window.__env.classifyZeroSeparately", "window.__env.classifyUsingWholeTimeseries", "window.__env.updateIntervalOptions", + "window.__env.indicatorCreationTypeOptions", "window.__env.indicatorUnitOptions", "window.__env.indicatorTypeOptions", + "window.__env.wmsDatasets", "window.__env.wfsDatasets", "window.__env.isAdvancedMode", "window.__env.showAdvancedModeSwitch", + "window.__env.customLogoURL", "window.__env.customLogo_onClickURL", "window.__env.customLogoWidth", "window.__env.customGreetingsContact_name", + "window.__env.customGreetingsContact_organisation", "window.__env.customGreetingsContact_mail"]; + + $scope.appConfigTemplate = undefined; + $scope.appConfigTmp = undefined; + $scope.appConfigCurrent = undefined; + $scope.appConfigNew = undefined; + + $scope.configSettingInvalid = false; + + $scope.init = async function(){ + await $http.get('./config/env_backup.js', {'responseType': 'text'}).then(function (response) { + $scope.appConfigTemplate = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_backupTemplate"); + }); + + // set in app.js + $scope.appConfigTmp = __env.appConfig; + $scope.appConfigCurrent = __env.appConfig; + $scope.appConfigNew = __env.appConfig; + kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_current"); + + $scope.initCodeEditor(); + + $scope.onChangeAppConfig(); + + $scope.$digest(); + }; + + $scope.initCodeEditor = function(){ + $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("appConfigEditor"), { + lineNumbers: true, + autoRefresh:true, + mode: "javascript", + gutters: ["CodeMirror-lint-markers"], + lint: { + "getAnnotations": $scope.validateCode, + "async": true + } + }); + + $scope.codeMirrorEditor.setSize(null, 450); + + $scope.codeMirrorEditor.on('change',function(cMirror){ + // get value right from instance + $scope.appConfigTmp = $scope.codeMirrorEditor.getValue(); + }); + + $scope.codeMirrorEditor.setValue($scope.appConfigCurrent); + }; + + $scope.validateCode = function(cm, updateLinting, options){ + // call the built in css linter from addon/lint/css-lint.js + try { + $scope.lintingIssues = CodeMirror.lint.javascript(cm, options); + + updateLinting($scope.lintingIssues); + } catch (error) { + console.error("Error while linting app config script code. Error is: \n" + error); + } + + $scope.onChangeAppConfig(); + + }; + + $scope.resetDefaultConfig = async function(){ + $scope.appConfigCurrent = $scope.appConfigTemplate; + $scope.appConfigNew = $scope.appConfigTemplate; + $scope.appConfigTmp = $scope.appConfigTemplate; + + $scope.onChangeAppConfig(); + + // update config on server + $scope.editAppConfig(); + + $scope.codeMirrorEditor.setValue($scope.appConfigCurrent); + }; + + $scope.isConfigSettingInvalid = function(configString){ + var isInvalid = true; + + isInvalid = ! $scope.keywordsInConfig.every(keyword => configString.includes(keyword)); + $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => ! configString.includes(keyword)); + $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); + + if ($scope.lintingIssues && $scope.lintingIssues.length > 0){ + var errors = $scope.lintingIssues.filter(issue => issue.severity === 'error'); + if(errors && errors.length > 0){ + isInvalid = true; + } + } + + return isInvalid; + }; + + $scope.onChangeAppConfig = function(){ + // check by searching for keywords + + var configString = $scope.appConfigTmp; + + $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); + + $timeout(function(){ + $scope.appConfigNew = configString; + }); + + $timeout(function(){ + // kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_new"); + document.getElementById('appConfig_new').innerHTML = + PR.prettyPrintOne($scope.appConfigNew, + 'javascript', true); + }, 250); + + $timeout(function(){ + $scope.$digest(); + }); + }; + + $scope.init(); + + $scope.editAppConfig = async function(){ + $timeout(function () { + $scope.loadingData = true; + }); + + $scope.errorMessagePart = undefined; + + try { + var addConfigResponse = await kommonitorConfigStorageService.postAppConfig($scope.appConfigTmp); + + var newCurrentConfig = await kommonitorConfigStorageService.getAppConfig(); + $timeout(function(){ + $scope.appConfigCurrent = newCurrentConfig; + }); + + $timeout(function(){ + // kommonitorScriptHelperService.prettifyScriptCodePreview("appConfig_new"); + document.getElementById('appConfig_current').innerHTML = + PR.prettyPrintOne($scope.appConfigCurrent, + 'javascript', true); + }, 250); + + $("#appConfigEditSuccessAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#appConfigEditErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + + }; + + $scope.hideSuccessAlert = function () { + $("#appConfigEditSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function () { + $("#appConfigEditErrorAlert").hide(); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.js b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.js index df7d43ff4..8836d5f99 100644 --- a/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.js +++ b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminAppConfig', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'kommonitorConfigStorage']); +//# sourceMappingURL=admin-app-config.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.js.map b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.js.map new file mode 100644 index 000000000..26b1b823d --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-app-config.module.js","sourceRoot":"","sources":["admin-app-config.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,yBAAyB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.ts b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.ts new file mode 100644 index 000000000..df7d43ff4 --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminAppConfig/admin-app-config.module.ts @@ -0,0 +1 @@ +angular.module('adminAppConfig', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'kommonitorConfigStorage']); diff --git a/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.js b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.js index 817cf3693..1e19f3c57 100644 --- a/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.js +++ b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.js @@ -1,198 +1,150 @@ +"use strict"; angular.module('adminControlsConfig').component('adminControlsConfig', { - templateUrl: "components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function ControlsConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - this.kommonitorConfigStorageServiceInstance = kommonitorConfigStorageService; - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - $scope.codeMirrorEditor = undefined; - - $scope.missingRequiredParameters = []; - $scope.missingRequiredParameters_string = ""; - - $scope.keywordsInConfig = ["id", "roles", "indicatorConfig", "poi", "dataImport", "filter", - "measureOfValueClassification", "balance", "diagrams", "radarDiagram", "regressionDiagram", - "reachability", "processing", "indicatorLegendExportButtons", "reportingButton", "diagramExportButtons", - "georesourceExportButtons"]; - - $scope.controlsConfigTemplate = undefined; - $scope.controlsConfigTmp = undefined; - $scope.controlsConfigCurrent = undefined; - $scope.controlsConfigNew = undefined; - - $scope.configSettingInvalid = false; - - $scope.init = async function(){ - await $http.get('./config/controls-config_backup_forAdminViewExplanation.txt', {'responseType': 'text'}).then(function (response) { - $scope.controlsConfigTemplate = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_backupTemplate"); - }); - - // set in app.js - $scope.controlsConfigTmp = JSON.stringify(__env.controlsConfig, null, " "); - $scope.controlsConfigCurrent = JSON.stringify(__env.controlsConfig, null, " "); - $scope.controlsConfigNew = JSON.stringify(__env.controlsConfig, null, " "); - kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_current"); - - $scope.initCodeEditor(); - - $scope.onChangeControlsConfig(); - - $scope.$digest(); - }; - - $scope.initCodeEditor = function(){ - $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("controlsConfigEditor"), { - lineNumbers: true, - autoRefresh:true, - mode: "application/json", - gutters: ["CodeMirror-lint-markers"], - lint: { - "getAnnotations": $scope.validateCode, - "async": true - } - }); - - $scope.codeMirrorEditor.setSize(null, 300); - - $scope.codeMirrorEditor.on('change',function(cMirror){ - // get value right from instance - $scope.controlsConfigTmp = $scope.codeMirrorEditor.getValue(); - }); - - $scope.codeMirrorEditor.setValue($scope.controlsConfigCurrent); - }; - - $scope.validateCode = function(cm, updateLinting, options){ - // call the built in css linter from addon/lint/css-lint.js - try { - $scope.lintingIssues = CodeMirror.lint.json(cm, options); - - updateLinting($scope.lintingIssues); - } catch (error) { - console.error("Error while linting controls config json code. Error is: \n" + error); - } - - $scope.onChangeControlsConfig(); - - }; - - $scope.resetDefaultConfig = async function(){ - $scope.controlsConfigCurrent = $scope.controlsConfigTemplate; - $scope.controlsConfigNew = $scope.controlsConfigTemplate; - $scope.controlsConfigTmp = $scope.controlsConfigTemplate; - - $scope.onChangeControlsConfig(); - - // update config on server - $scope.editControlsConfig(); - - $scope.codeMirrorEditor.setValue($scope.controlsConfigCurrent); - }; - - $scope.isConfigSettingInvalid = function(configString){ - var isInvalid = true; - - isInvalid = ! $scope.keywordsInConfig.every(keyword => configString.includes(keyword)); - $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => ! configString.includes(keyword)); - $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); - - if ($scope.lintingIssues && $scope.lintingIssues.length > 0){ - isInvalid = true; - } - - return isInvalid; - - }; - - $scope.onChangeControlsConfig = function(){ - // check by searching for keywords - - var configString = $scope.controlsConfigTmp; - - if(typeof configString === 'object' && configString !== null){ - configString = JSON.stringify(configString, null, " "); - } - - $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); - - $timeout(function(){ - $scope.controlsConfigNew = configString; - }); - - $timeout(function(){ - // kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_new"); - document.getElementById('controlsConfig_new').innerHTML = - PR.prettyPrintOne($scope.controlsConfigNew, - 'javascript', true); - }, 250); - - $timeout(function(){ - $scope.$digest(); - }); - }; - - $scope.init(); - - $scope.editControlsConfig = async function(){ - $timeout(function () { - $scope.loadingData = true; - }); - - $scope.errorMessagePart = undefined; - - try { - var addConfigResponse = await kommonitorConfigStorageService.postControlsConfig($scope.controlsConfigTmp); - - var newCurrentConfig = await kommonitorConfigStorageService.getControlsConfig(); - $timeout(function(){ - $scope.controlsConfigCurrent = JSON.stringify(newCurrentConfig, null, " "); - }); - - $timeout(function(){ - // kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_new"); - document.getElementById('controlsConfig_current').innerHTML = - PR.prettyPrintOne($scope.controlsConfigCurrent, - 'javascript', true); - }, 250); - - $("#controlsConfigEditSuccessAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } catch (error) { - if (error.data) { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#controlsConfigEditErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - - }; - - $scope.hideSuccessAlert = function () { - $("#controlsConfigEditSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function () { - $("#controlsConfigEditErrorAlert").hide(); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function ControlsConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + this.kommonitorConfigStorageServiceInstance = kommonitorConfigStorageService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.codeMirrorEditor = undefined; + $scope.missingRequiredParameters = []; + $scope.missingRequiredParameters_string = ""; + $scope.keywordsInConfig = ["id", "roles", "indicatorConfig", "poi", "dataImport", "filter", + "measureOfValueClassification", "balance", "diagrams", "radarDiagram", "regressionDiagram", + "reachability", "processing", "indicatorLegendExportButtons", "reportingButton", "diagramExportButtons", + "georesourceExportButtons"]; + $scope.controlsConfigTemplate = undefined; + $scope.controlsConfigTmp = undefined; + $scope.controlsConfigCurrent = undefined; + $scope.controlsConfigNew = undefined; + $scope.configSettingInvalid = false; + $scope.init = async function () { + await $http.get('./config/controls-config_backup_forAdminViewExplanation.txt', { 'responseType': 'text' }).then(function (response) { + $scope.controlsConfigTemplate = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_backupTemplate"); + }); + // set in app.js + $scope.controlsConfigTmp = JSON.stringify(__env.controlsConfig, null, " "); + $scope.controlsConfigCurrent = JSON.stringify(__env.controlsConfig, null, " "); + $scope.controlsConfigNew = JSON.stringify(__env.controlsConfig, null, " "); + kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_current"); + $scope.initCodeEditor(); + $scope.onChangeControlsConfig(); + $scope.$digest(); + }; + $scope.initCodeEditor = function () { + $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("controlsConfigEditor"), { + lineNumbers: true, + autoRefresh: true, + mode: "application/json", + gutters: ["CodeMirror-lint-markers"], + lint: { + "getAnnotations": $scope.validateCode, + "async": true + } + }); + $scope.codeMirrorEditor.setSize(null, 300); + $scope.codeMirrorEditor.on('change', function (cMirror) { + // get value right from instance + $scope.controlsConfigTmp = $scope.codeMirrorEditor.getValue(); + }); + $scope.codeMirrorEditor.setValue($scope.controlsConfigCurrent); + }; + $scope.validateCode = function (cm, updateLinting, options) { + // call the built in css linter from addon/lint/css-lint.js + try { + $scope.lintingIssues = CodeMirror.lint.json(cm, options); + updateLinting($scope.lintingIssues); + } + catch (error) { + console.error("Error while linting controls config json code. Error is: \n" + error); + } + $scope.onChangeControlsConfig(); + }; + $scope.resetDefaultConfig = async function () { + $scope.controlsConfigCurrent = $scope.controlsConfigTemplate; + $scope.controlsConfigNew = $scope.controlsConfigTemplate; + $scope.controlsConfigTmp = $scope.controlsConfigTemplate; + $scope.onChangeControlsConfig(); + // update config on server + $scope.editControlsConfig(); + $scope.codeMirrorEditor.setValue($scope.controlsConfigCurrent); + }; + $scope.isConfigSettingInvalid = function (configString) { + var isInvalid = true; + isInvalid = !$scope.keywordsInConfig.every(keyword => configString.includes(keyword)); + $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => !configString.includes(keyword)); + $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); + if ($scope.lintingIssues && $scope.lintingIssues.length > 0) { + isInvalid = true; + } + return isInvalid; + }; + $scope.onChangeControlsConfig = function () { + // check by searching for keywords + var configString = $scope.controlsConfigTmp; + if (typeof configString === 'object' && configString !== null) { + configString = JSON.stringify(configString, null, " "); + } + $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); + $timeout(function () { + $scope.controlsConfigNew = configString; + }); + $timeout(function () { + // kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_new"); + document.getElementById('controlsConfig_new').innerHTML = + PR.prettyPrintOne($scope.controlsConfigNew, 'javascript', true); + }, 250); + $timeout(function () { + $scope.$digest(); + }); + }; + $scope.init(); + $scope.editControlsConfig = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.errorMessagePart = undefined; + try { + var addConfigResponse = await kommonitorConfigStorageService.postControlsConfig($scope.controlsConfigTmp); + var newCurrentConfig = await kommonitorConfigStorageService.getControlsConfig(); + $timeout(function () { + $scope.controlsConfigCurrent = JSON.stringify(newCurrentConfig, null, " "); + }); + $timeout(function () { + // kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_new"); + document.getElementById('controlsConfig_current').innerHTML = + PR.prettyPrintOne($scope.controlsConfigCurrent, 'javascript', true); + }, 250); + $("#controlsConfigEditSuccessAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#controlsConfigEditErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + }; + $scope.hideSuccessAlert = function () { + $("#controlsConfigEditSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#controlsConfigEditErrorAlert").hide(); + }; + } + ] }); +//# sourceMappingURL=admin-controls-config.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.js.map b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.js.map new file mode 100644 index 000000000..aea276983 --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-controls-config.component.js","sourceRoot":"","sources":["admin-controls-config.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.ts b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.ts new file mode 100644 index 000000000..817cf3693 --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.component.ts @@ -0,0 +1,198 @@ +angular.module('adminControlsConfig').component('adminControlsConfig', { + templateUrl: "components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function ControlsConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + this.kommonitorConfigStorageServiceInstance = kommonitorConfigStorageService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + $scope.codeMirrorEditor = undefined; + + $scope.missingRequiredParameters = []; + $scope.missingRequiredParameters_string = ""; + + $scope.keywordsInConfig = ["id", "roles", "indicatorConfig", "poi", "dataImport", "filter", + "measureOfValueClassification", "balance", "diagrams", "radarDiagram", "regressionDiagram", + "reachability", "processing", "indicatorLegendExportButtons", "reportingButton", "diagramExportButtons", + "georesourceExportButtons"]; + + $scope.controlsConfigTemplate = undefined; + $scope.controlsConfigTmp = undefined; + $scope.controlsConfigCurrent = undefined; + $scope.controlsConfigNew = undefined; + + $scope.configSettingInvalid = false; + + $scope.init = async function(){ + await $http.get('./config/controls-config_backup_forAdminViewExplanation.txt', {'responseType': 'text'}).then(function (response) { + $scope.controlsConfigTemplate = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_backupTemplate"); + }); + + // set in app.js + $scope.controlsConfigTmp = JSON.stringify(__env.controlsConfig, null, " "); + $scope.controlsConfigCurrent = JSON.stringify(__env.controlsConfig, null, " "); + $scope.controlsConfigNew = JSON.stringify(__env.controlsConfig, null, " "); + kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_current"); + + $scope.initCodeEditor(); + + $scope.onChangeControlsConfig(); + + $scope.$digest(); + }; + + $scope.initCodeEditor = function(){ + $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("controlsConfigEditor"), { + lineNumbers: true, + autoRefresh:true, + mode: "application/json", + gutters: ["CodeMirror-lint-markers"], + lint: { + "getAnnotations": $scope.validateCode, + "async": true + } + }); + + $scope.codeMirrorEditor.setSize(null, 300); + + $scope.codeMirrorEditor.on('change',function(cMirror){ + // get value right from instance + $scope.controlsConfigTmp = $scope.codeMirrorEditor.getValue(); + }); + + $scope.codeMirrorEditor.setValue($scope.controlsConfigCurrent); + }; + + $scope.validateCode = function(cm, updateLinting, options){ + // call the built in css linter from addon/lint/css-lint.js + try { + $scope.lintingIssues = CodeMirror.lint.json(cm, options); + + updateLinting($scope.lintingIssues); + } catch (error) { + console.error("Error while linting controls config json code. Error is: \n" + error); + } + + $scope.onChangeControlsConfig(); + + }; + + $scope.resetDefaultConfig = async function(){ + $scope.controlsConfigCurrent = $scope.controlsConfigTemplate; + $scope.controlsConfigNew = $scope.controlsConfigTemplate; + $scope.controlsConfigTmp = $scope.controlsConfigTemplate; + + $scope.onChangeControlsConfig(); + + // update config on server + $scope.editControlsConfig(); + + $scope.codeMirrorEditor.setValue($scope.controlsConfigCurrent); + }; + + $scope.isConfigSettingInvalid = function(configString){ + var isInvalid = true; + + isInvalid = ! $scope.keywordsInConfig.every(keyword => configString.includes(keyword)); + $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => ! configString.includes(keyword)); + $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); + + if ($scope.lintingIssues && $scope.lintingIssues.length > 0){ + isInvalid = true; + } + + return isInvalid; + + }; + + $scope.onChangeControlsConfig = function(){ + // check by searching for keywords + + var configString = $scope.controlsConfigTmp; + + if(typeof configString === 'object' && configString !== null){ + configString = JSON.stringify(configString, null, " "); + } + + $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); + + $timeout(function(){ + $scope.controlsConfigNew = configString; + }); + + $timeout(function(){ + // kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_new"); + document.getElementById('controlsConfig_new').innerHTML = + PR.prettyPrintOne($scope.controlsConfigNew, + 'javascript', true); + }, 250); + + $timeout(function(){ + $scope.$digest(); + }); + }; + + $scope.init(); + + $scope.editControlsConfig = async function(){ + $timeout(function () { + $scope.loadingData = true; + }); + + $scope.errorMessagePart = undefined; + + try { + var addConfigResponse = await kommonitorConfigStorageService.postControlsConfig($scope.controlsConfigTmp); + + var newCurrentConfig = await kommonitorConfigStorageService.getControlsConfig(); + $timeout(function(){ + $scope.controlsConfigCurrent = JSON.stringify(newCurrentConfig, null, " "); + }); + + $timeout(function(){ + // kommonitorScriptHelperService.prettifyScriptCodePreview("controlsConfig_new"); + document.getElementById('controlsConfig_current').innerHTML = + PR.prettyPrintOne($scope.controlsConfigCurrent, + 'javascript', true); + }, 250); + + $("#controlsConfigEditSuccessAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#controlsConfigEditErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + + }; + + $scope.hideSuccessAlert = function () { + $("#controlsConfigEditSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function () { + $("#controlsConfigEditErrorAlert").hide(); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.js b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.js index f3eea23ea..e60d7fa81 100644 --- a/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.js +++ b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminControlsConfig', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'kommonitorConfigStorage']); +//# sourceMappingURL=admin-controls-config.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.js.map b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.js.map new file mode 100644 index 000000000..7aa199778 --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-controls-config.module.js","sourceRoot":"","sources":["admin-controls-config.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,yBAAyB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.ts b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.ts new file mode 100644 index 000000000..f3eea23ea --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminControlsConfig/admin-controls-config.module.ts @@ -0,0 +1 @@ +angular.module('adminControlsConfig', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'kommonitorConfigStorage']); diff --git a/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.js b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.js index 04eb90eda..51d0b6b0e 100644 --- a/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.js +++ b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.js @@ -1,197 +1,149 @@ +"use strict"; angular.module('adminKeycloakConfig').component('adminKeycloakConfig', { - templateUrl: "components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function KeycloakConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - $scope.codeMirrorEditor = undefined; - - $scope.missingRequiredParameters = []; - $scope.missingRequiredParameters_string = ""; - - $scope.keywordsInConfig = ["realm", "auth-server-url", "http", "/auth", "resource", "ssl-required", "public-client", "confidential-port"]; - - $scope.keycloakConfigTemplate = undefined; - $scope.keycloakConfigTmp = undefined; - $scope.keycloakConfigCurrent = undefined; - $scope.keycloakConfigNew = undefined; - - $scope.configSettingInvalid = false; - - $scope.init = async function(){ - await $http.get('./config/keycloak_backup_withComments.txt', {'responseType': 'text'}).then(function (response) { - // $scope.keycloakConfigTemplate = JSON.stringify(response.data, null, " "); - $scope.keycloakConfigTemplate = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_backupTemplate"); - }); - - // set in app.js - $scope.keycloakConfigTmp = JSON.stringify(__env.keycloakConfig, null, " "); - $scope.keycloakConfigCurrent = JSON.stringify(__env.keycloakConfig, null, " "); - $scope.keycloakConfigNew = JSON.stringify(__env.keycloakConfig, null, " "); - kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_current"); - - $scope.initCodeEditor(); - - $scope.onChangeKeycloakConfig(); - - $scope.$digest(); - }; - - $scope.initCodeEditor = function(){ - $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("keycloakConfigEditor"), { - lineNumbers: true, - autoRefresh:true, - mode: "application/json", - gutters: ["CodeMirror-lint-markers"], - lint: { - "getAnnotations": $scope.validateCode, - "async": true - } - }); - - $scope.codeMirrorEditor.setSize(null, 220); - - $scope.codeMirrorEditor.on('change',function(cMirror){ - // get value right from instance - $scope.keycloakConfigTmp = $scope.codeMirrorEditor.getValue(); - }); - - $scope.codeMirrorEditor.setValue($scope.keycloakConfigCurrent); - }; - - $scope.validateCode = function(cm, updateLinting, options){ - // call the built in css linter from addon/lint/css-lint.js - try { - $scope.lintingIssues = CodeMirror.lint.json(cm, options); - - updateLinting($scope.lintingIssues); - } catch (error) { - console.error("Error while linting keycloak config json code. Error is: \n" + error); - } - - $scope.onChangeKeycloakConfig(); - - }; - - $scope.isConfigSettingInvalid = function(configString){ - var isInvalid = true; - - isInvalid = ! $scope.keywordsInConfig.every(keyword => configString.includes(keyword)); - $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => ! configString.includes(keyword)); - $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); - - if ($scope.lintingIssues && $scope.lintingIssues.length > 0){ - isInvalid = true; - } - - return isInvalid; - - }; - - $scope.resetDefaultConfig = async function(){ - await $http.get('./config/keycloak_backup.json', {'responseType': 'json'}).then(function (response) { - $scope.keycloakConfigTmp = JSON.stringify(response.data, null, " "); - $scope.keycloakConfigCurrent = JSON.stringify(response.data, null, " "); - $scope.keycloakConfigNew = JSON.stringify(response.data, null, " "); - }); - - $scope.onChangeKeycloakConfig(); - - // update config on server - $scope.editKeycloakConfig(); - - $scope.codeMirrorEditor.setValue($scope.keycloakConfigCurrent); - }; - - $scope.onChangeKeycloakConfig = function(){ - // check by searching for keywords - - var configString = $scope.keycloakConfigTmp; - - if(typeof configString === 'object' && configString !== null){ - configString = JSON.stringify(configString, null, " "); - } - - $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); - - $timeout(function(){ - $scope.keycloakConfigNew = configString; - }); - - $timeout(function(){ - // kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_new"); - document.getElementById('keycloakConfig_new').innerHTML = - PR.prettyPrintOne($scope.keycloakConfigNew, - 'javascript', true); - }, 250); - - $timeout(function(){ - $scope.$digest(); - }); - }; - - $scope.init(); - - $scope.editKeycloakConfig = async function(){ - $timeout(function () { - $scope.loadingData = true; - }); - - $scope.errorMessagePart = undefined; - - try { - var addConfigResponse = await kommonitorConfigStorageService.postKeycloakConfig($scope.keycloakConfigTmp); - - var newCurrentConfig = await kommonitorConfigStorageService.getKeycloakConfig(); - $timeout(function(){ - $scope.keycloakConfigCurrent = JSON.stringify(newCurrentConfig, null, " "); - }); - - $timeout(function(){ - // kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_new"); - document.getElementById('keycloakConfig_current').innerHTML = - PR.prettyPrintOne($scope.keycloakConfigCurrent, - 'javascript', true); - }, 250); - - $("#keycloakConfigEditSuccessAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } catch (error) { - if (error.data) { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#keycloakConfigEditErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - - }; - - $scope.hideSuccessAlert = function () { - $("#keycloakConfigEditSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function () { - $("#keycloakConfigEditErrorAlert").hide(); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function KeycloakConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.codeMirrorEditor = undefined; + $scope.missingRequiredParameters = []; + $scope.missingRequiredParameters_string = ""; + $scope.keywordsInConfig = ["realm", "auth-server-url", "http", "/auth", "resource", "ssl-required", "public-client", "confidential-port"]; + $scope.keycloakConfigTemplate = undefined; + $scope.keycloakConfigTmp = undefined; + $scope.keycloakConfigCurrent = undefined; + $scope.keycloakConfigNew = undefined; + $scope.configSettingInvalid = false; + $scope.init = async function () { + await $http.get('./config/keycloak_backup_withComments.txt', { 'responseType': 'text' }).then(function (response) { + // $scope.keycloakConfigTemplate = JSON.stringify(response.data, null, " "); + $scope.keycloakConfigTemplate = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_backupTemplate"); + }); + // set in app.js + $scope.keycloakConfigTmp = JSON.stringify(__env.keycloakConfig, null, " "); + $scope.keycloakConfigCurrent = JSON.stringify(__env.keycloakConfig, null, " "); + $scope.keycloakConfigNew = JSON.stringify(__env.keycloakConfig, null, " "); + kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_current"); + $scope.initCodeEditor(); + $scope.onChangeKeycloakConfig(); + $scope.$digest(); + }; + $scope.initCodeEditor = function () { + $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("keycloakConfigEditor"), { + lineNumbers: true, + autoRefresh: true, + mode: "application/json", + gutters: ["CodeMirror-lint-markers"], + lint: { + "getAnnotations": $scope.validateCode, + "async": true + } + }); + $scope.codeMirrorEditor.setSize(null, 220); + $scope.codeMirrorEditor.on('change', function (cMirror) { + // get value right from instance + $scope.keycloakConfigTmp = $scope.codeMirrorEditor.getValue(); + }); + $scope.codeMirrorEditor.setValue($scope.keycloakConfigCurrent); + }; + $scope.validateCode = function (cm, updateLinting, options) { + // call the built in css linter from addon/lint/css-lint.js + try { + $scope.lintingIssues = CodeMirror.lint.json(cm, options); + updateLinting($scope.lintingIssues); + } + catch (error) { + console.error("Error while linting keycloak config json code. Error is: \n" + error); + } + $scope.onChangeKeycloakConfig(); + }; + $scope.isConfigSettingInvalid = function (configString) { + var isInvalid = true; + isInvalid = !$scope.keywordsInConfig.every(keyword => configString.includes(keyword)); + $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => !configString.includes(keyword)); + $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); + if ($scope.lintingIssues && $scope.lintingIssues.length > 0) { + isInvalid = true; + } + return isInvalid; + }; + $scope.resetDefaultConfig = async function () { + await $http.get('./config/keycloak_backup.json', { 'responseType': 'json' }).then(function (response) { + $scope.keycloakConfigTmp = JSON.stringify(response.data, null, " "); + $scope.keycloakConfigCurrent = JSON.stringify(response.data, null, " "); + $scope.keycloakConfigNew = JSON.stringify(response.data, null, " "); + }); + $scope.onChangeKeycloakConfig(); + // update config on server + $scope.editKeycloakConfig(); + $scope.codeMirrorEditor.setValue($scope.keycloakConfigCurrent); + }; + $scope.onChangeKeycloakConfig = function () { + // check by searching for keywords + var configString = $scope.keycloakConfigTmp; + if (typeof configString === 'object' && configString !== null) { + configString = JSON.stringify(configString, null, " "); + } + $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); + $timeout(function () { + $scope.keycloakConfigNew = configString; + }); + $timeout(function () { + // kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_new"); + document.getElementById('keycloakConfig_new').innerHTML = + PR.prettyPrintOne($scope.keycloakConfigNew, 'javascript', true); + }, 250); + $timeout(function () { + $scope.$digest(); + }); + }; + $scope.init(); + $scope.editKeycloakConfig = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.errorMessagePart = undefined; + try { + var addConfigResponse = await kommonitorConfigStorageService.postKeycloakConfig($scope.keycloakConfigTmp); + var newCurrentConfig = await kommonitorConfigStorageService.getKeycloakConfig(); + $timeout(function () { + $scope.keycloakConfigCurrent = JSON.stringify(newCurrentConfig, null, " "); + }); + $timeout(function () { + // kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_new"); + document.getElementById('keycloakConfig_current').innerHTML = + PR.prettyPrintOne($scope.keycloakConfigCurrent, 'javascript', true); + }, 250); + $("#keycloakConfigEditSuccessAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#keycloakConfigEditErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + }; + $scope.hideSuccessAlert = function () { + $("#keycloakConfigEditSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#keycloakConfigEditErrorAlert").hide(); + }; + } + ] }); +//# sourceMappingURL=admin-keycloak-config.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.js.map b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.js.map new file mode 100644 index 000000000..68f390ec5 --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-keycloak-config.component.js","sourceRoot":"","sources":["admin-keycloak-config.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.ts b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.ts new file mode 100644 index 000000000..04eb90eda --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.component.ts @@ -0,0 +1,197 @@ +angular.module('adminKeycloakConfig').component('adminKeycloakConfig', { + templateUrl: "components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', 'kommonitorConfigStorageService', '$scope', '$rootScope', '__env', '$http', '$timeout', function KeycloakConfigController(kommonitorDataExchangeService, kommonitorScriptHelperService, kommonitorConfigStorageService, $scope, $rootScope, __env, $http, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + $scope.codeMirrorEditor = undefined; + + $scope.missingRequiredParameters = []; + $scope.missingRequiredParameters_string = ""; + + $scope.keywordsInConfig = ["realm", "auth-server-url", "http", "/auth", "resource", "ssl-required", "public-client", "confidential-port"]; + + $scope.keycloakConfigTemplate = undefined; + $scope.keycloakConfigTmp = undefined; + $scope.keycloakConfigCurrent = undefined; + $scope.keycloakConfigNew = undefined; + + $scope.configSettingInvalid = false; + + $scope.init = async function(){ + await $http.get('./config/keycloak_backup_withComments.txt', {'responseType': 'text'}).then(function (response) { + // $scope.keycloakConfigTemplate = JSON.stringify(response.data, null, " "); + $scope.keycloakConfigTemplate = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_backupTemplate"); + }); + + // set in app.js + $scope.keycloakConfigTmp = JSON.stringify(__env.keycloakConfig, null, " "); + $scope.keycloakConfigCurrent = JSON.stringify(__env.keycloakConfig, null, " "); + $scope.keycloakConfigNew = JSON.stringify(__env.keycloakConfig, null, " "); + kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_current"); + + $scope.initCodeEditor(); + + $scope.onChangeKeycloakConfig(); + + $scope.$digest(); + }; + + $scope.initCodeEditor = function(){ + $scope.codeMirrorEditor = CodeMirror.fromTextArea(document.getElementById("keycloakConfigEditor"), { + lineNumbers: true, + autoRefresh:true, + mode: "application/json", + gutters: ["CodeMirror-lint-markers"], + lint: { + "getAnnotations": $scope.validateCode, + "async": true + } + }); + + $scope.codeMirrorEditor.setSize(null, 220); + + $scope.codeMirrorEditor.on('change',function(cMirror){ + // get value right from instance + $scope.keycloakConfigTmp = $scope.codeMirrorEditor.getValue(); + }); + + $scope.codeMirrorEditor.setValue($scope.keycloakConfigCurrent); + }; + + $scope.validateCode = function(cm, updateLinting, options){ + // call the built in css linter from addon/lint/css-lint.js + try { + $scope.lintingIssues = CodeMirror.lint.json(cm, options); + + updateLinting($scope.lintingIssues); + } catch (error) { + console.error("Error while linting keycloak config json code. Error is: \n" + error); + } + + $scope.onChangeKeycloakConfig(); + + }; + + $scope.isConfigSettingInvalid = function(configString){ + var isInvalid = true; + + isInvalid = ! $scope.keywordsInConfig.every(keyword => configString.includes(keyword)); + $scope.missingRequiredParameters = $scope.keywordsInConfig.filter(keyword => ! configString.includes(keyword)); + $scope.missingRequiredParameters_string = JSON.stringify($scope.missingRequiredParameters); + + if ($scope.lintingIssues && $scope.lintingIssues.length > 0){ + isInvalid = true; + } + + return isInvalid; + + }; + + $scope.resetDefaultConfig = async function(){ + await $http.get('./config/keycloak_backup.json', {'responseType': 'json'}).then(function (response) { + $scope.keycloakConfigTmp = JSON.stringify(response.data, null, " "); + $scope.keycloakConfigCurrent = JSON.stringify(response.data, null, " "); + $scope.keycloakConfigNew = JSON.stringify(response.data, null, " "); + }); + + $scope.onChangeKeycloakConfig(); + + // update config on server + $scope.editKeycloakConfig(); + + $scope.codeMirrorEditor.setValue($scope.keycloakConfigCurrent); + }; + + $scope.onChangeKeycloakConfig = function(){ + // check by searching for keywords + + var configString = $scope.keycloakConfigTmp; + + if(typeof configString === 'object' && configString !== null){ + configString = JSON.stringify(configString, null, " "); + } + + $scope.configSettingInvalid = $scope.isConfigSettingInvalid(configString); + + $timeout(function(){ + $scope.keycloakConfigNew = configString; + }); + + $timeout(function(){ + // kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_new"); + document.getElementById('keycloakConfig_new').innerHTML = + PR.prettyPrintOne($scope.keycloakConfigNew, + 'javascript', true); + }, 250); + + $timeout(function(){ + $scope.$digest(); + }); + }; + + $scope.init(); + + $scope.editKeycloakConfig = async function(){ + $timeout(function () { + $scope.loadingData = true; + }); + + $scope.errorMessagePart = undefined; + + try { + var addConfigResponse = await kommonitorConfigStorageService.postKeycloakConfig($scope.keycloakConfigTmp); + + var newCurrentConfig = await kommonitorConfigStorageService.getKeycloakConfig(); + $timeout(function(){ + $scope.keycloakConfigCurrent = JSON.stringify(newCurrentConfig, null, " "); + }); + + $timeout(function(){ + // kommonitorScriptHelperService.prettifyScriptCodePreview("keycloakConfig_new"); + document.getElementById('keycloakConfig_current').innerHTML = + PR.prettyPrintOne($scope.keycloakConfigCurrent, + 'javascript', true); + }, 250); + + $("#keycloakConfigEditSuccessAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#keycloakConfigEditErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + + }; + + $scope.hideSuccessAlert = function () { + $("#keycloakConfigEditSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function () { + $("#keycloakConfigEditErrorAlert").hide(); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.js b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.js index 7ac2d441a..4d3160ad3 100644 --- a/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.js +++ b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminKeycloakConfig', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'kommonitorConfigStorage']); +//# sourceMappingURL=admin-keycloak-config.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.js.map b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.js.map new file mode 100644 index 000000000..4c2c77c86 --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-keycloak-config.module.js","sourceRoot":"","sources":["admin-keycloak-config.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,yBAAyB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.ts b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.ts new file mode 100644 index 000000000..7ac2d441a --- /dev/null +++ b/app/components/kommonitorAdmin/adminConfig/adminKeycloakConfig/admin-keycloak-config.module.ts @@ -0,0 +1 @@ +angular.module('adminKeycloakConfig', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'kommonitorConfigStorage']); diff --git a/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.js b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.js index 852489c88..5c72e0a1d 100644 --- a/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.js +++ b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.js @@ -1,384 +1,318 @@ +"use strict"; angular.module('adminDashboardManagement').component('adminDashboardManagement', { - templateUrl : "components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$timeout', '$rootScope', '__env', '$http', - function DashboardManagementController(kommonitorDataExchangeService, $scope, $timeout, $rootScope, __env, $http) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.loadingData = true; - - $scope.kommonitorDataExchangeService = kommonitorDataExchangeService; - - $scope.numberOfMainTopics = 0; - $scope.numberOfSubTopics = 0; - - $scope.pieChartTooltip = { - trigger: 'item', - confine: 'true', - formatter: "{a}
{b} : {c} ({d}%)", - textStyle: { - fontSize: 12 - } - }; - - $scope.pieChartLabel = { - normal: { - position: 'inside', - fontSize: 12 - } - }; - - $scope.indicatorsPerTopicChart = echarts.init(document.getElementById('indicatorsPerTopicDiagram')); - $scope.indicatorsPerTopicChartOptions; - $scope.indicatorsPerTopicChart.showLoading(); - - $scope.georesourcesPerTypeChart = echarts.init(document.getElementById('georesourcesPerTypeDiagram')); - $scope.georesourcesPerTypeChartOptions; - $scope.georesourcesPerTypeChart.showLoading(); - - $scope.indicatorsPerSpatialUnitChart = echarts.init(document.getElementById('indicatorsPerSpatialUnitDiagram')); - $scope.indicatorsPerSpatialUnitChartOptions; - $scope.indicatorsPerSpatialUnitChart.showLoading(); - - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $(window).on('resize', function(){ - - if($scope.indicatorsPerTopicChart != null && $scope.indicatorsPerTopicChart != undefined){ - $scope.indicatorsPerTopicChart.resize(); - } - - if($scope.georesourcesPerTypeChart != null && $scope.georesourcesPerTypeChart != undefined){ - $scope.georesourcesPerTypeChart.resize(); - } - - if($scope.indicatorsPerSpatialUnitChart != null && $scope.indicatorsPerSpatialUnitChart != undefined){ - $scope.indicatorsPerSpatialUnitChart.resize(); - } - }); - - $scope.$on("refreshAdminDashboardDiagrams", function (event) { - - console.log("refresh admin charts"); - - $scope.refreshAdminDashboardDiagrams(); - - }); - - $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { - - $scope.loadingData = false; - - }); - - $scope.$on("initialMetadataLoadingCompleted", function (event) { - - console.log("refresh admin overview"); - - $timeout(function(){ - - $scope.refreshAdminDashboardDiagrams(); - }, 250); - - }); - - $scope.refreshAdminDashboardDiagrams = function(){ - var mainTopics = []; - var subTopics = []; - - kommonitorDataExchangeService.availableTopics.forEach(function(topic){ - if(topic.topicType === 'main'){ - mainTopics.push(topic); - } - }); - - subTopics = $scope.addSubTopics(mainTopics, subTopics); - - $scope.numberOfMainTopics = mainTopics.length; - $scope.numberOfSubTopics = subTopics.length - - $scope.updateCharts(); - - $scope.loadingData = false; - }; - - $scope.addSubTopics = function(mainTopics, subTopics){ - for (const mainTopic of mainTopics) { - if(mainTopic.subTopics && mainTopic.subTopics.length > 0){ - for (const subTopic of mainTopic.subTopics) { - subTopics.push(subTopic); - if(subTopic.subTopics && subTopic.subTopics.length > 0){ - subTopics = $scope.addSubTopics(subTopic.subTopics, subTopics); - } - } - } - } - - return subTopics; - }; - - $scope.updateCharts = function(){ - - $scope.updateIndicatorsPerTopicChart(); - - $scope.updateGeoresourcesPerTypeChart(); - - $scope.updateIndicatorsPerSpatialUnitChart(); - }; - - // INDICATORS PER TOPIC - - $scope.updateIndicatorsPerTopicChart = function(){ - - $scope.indicatorsPerTopicChart.showLoading(); - - var indicatorsPerTopicSeriesData = []; - - //sorted alphabetically - kommonitorDataExchangeService.topicIndicatorHierarchy.forEach(function(mainTopic){ - if(mainTopic.indicatorCount > 0){ - indicatorsPerTopicSeriesData.push({ - name: mainTopic.topicName, - value: mainTopic.indicatorCount - }); - } - }); - - $scope.indicatorsPerTopicChartOptions = { - // grid get rid of whitespace around chart - // grid: { - // left: '7%', - // top: 32, - // right: '5%', - // bottom: 55 - // }, - title: { - text: 'Indikatoren \npro Themenbereich', - left: 'center', - show: true, - top: 15, - fontSize: 12 - }, - tooltip: $scope.pieChartTooltip, - series : [ - { - name: 'Indikatoren pro Themenbereich', - type: 'pie', - //roseType: 'radius', - radius : '90%', - center: ['50%', '50%'], - data: indicatorsPerTopicSeriesData, - itemStyle: { - normal: { - color: '#00a65b', - shadowBlur: 20, - shadowColor: 'rgba(0, 0, 0, 0.5)' - }, - emphasis: { - shadowBlur: 10, - shadowOffsetX: 0, - shadowColor: 'rgba(0, 0, 0, 0.5)' - } - }, - label: $scope.pieChartLabel - } - ] - }; - // end of chart options - - $scope.indicatorsPerTopicChart.setOption($scope.indicatorsPerTopicChartOptions); - $scope.indicatorsPerTopicChart.hideLoading(); - }; - - // GEORESOURCES PER TOPIC - - $scope.updateGeoresourcesPerTypeChart = function(){ - - $scope.georesourcesPerTypeChart.showLoading(); - - var georesourcesPerTypeMap = new Map(); - - kommonitorDataExchangeService.availableGeoresources.forEach(function(georesource){ - var georesourceType = "POI"; - if(georesource.isLOI){ - georesourceType = "LOI"; - } - else if(georesource.isAOI){ - georesourceType = "AOI"; - } - - if(georesourcesPerTypeMap.has(georesourceType)){ - // increment by 1 - georesourcesPerTypeMap.set(georesourceType, georesourcesPerTypeMap.get(georesourceType) + 1); - } - else{ - georesourcesPerTypeMap.set(georesourceType, 1); - } - }); - - var georesourcesPerTypeSeriesData = []; - - if(georesourcesPerTypeMap.has("POI")){ - georesourcesPerTypeSeriesData.push({ - name: "Points of Interest", - value: georesourcesPerTypeMap.get("POI") - }); - } - if(georesourcesPerTypeMap.has("LOI")){ - georesourcesPerTypeSeriesData.push({ - name: "Lines of Interest", - value: georesourcesPerTypeMap.get("LOI") - }); - } - if(georesourcesPerTypeMap.has("AOI")){ - georesourcesPerTypeSeriesData.push({ - name: "Areas of Interest", - value: georesourcesPerTypeMap.get("AOI") - }); - } - - $scope.georesourcesPerTypeChartOptions = { - // grid get rid of whitespace around chart - // grid: { - // left: '7%', - // top: 32, - // right: '5%', - // bottom: 55 - // }, - title: { - text: 'Georessourcen \npro Typ', - left: 'center', - show: true, - top: 15, - fontSize: 12 - }, - tooltip: $scope.pieChartTooltip, - series : [ - { - name: 'Georessourcen pro Typ', - type: 'pie', - //roseType: 'radius', - radius : '90%', - center: ['50%', '50%'], - data: georesourcesPerTypeSeriesData, - itemStyle: { - normal: { - color: '#ff851b', - shadowBlur: 20, - shadowColor: 'rgba(0, 0, 0, 0.5)' - }, - emphasis: { - shadowBlur: 10, - shadowOffsetX: 0, - shadowColor: 'rgba(0, 0, 0, 0.5)' - } - }, - label: $scope.pieChartLabel - } - ] - }; - // end of chart options - - $scope.georesourcesPerTypeChart.setOption($scope.georesourcesPerTypeChartOptions); - $scope.georesourcesPerTypeChart.hideLoading(); - }; - - // INDICATORS PER SPATIAL UNIT - - $scope.updateIndicatorsPerSpatialUnitChart = function(){ - - $scope.indicatorsPerSpatialUnitChart.showLoading(); - - var indicatorsPerSpatialUnitMap = new Map(); - - kommonitorDataExchangeService.availableIndicators.forEach(function(indicator){ - indicator.applicableSpatialUnits.forEach(function(applicableSpatialUnit){ - - var spatialUnitName = applicableSpatialUnit.spatialUnitName; - - if(indicatorsPerSpatialUnitMap.has(spatialUnitName)){ - // increment by 1 - indicatorsPerSpatialUnitMap.set(spatialUnitName, indicatorsPerSpatialUnitMap.get(spatialUnitName) + 1); - } - else{ - indicatorsPerSpatialUnitMap.set(spatialUnitName, 1); - } - }); - }); - - var indicatorsPerSpatialUnitSeriesData = []; - - //sorted by spatial unit size - kommonitorDataExchangeService.availableSpatialUnits.forEach(function(spatialUnit){ - if(indicatorsPerSpatialUnitMap.has(spatialUnit.spatialUnitLevel)){ - indicatorsPerSpatialUnitSeriesData.push({ - name: spatialUnit.spatialUnitLevel, - value: indicatorsPerSpatialUnitMap.get(spatialUnit.spatialUnitLevel) - }); - } - }); - - $scope.indicatorsPerSpatialUnitChartOptions = { - // grid get rid of whitespace around chart - // grid: { - // left: '7%', - // top: 32, - // right: '5%', - // bottom: 55 - // }, - title: { - text: 'Indikatoren \npro Raumeinheit', - left: 'center', - show: true, - top: 15, - fontSize: 12 - }, - tooltip: $scope.pieChartTooltip, - series : [ - { - name: 'Indikatoren pro Raumeinheit', - type: 'pie', - //roseType: 'radius', - radius : '90%', - center: ['50%', '50%'], - data: indicatorsPerSpatialUnitSeriesData, - itemStyle: { - normal: { - color: '#00a65b', - shadowBlur: 20, - shadowColor: 'rgba(0, 0, 0, 0.5)' - }, - emphasis: { - shadowBlur: 10, - shadowOffsetX: 0, - shadowColor: 'rgba(0, 0, 0, 0.5)' - } - }, - label: $scope.pieChartLabel - } - ] - }; - // end of chart options - - $scope.indicatorsPerSpatialUnitChart.setOption($scope.indicatorsPerSpatialUnitChartOptions); - $scope.indicatorsPerSpatialUnitChart.hideLoading(); - }; - - // when ready check if required metadat was already fetched - // $( document ).ready(function() { - // if (kommonitorDataExchangeService.availableRoles.length > 0){ - // // we already have required data. hide loading icon - // $scope.updateCharts(); - // $scope.loadingData = false; - // } - // else{ - // // we wait for required data. show loading icon - // console.log("fetching all required metadata"); - // $scope.loadingData = true; - // } - // }); - - } -]}); + templateUrl: "components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function DashboardManagementController(kommonitorDataExchangeService, $scope, $timeout, $rootScope, __env, $http) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.loadingData = true; + $scope.kommonitorDataExchangeService = kommonitorDataExchangeService; + $scope.numberOfMainTopics = 0; + $scope.numberOfSubTopics = 0; + $scope.pieChartTooltip = { + trigger: 'item', + confine: 'true', + formatter: "{a}
{b} : {c} ({d}%)", + textStyle: { + fontSize: 12 + } + }; + $scope.pieChartLabel = { + normal: { + position: 'inside', + fontSize: 12 + } + }; + $scope.indicatorsPerTopicChart = echarts.init(document.getElementById('indicatorsPerTopicDiagram')); + $scope.indicatorsPerTopicChartOptions; + $scope.indicatorsPerTopicChart.showLoading(); + $scope.georesourcesPerTypeChart = echarts.init(document.getElementById('georesourcesPerTypeDiagram')); + $scope.georesourcesPerTypeChartOptions; + $scope.georesourcesPerTypeChart.showLoading(); + $scope.indicatorsPerSpatialUnitChart = echarts.init(document.getElementById('indicatorsPerSpatialUnitDiagram')); + $scope.indicatorsPerSpatialUnitChartOptions; + $scope.indicatorsPerSpatialUnitChart.showLoading(); + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $(window).on('resize', function () { + if ($scope.indicatorsPerTopicChart != null && $scope.indicatorsPerTopicChart != undefined) { + $scope.indicatorsPerTopicChart.resize(); + } + if ($scope.georesourcesPerTypeChart != null && $scope.georesourcesPerTypeChart != undefined) { + $scope.georesourcesPerTypeChart.resize(); + } + if ($scope.indicatorsPerSpatialUnitChart != null && $scope.indicatorsPerSpatialUnitChart != undefined) { + $scope.indicatorsPerSpatialUnitChart.resize(); + } + }); + $scope.$on("refreshAdminDashboardDiagrams", function (event) { + console.log("refresh admin charts"); + $scope.refreshAdminDashboardDiagrams(); + }); + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + $scope.loadingData = false; + }); + $scope.$on("initialMetadataLoadingCompleted", function (event) { + console.log("refresh admin overview"); + $timeout(function () { + $scope.refreshAdminDashboardDiagrams(); + }, 250); + }); + $scope.refreshAdminDashboardDiagrams = function () { + var mainTopics = []; + var subTopics = []; + kommonitorDataExchangeService.availableTopics.forEach(function (topic) { + if (topic.topicType === 'main') { + mainTopics.push(topic); + } + }); + subTopics = $scope.addSubTopics(mainTopics, subTopics); + $scope.numberOfMainTopics = mainTopics.length; + $scope.numberOfSubTopics = subTopics.length; + $scope.updateCharts(); + $scope.loadingData = false; + }; + $scope.addSubTopics = function (mainTopics, subTopics) { + for (const mainTopic of mainTopics) { + if (mainTopic.subTopics && mainTopic.subTopics.length > 0) { + for (const subTopic of mainTopic.subTopics) { + subTopics.push(subTopic); + if (subTopic.subTopics && subTopic.subTopics.length > 0) { + subTopics = $scope.addSubTopics(subTopic.subTopics, subTopics); + } + } + } + } + return subTopics; + }; + $scope.updateCharts = function () { + $scope.updateIndicatorsPerTopicChart(); + $scope.updateGeoresourcesPerTypeChart(); + $scope.updateIndicatorsPerSpatialUnitChart(); + }; + // INDICATORS PER TOPIC + $scope.updateIndicatorsPerTopicChart = function () { + $scope.indicatorsPerTopicChart.showLoading(); + var indicatorsPerTopicSeriesData = []; + //sorted alphabetically + kommonitorDataExchangeService.topicIndicatorHierarchy.forEach(function (mainTopic) { + if (mainTopic.indicatorCount > 0) { + indicatorsPerTopicSeriesData.push({ + name: mainTopic.topicName, + value: mainTopic.indicatorCount + }); + } + }); + $scope.indicatorsPerTopicChartOptions = { + // grid get rid of whitespace around chart + // grid: { + // left: '7%', + // top: 32, + // right: '5%', + // bottom: 55 + // }, + title: { + text: 'Indikatoren \npro Themenbereich', + left: 'center', + show: true, + top: 15, + fontSize: 12 + }, + tooltip: $scope.pieChartTooltip, + series: [ + { + name: 'Indikatoren pro Themenbereich', + type: 'pie', + //roseType: 'radius', + radius: '90%', + center: ['50%', '50%'], + data: indicatorsPerTopicSeriesData, + itemStyle: { + normal: { + color: '#00a65b', + shadowBlur: 20, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + }, + label: $scope.pieChartLabel + } + ] + }; + // end of chart options + $scope.indicatorsPerTopicChart.setOption($scope.indicatorsPerTopicChartOptions); + $scope.indicatorsPerTopicChart.hideLoading(); + }; + // GEORESOURCES PER TOPIC + $scope.updateGeoresourcesPerTypeChart = function () { + $scope.georesourcesPerTypeChart.showLoading(); + var georesourcesPerTypeMap = new Map(); + kommonitorDataExchangeService.availableGeoresources.forEach(function (georesource) { + var georesourceType = "POI"; + if (georesource.isLOI) { + georesourceType = "LOI"; + } + else if (georesource.isAOI) { + georesourceType = "AOI"; + } + if (georesourcesPerTypeMap.has(georesourceType)) { + // increment by 1 + georesourcesPerTypeMap.set(georesourceType, georesourcesPerTypeMap.get(georesourceType) + 1); + } + else { + georesourcesPerTypeMap.set(georesourceType, 1); + } + }); + var georesourcesPerTypeSeriesData = []; + if (georesourcesPerTypeMap.has("POI")) { + georesourcesPerTypeSeriesData.push({ + name: "Points of Interest", + value: georesourcesPerTypeMap.get("POI") + }); + } + if (georesourcesPerTypeMap.has("LOI")) { + georesourcesPerTypeSeriesData.push({ + name: "Lines of Interest", + value: georesourcesPerTypeMap.get("LOI") + }); + } + if (georesourcesPerTypeMap.has("AOI")) { + georesourcesPerTypeSeriesData.push({ + name: "Areas of Interest", + value: georesourcesPerTypeMap.get("AOI") + }); + } + $scope.georesourcesPerTypeChartOptions = { + // grid get rid of whitespace around chart + // grid: { + // left: '7%', + // top: 32, + // right: '5%', + // bottom: 55 + // }, + title: { + text: 'Georessourcen \npro Typ', + left: 'center', + show: true, + top: 15, + fontSize: 12 + }, + tooltip: $scope.pieChartTooltip, + series: [ + { + name: 'Georessourcen pro Typ', + type: 'pie', + //roseType: 'radius', + radius: '90%', + center: ['50%', '50%'], + data: georesourcesPerTypeSeriesData, + itemStyle: { + normal: { + color: '#ff851b', + shadowBlur: 20, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + }, + label: $scope.pieChartLabel + } + ] + }; + // end of chart options + $scope.georesourcesPerTypeChart.setOption($scope.georesourcesPerTypeChartOptions); + $scope.georesourcesPerTypeChart.hideLoading(); + }; + // INDICATORS PER SPATIAL UNIT + $scope.updateIndicatorsPerSpatialUnitChart = function () { + $scope.indicatorsPerSpatialUnitChart.showLoading(); + var indicatorsPerSpatialUnitMap = new Map(); + kommonitorDataExchangeService.availableIndicators.forEach(function (indicator) { + indicator.applicableSpatialUnits.forEach(function (applicableSpatialUnit) { + var spatialUnitName = applicableSpatialUnit.spatialUnitName; + if (indicatorsPerSpatialUnitMap.has(spatialUnitName)) { + // increment by 1 + indicatorsPerSpatialUnitMap.set(spatialUnitName, indicatorsPerSpatialUnitMap.get(spatialUnitName) + 1); + } + else { + indicatorsPerSpatialUnitMap.set(spatialUnitName, 1); + } + }); + }); + var indicatorsPerSpatialUnitSeriesData = []; + //sorted by spatial unit size + kommonitorDataExchangeService.availableSpatialUnits.forEach(function (spatialUnit) { + if (indicatorsPerSpatialUnitMap.has(spatialUnit.spatialUnitLevel)) { + indicatorsPerSpatialUnitSeriesData.push({ + name: spatialUnit.spatialUnitLevel, + value: indicatorsPerSpatialUnitMap.get(spatialUnit.spatialUnitLevel) + }); + } + }); + $scope.indicatorsPerSpatialUnitChartOptions = { + // grid get rid of whitespace around chart + // grid: { + // left: '7%', + // top: 32, + // right: '5%', + // bottom: 55 + // }, + title: { + text: 'Indikatoren \npro Raumeinheit', + left: 'center', + show: true, + top: 15, + fontSize: 12 + }, + tooltip: $scope.pieChartTooltip, + series: [ + { + name: 'Indikatoren pro Raumeinheit', + type: 'pie', + //roseType: 'radius', + radius: '90%', + center: ['50%', '50%'], + data: indicatorsPerSpatialUnitSeriesData, + itemStyle: { + normal: { + color: '#00a65b', + shadowBlur: 20, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + }, + label: $scope.pieChartLabel + } + ] + }; + // end of chart options + $scope.indicatorsPerSpatialUnitChart.setOption($scope.indicatorsPerSpatialUnitChartOptions); + $scope.indicatorsPerSpatialUnitChart.hideLoading(); + }; + // when ready check if required metadat was already fetched + // $( document ).ready(function() { + // if (kommonitorDataExchangeService.availableRoles.length > 0){ + // // we already have required data. hide loading icon + // $scope.updateCharts(); + // $scope.loadingData = false; + // } + // else{ + // // we wait for required data. show loading icon + // console.log("fetching all required metadata"); + // $scope.loadingData = true; + // } + // }); + } + ] +}); +//# sourceMappingURL=admin-dashboard-management.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.js.map b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.js.map new file mode 100644 index 000000000..a5a6b1b74 --- /dev/null +++ b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-dashboard-management.component.js","sourceRoot":"","sources":["admin-dashboard-management.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.ts b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.ts new file mode 100644 index 000000000..852489c88 --- /dev/null +++ b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.component.ts @@ -0,0 +1,384 @@ +angular.module('adminDashboardManagement').component('adminDashboardManagement', { + templateUrl : "components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function DashboardManagementController(kommonitorDataExchangeService, $scope, $timeout, $rootScope, __env, $http) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.loadingData = true; + + $scope.kommonitorDataExchangeService = kommonitorDataExchangeService; + + $scope.numberOfMainTopics = 0; + $scope.numberOfSubTopics = 0; + + $scope.pieChartTooltip = { + trigger: 'item', + confine: 'true', + formatter: "{a}
{b} : {c} ({d}%)", + textStyle: { + fontSize: 12 + } + }; + + $scope.pieChartLabel = { + normal: { + position: 'inside', + fontSize: 12 + } + }; + + $scope.indicatorsPerTopicChart = echarts.init(document.getElementById('indicatorsPerTopicDiagram')); + $scope.indicatorsPerTopicChartOptions; + $scope.indicatorsPerTopicChart.showLoading(); + + $scope.georesourcesPerTypeChart = echarts.init(document.getElementById('georesourcesPerTypeDiagram')); + $scope.georesourcesPerTypeChartOptions; + $scope.georesourcesPerTypeChart.showLoading(); + + $scope.indicatorsPerSpatialUnitChart = echarts.init(document.getElementById('indicatorsPerSpatialUnitDiagram')); + $scope.indicatorsPerSpatialUnitChartOptions; + $scope.indicatorsPerSpatialUnitChart.showLoading(); + + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $(window).on('resize', function(){ + + if($scope.indicatorsPerTopicChart != null && $scope.indicatorsPerTopicChart != undefined){ + $scope.indicatorsPerTopicChart.resize(); + } + + if($scope.georesourcesPerTypeChart != null && $scope.georesourcesPerTypeChart != undefined){ + $scope.georesourcesPerTypeChart.resize(); + } + + if($scope.indicatorsPerSpatialUnitChart != null && $scope.indicatorsPerSpatialUnitChart != undefined){ + $scope.indicatorsPerSpatialUnitChart.resize(); + } + }); + + $scope.$on("refreshAdminDashboardDiagrams", function (event) { + + console.log("refresh admin charts"); + + $scope.refreshAdminDashboardDiagrams(); + + }); + + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + + $scope.loadingData = false; + + }); + + $scope.$on("initialMetadataLoadingCompleted", function (event) { + + console.log("refresh admin overview"); + + $timeout(function(){ + + $scope.refreshAdminDashboardDiagrams(); + }, 250); + + }); + + $scope.refreshAdminDashboardDiagrams = function(){ + var mainTopics = []; + var subTopics = []; + + kommonitorDataExchangeService.availableTopics.forEach(function(topic){ + if(topic.topicType === 'main'){ + mainTopics.push(topic); + } + }); + + subTopics = $scope.addSubTopics(mainTopics, subTopics); + + $scope.numberOfMainTopics = mainTopics.length; + $scope.numberOfSubTopics = subTopics.length + + $scope.updateCharts(); + + $scope.loadingData = false; + }; + + $scope.addSubTopics = function(mainTopics, subTopics){ + for (const mainTopic of mainTopics) { + if(mainTopic.subTopics && mainTopic.subTopics.length > 0){ + for (const subTopic of mainTopic.subTopics) { + subTopics.push(subTopic); + if(subTopic.subTopics && subTopic.subTopics.length > 0){ + subTopics = $scope.addSubTopics(subTopic.subTopics, subTopics); + } + } + } + } + + return subTopics; + }; + + $scope.updateCharts = function(){ + + $scope.updateIndicatorsPerTopicChart(); + + $scope.updateGeoresourcesPerTypeChart(); + + $scope.updateIndicatorsPerSpatialUnitChart(); + }; + + // INDICATORS PER TOPIC + + $scope.updateIndicatorsPerTopicChart = function(){ + + $scope.indicatorsPerTopicChart.showLoading(); + + var indicatorsPerTopicSeriesData = []; + + //sorted alphabetically + kommonitorDataExchangeService.topicIndicatorHierarchy.forEach(function(mainTopic){ + if(mainTopic.indicatorCount > 0){ + indicatorsPerTopicSeriesData.push({ + name: mainTopic.topicName, + value: mainTopic.indicatorCount + }); + } + }); + + $scope.indicatorsPerTopicChartOptions = { + // grid get rid of whitespace around chart + // grid: { + // left: '7%', + // top: 32, + // right: '5%', + // bottom: 55 + // }, + title: { + text: 'Indikatoren \npro Themenbereich', + left: 'center', + show: true, + top: 15, + fontSize: 12 + }, + tooltip: $scope.pieChartTooltip, + series : [ + { + name: 'Indikatoren pro Themenbereich', + type: 'pie', + //roseType: 'radius', + radius : '90%', + center: ['50%', '50%'], + data: indicatorsPerTopicSeriesData, + itemStyle: { + normal: { + color: '#00a65b', + shadowBlur: 20, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + }, + label: $scope.pieChartLabel + } + ] + }; + // end of chart options + + $scope.indicatorsPerTopicChart.setOption($scope.indicatorsPerTopicChartOptions); + $scope.indicatorsPerTopicChart.hideLoading(); + }; + + // GEORESOURCES PER TOPIC + + $scope.updateGeoresourcesPerTypeChart = function(){ + + $scope.georesourcesPerTypeChart.showLoading(); + + var georesourcesPerTypeMap = new Map(); + + kommonitorDataExchangeService.availableGeoresources.forEach(function(georesource){ + var georesourceType = "POI"; + if(georesource.isLOI){ + georesourceType = "LOI"; + } + else if(georesource.isAOI){ + georesourceType = "AOI"; + } + + if(georesourcesPerTypeMap.has(georesourceType)){ + // increment by 1 + georesourcesPerTypeMap.set(georesourceType, georesourcesPerTypeMap.get(georesourceType) + 1); + } + else{ + georesourcesPerTypeMap.set(georesourceType, 1); + } + }); + + var georesourcesPerTypeSeriesData = []; + + if(georesourcesPerTypeMap.has("POI")){ + georesourcesPerTypeSeriesData.push({ + name: "Points of Interest", + value: georesourcesPerTypeMap.get("POI") + }); + } + if(georesourcesPerTypeMap.has("LOI")){ + georesourcesPerTypeSeriesData.push({ + name: "Lines of Interest", + value: georesourcesPerTypeMap.get("LOI") + }); + } + if(georesourcesPerTypeMap.has("AOI")){ + georesourcesPerTypeSeriesData.push({ + name: "Areas of Interest", + value: georesourcesPerTypeMap.get("AOI") + }); + } + + $scope.georesourcesPerTypeChartOptions = { + // grid get rid of whitespace around chart + // grid: { + // left: '7%', + // top: 32, + // right: '5%', + // bottom: 55 + // }, + title: { + text: 'Georessourcen \npro Typ', + left: 'center', + show: true, + top: 15, + fontSize: 12 + }, + tooltip: $scope.pieChartTooltip, + series : [ + { + name: 'Georessourcen pro Typ', + type: 'pie', + //roseType: 'radius', + radius : '90%', + center: ['50%', '50%'], + data: georesourcesPerTypeSeriesData, + itemStyle: { + normal: { + color: '#ff851b', + shadowBlur: 20, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + }, + label: $scope.pieChartLabel + } + ] + }; + // end of chart options + + $scope.georesourcesPerTypeChart.setOption($scope.georesourcesPerTypeChartOptions); + $scope.georesourcesPerTypeChart.hideLoading(); + }; + + // INDICATORS PER SPATIAL UNIT + + $scope.updateIndicatorsPerSpatialUnitChart = function(){ + + $scope.indicatorsPerSpatialUnitChart.showLoading(); + + var indicatorsPerSpatialUnitMap = new Map(); + + kommonitorDataExchangeService.availableIndicators.forEach(function(indicator){ + indicator.applicableSpatialUnits.forEach(function(applicableSpatialUnit){ + + var spatialUnitName = applicableSpatialUnit.spatialUnitName; + + if(indicatorsPerSpatialUnitMap.has(spatialUnitName)){ + // increment by 1 + indicatorsPerSpatialUnitMap.set(spatialUnitName, indicatorsPerSpatialUnitMap.get(spatialUnitName) + 1); + } + else{ + indicatorsPerSpatialUnitMap.set(spatialUnitName, 1); + } + }); + }); + + var indicatorsPerSpatialUnitSeriesData = []; + + //sorted by spatial unit size + kommonitorDataExchangeService.availableSpatialUnits.forEach(function(spatialUnit){ + if(indicatorsPerSpatialUnitMap.has(spatialUnit.spatialUnitLevel)){ + indicatorsPerSpatialUnitSeriesData.push({ + name: spatialUnit.spatialUnitLevel, + value: indicatorsPerSpatialUnitMap.get(spatialUnit.spatialUnitLevel) + }); + } + }); + + $scope.indicatorsPerSpatialUnitChartOptions = { + // grid get rid of whitespace around chart + // grid: { + // left: '7%', + // top: 32, + // right: '5%', + // bottom: 55 + // }, + title: { + text: 'Indikatoren \npro Raumeinheit', + left: 'center', + show: true, + top: 15, + fontSize: 12 + }, + tooltip: $scope.pieChartTooltip, + series : [ + { + name: 'Indikatoren pro Raumeinheit', + type: 'pie', + //roseType: 'radius', + radius : '90%', + center: ['50%', '50%'], + data: indicatorsPerSpatialUnitSeriesData, + itemStyle: { + normal: { + color: '#00a65b', + shadowBlur: 20, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + }, + label: $scope.pieChartLabel + } + ] + }; + // end of chart options + + $scope.indicatorsPerSpatialUnitChart.setOption($scope.indicatorsPerSpatialUnitChartOptions); + $scope.indicatorsPerSpatialUnitChart.hideLoading(); + }; + + // when ready check if required metadat was already fetched + // $( document ).ready(function() { + // if (kommonitorDataExchangeService.availableRoles.length > 0){ + // // we already have required data. hide loading icon + // $scope.updateCharts(); + // $scope.loadingData = false; + // } + // else{ + // // we wait for required data. show loading icon + // console.log("fetching all required metadata"); + // $scope.loadingData = true; + // } + // }); + + } +]}); diff --git a/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.js b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.js index 3a3562262..c4f26d4e5 100644 --- a/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.js +++ b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminDashboardManagement', ['kommonitorDataExchange']); +//# sourceMappingURL=admin-dashboard-management.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.js.map b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.js.map new file mode 100644 index 000000000..a69cf89a0 --- /dev/null +++ b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-dashboard-management.module.js","sourceRoot":"","sources":["admin-dashboard-management.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.ts b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.ts new file mode 100644 index 000000000..3a3562262 --- /dev/null +++ b/app/components/kommonitorAdmin/adminDashboardManagement/admin-dashboard-management.module.ts @@ -0,0 +1 @@ +angular.module('adminDashboardManagement', ['kommonitorDataExchange']); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.js index cc6888e4d..1cf23395e 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.js @@ -1,173 +1,121 @@ +"use strict"; angular.module('adminGeoresourcesManagement').component('adminGeoresourcesManagement', { - templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', - function GeoresourcesManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - - $scope.$on("initialMetadataLoadingCompleted", function (event) { - - $timeout(function(){ - - $scope.initializeOrRefreshOverviewTable(); - }, 250); - - - }); - - $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }); - - $scope.initializeOrRefreshOverviewTable = function(){ - $scope.loadingData = true; - - kommonitorDataGridHelperService.buildDataGrid_georesources(kommonitorDataExchangeService.availableGeoresources); - - $timeout(function(){ - - $scope.loadingData = false; - }); - }; - - $scope.$on("refreshGeoresourceOverviewTable", function (event, crudType, targetGeoresourceId) { - $scope.loadingData = true; - $scope.refreshGeoresourceOverviewTable(crudType, targetGeoresourceId); - }); - - - $scope.refreshGeoresourceOverviewTable = function(crudType, targetGeoresourceId){ - - if(! crudType || !targetGeoresourceId){ - // refetch all metadata from spatial units to update table - kommonitorDataExchangeService.fetchGeoresourcesMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { - - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(response) { - - $timeout(function(){ - - $scope.loadingData = false; - }); - $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); - }); - } - else if(crudType && targetGeoresourceId){ - if(crudType == "add"){ - kommonitorCacheHelperService.fetchSingleGeoresourceMetadata(targetGeoresourceId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - kommonitorDataExchangeService.addSingleGeoresourceMetadata(data); - - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(response) { - - $timeout(function(){ - - $scope.loadingData = false; - }); - $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); - }); - } - else if(crudType == "edit"){ - kommonitorCacheHelperService.fetchSingleGeoresourceMetadata(targetGeoresourceId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - kommonitorDataExchangeService.replaceSingleGeoresourceMetadata(data); - - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(response) { - - $timeout(function(){ - - $scope.loadingData = false; - }); - $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); - }); - } - else if(crudType == "delete"){ - // targetGeoresourceId might be array in this case - if(targetGeoresourceId && typeof targetGeoresourceId == "string"){ - kommonitorDataExchangeService.deleteSingleGeoresourceMetadata(targetGeoresourceId); - - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - } - - else if (targetGeoresourceId && Array.isArray(targetGeoresourceId)){ - for (const id of targetGeoresourceId) { - kommonitorDataExchangeService.deleteSingleGeoresourceMetadata(id); - } - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - } - - } - } - - }; - - $scope.onClickDeleteDatasets = function(){ - $scope.loadingData = true; - - var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedGeoresourcesMetadata(); - - // submit selected spatial units to modal controller - $rootScope.$broadcast("onDeleteGeoresources", markedEntriesForDeletion); - - $timeout(function(){ - - $scope.loadingData = false; - }); - }; - - $scope.onClickEditMetadata = function(georesourceDataset){ - // submit selected spatial unit to modal controller - $rootScope.$broadcast("onEditGeoresourceMetadata", georesourceDataset); - }; - - $scope.onClickEditFeatures = function(georesourceDataset){ - // submit selected spatial unit to modal controller - $rootScope.$broadcast("onEditGeoresourceFeatures", georesourceDataset); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function GeoresourcesManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.$on("initialMetadataLoadingCompleted", function (event) { + $timeout(function () { + $scope.initializeOrRefreshOverviewTable(); + }, 250); + }); + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + $timeout(function () { + $scope.loadingData = false; + }); + }); + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + kommonitorDataGridHelperService.buildDataGrid_georesources(kommonitorDataExchangeService.availableGeoresources); + $timeout(function () { + $scope.loadingData = false; + }); + }; + $scope.$on("refreshGeoresourceOverviewTable", function (event, crudType, targetGeoresourceId) { + $scope.loadingData = true; + $scope.refreshGeoresourceOverviewTable(crudType, targetGeoresourceId); + }); + $scope.refreshGeoresourceOverviewTable = function (crudType, targetGeoresourceId) { + if (!crudType || !targetGeoresourceId) { + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchGeoresourcesMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(response) { + $timeout(function () { + $scope.loadingData = false; + }); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + }); + } + else if (crudType && targetGeoresourceId) { + if (crudType == "add") { + kommonitorCacheHelperService.fetchSingleGeoresourceMetadata(targetGeoresourceId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + kommonitorDataExchangeService.addSingleGeoresourceMetadata(data); + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(response) { + $timeout(function () { + $scope.loadingData = false; + }); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + }); + } + else if (crudType == "edit") { + kommonitorCacheHelperService.fetchSingleGeoresourceMetadata(targetGeoresourceId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + kommonitorDataExchangeService.replaceSingleGeoresourceMetadata(data); + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(response) { + $timeout(function () { + $scope.loadingData = false; + }); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + }); + } + else if (crudType == "delete") { + // targetGeoresourceId might be array in this case + if (targetGeoresourceId && typeof targetGeoresourceId == "string") { + kommonitorDataExchangeService.deleteSingleGeoresourceMetadata(targetGeoresourceId); + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + $timeout(function () { + $scope.loadingData = false; + }); + } + else if (targetGeoresourceId && Array.isArray(targetGeoresourceId)) { + for (const id of targetGeoresourceId) { + kommonitorDataExchangeService.deleteSingleGeoresourceMetadata(id); + } + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + $timeout(function () { + $scope.loadingData = false; + }); + } + } + } + }; + $scope.onClickDeleteDatasets = function () { + $scope.loadingData = true; + var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedGeoresourcesMetadata(); + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteGeoresources", markedEntriesForDeletion); + $timeout(function () { + $scope.loadingData = false; + }); + }; + $scope.onClickEditMetadata = function (georesourceDataset) { + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditGeoresourceMetadata", georesourceDataset); + }; + $scope.onClickEditFeatures = function (georesourceDataset) { + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditGeoresourceFeatures", georesourceDataset); + }; + } + ] +}); +//# sourceMappingURL=admin-georesources-management.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.js.map new file mode 100644 index 000000000..a98fd44a6 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-georesources-management.component.js","sourceRoot":"","sources":["admin-georesources-management.component.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,SAAS,CAAC,6BAA6B,EAAE;IACtF,WAAW,EAAG,oGAAoG;IAClH,UAAU,EAAG,CAAC,+BAA+B,EAAE,8BAA8B,EAAE,iCAAiC,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;QACtK,SAAS,gCAAgC,CAAC,6BAA6B,EAAE,4BAA4B,EAAE,+BAA+B,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK;YAEjL,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;YAC3E,sCAAsC;YACrC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YAEvB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;YAE1B,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,UAAU,KAAK;gBAE5D,QAAQ,CAAC;oBAER,MAAM,CAAC,gCAAgC,EAAE,CAAC;gBAC3C,CAAC,EAAE,GAAG,CAAC,CAAC;YAGT,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,CAAC,8BAA8B,EAAE,UAAU,KAAK,EAAE,UAAU;gBAErE,QAAQ,CAAC;oBAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,CAAC,CAAC,CAAC;YAEJ,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,gCAAgC,GAAG;gBACzC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAE1B,+BAA+B,CAAC,0BAA0B,CAAC,6BAA6B,CAAC,qBAAqB,CAAC,CAAC;gBAEhH,QAAQ,CAAC;oBAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,UAAU,KAAK,EAAE,QAAQ,EAAE,mBAAmB;gBAC3F,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC1B,MAAM,CAAC,+BAA+B,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;YACvE,CAAC,CAAC,CAAC;YAGH,MAAM,CAAC,+BAA+B,GAAG,UAAS,QAAQ,EAAE,mBAAmB;gBAE9E,IAAG,CAAE,QAAQ,IAAI,CAAC,mBAAmB,EAAC;oBACrC,0DAA0D;oBAC1D,6BAA6B,CAAC,yBAAyB,CAAC,6BAA6B,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,QAAQ;wBAEtJ,MAAM,CAAC,gCAAgC,EAAE,CAAC;wBAC1C,UAAU,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC;wBAElE,QAAQ,CAAC;4BAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;wBAC5B,CAAC,CAAC,CAAC;oBAEH,CAAC,EAAE,SAAS,aAAa,CAAC,QAAQ;wBAEjC,QAAQ,CAAC;4BAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;wBAC5B,CAAC,CAAC,CAAC;wBACH,UAAU,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC;oBACpE,CAAC,CAAC,CAAC;iBACH;qBACI,IAAG,QAAQ,IAAI,mBAAmB,EAAC;oBACvC,IAAG,QAAQ,IAAI,KAAK,EAAC;wBACpB,4BAA4B,CAAC,8BAA8B,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,IAAI;4BAE3K,6BAA6B,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;4BAEjE,MAAM,CAAC,gCAAgC,EAAE,CAAC;4BAC1C,UAAU,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC;4BAElE,QAAQ,CAAC;gCAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;4BAC5B,CAAC,CAAC,CAAC;wBAEH,CAAC,EAAE,SAAS,aAAa,CAAC,QAAQ;4BAEjC,QAAQ,CAAC;gCAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;4BAC5B,CAAC,CAAC,CAAC;4BACH,UAAU,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC;wBACpE,CAAC,CAAC,CAAC;qBACH;yBACI,IAAG,QAAQ,IAAI,MAAM,EAAC;wBAC1B,4BAA4B,CAAC,8BAA8B,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,IAAI;4BAE3K,6BAA6B,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC;4BAErE,MAAM,CAAC,gCAAgC,EAAE,CAAC;4BAC1C,UAAU,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC;4BAElE,QAAQ,CAAC;gCAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;4BAC5B,CAAC,CAAC,CAAC;wBAEH,CAAC,EAAE,SAAS,aAAa,CAAC,QAAQ;4BAEjC,QAAQ,CAAC;gCAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;4BAC5B,CAAC,CAAC,CAAC;4BACH,UAAU,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC;wBACpE,CAAC,CAAC,CAAC;qBACH;yBACI,IAAG,QAAQ,IAAI,QAAQ,EAAC;wBAC5B,kDAAkD;wBAClD,IAAG,mBAAmB,IAAI,OAAO,mBAAmB,IAAI,QAAQ,EAAC;4BAChE,6BAA6B,CAAC,+BAA+B,CAAC,mBAAmB,CAAC,CAAC;4BAEnF,MAAM,CAAC,gCAAgC,EAAE,CAAC;4BAC1C,UAAU,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC;4BAElE,QAAQ,CAAC;gCAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;4BAC5B,CAAC,CAAC,CAAC;yBACH;6BAEI,IAAI,mBAAmB,IAAI,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAC;4BAClE,KAAK,MAAM,EAAE,IAAI,mBAAmB,EAAE;gCACrC,6BAA6B,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;6BAClE;4BACD,MAAM,CAAC,gCAAgC,EAAE,CAAC;4BAC1C,UAAU,CAAC,UAAU,CAAC,0CAA0C,CAAC,CAAC;4BAElE,QAAQ,CAAC;gCAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;4BAC5B,CAAC,CAAC,CAAC;yBACH;qBAED;iBACD;YAEF,CAAC,CAAC;YAEF,MAAM,CAAC,qBAAqB,GAAG;gBAC9B,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAE1B,IAAI,wBAAwB,GAAG,+BAA+B,CAAC,+BAA+B,EAAE,CAAC;gBAEjG,oDAAoD;gBACpD,UAAU,CAAC,UAAU,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAC;gBAExE,QAAQ,CAAC;oBAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,CAAC,mBAAmB,GAAG,UAAS,kBAAkB;gBACvD,mDAAmD;gBACnD,UAAU,CAAC,UAAU,CAAC,2BAA2B,EAAE,kBAAkB,CAAC,CAAC;YACxE,CAAC,CAAC;YAEF,MAAM,CAAC,mBAAmB,GAAG,UAAS,kBAAkB;gBACvD,mDAAmD;gBACnD,UAAU,CAAC,UAAU,CAAC,2BAA2B,EAAE,kBAAkB,CAAC,CAAC;YACxE,CAAC,CAAC;QAEH,CAAC;KACD;CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.ts new file mode 100644 index 000000000..cc6888e4d --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.component.ts @@ -0,0 +1,173 @@ +angular.module('adminGeoresourcesManagement').component('adminGeoresourcesManagement', { + templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function GeoresourcesManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + + $scope.$on("initialMetadataLoadingCompleted", function (event) { + + $timeout(function(){ + + $scope.initializeOrRefreshOverviewTable(); + }, 250); + + + }); + + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }); + + $scope.initializeOrRefreshOverviewTable = function(){ + $scope.loadingData = true; + + kommonitorDataGridHelperService.buildDataGrid_georesources(kommonitorDataExchangeService.availableGeoresources); + + $timeout(function(){ + + $scope.loadingData = false; + }); + }; + + $scope.$on("refreshGeoresourceOverviewTable", function (event, crudType, targetGeoresourceId) { + $scope.loadingData = true; + $scope.refreshGeoresourceOverviewTable(crudType, targetGeoresourceId); + }); + + + $scope.refreshGeoresourceOverviewTable = function(crudType, targetGeoresourceId){ + + if(! crudType || !targetGeoresourceId){ + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchGeoresourcesMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(response) { + + $timeout(function(){ + + $scope.loadingData = false; + }); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + }); + } + else if(crudType && targetGeoresourceId){ + if(crudType == "add"){ + kommonitorCacheHelperService.fetchSingleGeoresourceMetadata(targetGeoresourceId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + kommonitorDataExchangeService.addSingleGeoresourceMetadata(data); + + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(response) { + + $timeout(function(){ + + $scope.loadingData = false; + }); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + }); + } + else if(crudType == "edit"){ + kommonitorCacheHelperService.fetchSingleGeoresourceMetadata(targetGeoresourceId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + kommonitorDataExchangeService.replaceSingleGeoresourceMetadata(data); + + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(response) { + + $timeout(function(){ + + $scope.loadingData = false; + }); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + }); + } + else if(crudType == "delete"){ + // targetGeoresourceId might be array in this case + if(targetGeoresourceId && typeof targetGeoresourceId == "string"){ + kommonitorDataExchangeService.deleteSingleGeoresourceMetadata(targetGeoresourceId); + + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + } + + else if (targetGeoresourceId && Array.isArray(targetGeoresourceId)){ + for (const id of targetGeoresourceId) { + kommonitorDataExchangeService.deleteSingleGeoresourceMetadata(id); + } + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshGeoresourceOverviewTableCompleted"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + } + + } + } + + }; + + $scope.onClickDeleteDatasets = function(){ + $scope.loadingData = true; + + var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedGeoresourcesMetadata(); + + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteGeoresources", markedEntriesForDeletion); + + $timeout(function(){ + + $scope.loadingData = false; + }); + }; + + $scope.onClickEditMetadata = function(georesourceDataset){ + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditGeoresourceMetadata", georesourceDataset); + }; + + $scope.onClickEditFeatures = function(georesourceDataset){ + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditGeoresourceFeatures", georesourceDataset); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.js index 7dfd2df34..8df3032bd 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.js @@ -1 +1,3 @@ -angular.module('adminGeoresourcesManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper','kommonitorDataGridHelper']); +"use strict"; +angular.module('adminGeoresourcesManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=admin-georesources-management.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.js.map new file mode 100644 index 000000000..128d7d5b9 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-georesources-management.module.js","sourceRoot":"","sources":["admin-georesources-management.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,6BAA6B,EAAE,CAAC,wBAAwB,EAAE,uBAAuB,EAAC,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.ts new file mode 100644 index 000000000..7dfd2df34 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/admin-georesources-management.module.ts @@ -0,0 +1 @@ +angular.module('adminGeoresourcesManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper','kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.js index 2fbe041b2..10a752e58 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.js @@ -1,1125 +1,905 @@ +"use strict"; angular.module('georesourceAddModal').component('georesourceAddModal', { - templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '$timeout', - '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', - function GeoresourceAddModalAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, $scope, $rootScope, - $http, $timeout, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - - /* POST BODY - { - "isLOI": false, - "metadata": { - "note": "note", - "literature": "literature", - "updateInterval": "ARBITRARY", - "sridEPSG": 0.8008281904610115, - "datasource": "datasource", - "contact": "contact", - "lastUpdate": "2000-01-23", - "description": "description", - "databasis": "databasis" - }, - "allowedRoles": [ - "allowedRoles", - "allowedRoles" - ], - "datasetName": "datasetName", - "poiSymbolBootstrap3Name": "poiSymbolBootstrap3Name", - "poiSymbolColor": "white", - "isAOI": false, - "loiDashArrayString": "loiDashArrayString", - "geoJsonString": "geoJsonString", - "topicReference": "topicReference", - "poiMarkerColor": "white", - "jsonSchema": "jsonSchema", - "periodOfValidity": { - "endDate": "2000-01-23", - "startDate": "2000-01-23" - }, - "isPOI": false, - "loiColor": "loiColor", - "loiWidth": "loiWidth", - "aoiColor": "aoiColor" - } - */ - - //Date picker - $('#georesourceAddDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#georesourceAddDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#georesourceAddLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $scope.georesourceMetadataStructure = { - "metadata": { - "note": "an optional note", - "literature": "optional text about literature", - "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", - "sridEPSG": 4326, - "datasource": "text about data source", - "contact": "text about contact details", - "lastUpdate": "YYYY-MM-DD", - "description": "description about spatial unit dataset", - "databasis": "text about data basis", - }, - "allowedRoles": ['roleId'], - "datasetName": "Name of georesource dataset", - "isPOI": "boolean parameter for point of interest dataset - only one of isPOI, isLOI, isAOI can be true", - "isLOI": "boolean parameter for lines of interest dataset - only one of isPOI, isLOI, isAOI can be true", - "isAOI": "boolean parameter for area of interest dataset - only one of isPOI, isLOI, isAOI can be true", - "poiSymbolBootstrap3Name": "glyphicon name of bootstrap 3 symbol to use for a POI resource", - "poiSymbolColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", - "loiDashArrayString": "dash array string value - e.g. 20 20", - "poiMarkerColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", - "loiColor": "color for lines of interest dataset", - "loiWidth": "width for lines of interest dataset", - "aoiColor": "color for area of interest dataset" - }; - - $scope.georesourceMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.georesourceMetadataStructure); - $scope.georesourceMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); - - - $scope.metadataImportSettings; - $scope.georesourceMetadataImportError; - $scope.georesourceMetadataImportErrorAlert; - $scope.georesourceMappingConfigImportError; - - $scope.datasetName = undefined; - $scope.datasetNameInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = undefined; - $scope.metadata.literature = undefined; - $scope.metadata.updateInterval = undefined; - $scope.metadata.sridEPSG = undefined; - $scope.metadata.datasource = undefined; - $scope.metadata.databasis = undefined; - $scope.metadata.contact = undefined; - $scope.metadata.lastUpdate = undefined; - $scope.metadata.description = undefined; - - $scope.roleManagementTableOptions = undefined; - - $scope.$on("availableRolesUpdate", function (event) { - refreshRoles(); - }); - - // make sure that initial fetching of availableRoles has happened - $scope.$on("initialMetadataLoadingCompleted", function (event) { - refreshRoles(); - }); - - function refreshRoles() { - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); - } - - $scope.georesourceTopic_mainTopic = undefined; - $scope.georesourceTopic_subTopic = undefined; - $scope.georesourceTopic_subsubTopic = undefined; - $scope.georesourceTopic_subsubsubTopic = undefined; - - $scope.georesourceType = "poi"; - $scope.isPOI = true; - $scope.isLOI = false; - $scope.isAOI = false; - $scope.selectedPoiMarkerColor = kommonitorDataExchangeService.availablePoiMarkerColors[0]; - $scope.selectedPoiSymbolColor = kommonitorDataExchangeService.availablePoiMarkerColors[1]; - $scope.selectedLoiDashArrayObject = kommonitorDataExchangeService.availableLoiDashArrayObjects[0]; - $scope.loiColor = "#bf3d2c"; - $scope.loiWidth = 3; - $scope.aoiColor = "#bf3d2c"; - $scope.selectedPoiIconName = "home"; - - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = undefined; - $scope.periodOfValidity.endDate = undefined; - $scope.periodOfValidityInvalid = false; - - $scope.geoJsonString = undefined; - $scope.georesource_asGeoJson = undefined; - - $scope.georesourceDataSourceInputInvalidReason = undefined; - $scope.georesourceDataSourceInputInvalid = false; - - $scope.georesourceDataSourceIdProperty = undefined; - $scope.georesourceDataSourceNameProperty = undefined; - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.mimeType = undefined; - $scope.datasourceType = undefined; - $scope.georesourceDataSourceIdProperty = undefined; - $scope.georesourceDataSourceNameProperty = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.postBody_georesources = undefined; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_data = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - $scope.attributeMappings_adminView = []; - $scope.keepAttributes = true; - $scope.keepMissingValues = true; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.importerErrors = undefined; - - $scope.iconPickerOptions = { - align: 'center', // Only in div tag - arrowClass: 'btn-default', - arrowPrevIconClass: 'fas fa-angle-left', - arrowNextIconClass: 'fas fa-angle-right', - cols: 10, - footer: true, - header: true, - icon: 'glyphicon-' + $scope.selectedPoiIconName, - iconset: 'glyphicon', - labelHeader: '{0} von {1} Seiten', - labelFooter: '{0} - {1} von {2} Icons', - placement: 'bottom', // Only in button tag - rows: 6, - search: true, - searchText: 'Stichwortsuche (Bootstrap Glyphicons)', - selectedClass: 'btn-success', - unselectedClass: '' - }; - - $('#poiSymbolPicker').iconpicker($scope.iconPickerOptions); - - $('#poiSymbolPicker').on('change', function(e) { - console.log(e.icon); - // split up due to current data management request structure where we expect only the last name of Bootstrap 3.3.7 glyphicon name - // i.e. "home" for "glyphicon-home" - $scope.selectedPoiIconName = e.icon.substring(e.icon.indexOf('-')+1); - console.log($scope.selectedPoiIconName); - }); - - $scope.loadingData = false; - - // initialize loiDashArray dropdown - setTimeout(function(){ - for(var i=0; i { - $scope.$digest(); - }, 250); - }; - - $scope.onChangeConverter = function(){ - $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; - $scope.mimeType = $scope.converter.mimeTypes[0]; - }; - - $scope.onChangeMimeType = function(mimeType){ - $scope.mimeType = mimeType; - }; - - $scope.onChangeGeoresourceType = function(){ - - switch ($scope.georesourceType) { - case "poi": - $scope.isPOI = true; - $scope.isLOI = false; - $scope.isAOI = false; - break; - case "loi": - $scope.isPOI = false; - $scope.isLOI = true; - $scope.isAOI = false; - break; - case "aoi": - $scope.isPOI = false; - $scope.isLOI = false; - $scope.isAOI = true; - break; - default: - $scope.isPOI = true; - $scope.isLOI = false; - $scope.isAOI = false; - break; - } - }; - - $scope.checkDatasetName = function(){ - $scope.datasetNameInvalid = false; - kommonitorDataExchangeService.availableGeoresources.forEach(function(georesource){ - if (georesource.datasetName === $scope.datasetName){ - $scope.datasetNameInvalid = true; - return; - } - }); - }; - - $scope.checkPeriodOfValidity = function(){ - $scope.periodOfValidityInvalid = false; - if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate){ - var startDate = new Date($scope.periodOfValidity.startDate); - var endDate = new Date($scope.periodOfValidity.endDate); - - if ((startDate === endDate) || startDate > endDate){ - // failure - $scope.periodOfValidityInvalid = true; - } - } - }; - - $scope.onAddOrUpdateAttributeMapping = function(){ - var tmpAttributeMapping_adminView = { - "sourceName": $scope.attributeMapping_sourceAttributeName, - "destinationName": $scope.attributeMapping_destinationAttributeName, - "dataType": $scope.attributeMapping_attributeType - }; - - var processed = false; - - for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { - var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; - - if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName){ - // replace object - $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; - processed = true; - break; - } - } - - if(! processed){ - // new entry - $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); - } - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickEditAttributeMapping = function(attributeMappingEntry){ - $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; - $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; - $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickDeleteAttributeMapping = function(attributeMappingEntry){ - for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { - - if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName){ - // remove object - $scope.attributeMappings_adminView.splice(index, 1); - break; - } - } - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.buildImporterObjects = async function(){ - $scope.converterDefinition = $scope.buildConverterDefinition(); - $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - $scope.postBody_georesources = $scope.buildPostBody_georesources(); - - if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.postBody_georesources){ - return false; - } - - return true; - }; - - $scope.buildConverterDefinition = function(){ - - return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_georesourceAdd_", $scope.schema, $scope.mimeType); - }; - - $scope.buildDatasourceTypeDefinition = async function(){ - try { - return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_georesourceAdd_', 'georesourceDataSourceInput_add'); - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#georesourceAddErrorAlert").show(); - $scope.loadingData = false; - return null; - } - }; - - $scope.buildPropertyMappingDefinition = function(){ - // arsion from is undefined currently - return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.georesourceDataSourceNameProperty, $scope.georesourceDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); - }; - - $scope.buildPostBody_georesources = function(){ - var postBody = - { - "geoJsonString": $scope.geoJsonString, - "allowedRoles": [], - "metadata": { - "note": $scope.metadata.note, - "literature": $scope.metadata.literature, - "updateInterval": $scope.metadata.updateInterval.apiName, - "sridEPSG": $scope.metadata.sridEPSG || 4326, - "datasource": $scope.metadata.datasource, - "contact": $scope.metadata.contact, - "lastUpdate": $scope.metadata.lastUpdate, - "description": $scope.metadata.description, - "databasis": $scope.metadata.databasis - }, - "jsonSchema": null, - "datasetName": $scope.datasetName, - "periodOfValidity": { - "endDate": $scope.periodOfValidity.endDate, - "startDate": $scope.periodOfValidity.startDate - }, - "isAOI": $scope.isAOI, - "isLOI": $scope.isLOI, - "isPOI": $scope.isPOI, - "topicReference": null - }; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - postBody.allowedRoles.push(roleId); - } - - if($scope.isPOI){ - postBody["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; - postBody["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; - postBody["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; - - postBody["loiDashArrayString"] = null; - postBody["loiColor"] = null; - postBody["loiWidth"] = 3; - - postBody["aoiColor"] = null; - } - else if($scope.isLOI){ - postBody["poiSymbolBootstrap3Name"] = null; - postBody["poiSymbolColor"] = null; - postBody["poiMarkerColor"] = null; - - postBody["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; - postBody["loiColor"] = $scope.loiColor; - postBody["loiWidth"] = $scope.loiWidth; - - postBody["aoiColor"] = null; - } - else if($scope.isAOI){ - postBody["poiSymbolBootstrap3Name"] = null; - postBody["poiSymbolColor"] = null; - postBody["poiMarkerColor"] = null; - - postBody["loiDashArrayString"] = null; - postBody["loiColor"] = null; - postBody["loiWidth"] = 3; - - postBody["aoiColor"] = $scope.aoiColor; - } - - // TOPIC REFERENCE - if($scope.georesourceTopic_subsubsubTopic){ - postBody.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; - } - else if($scope.georesourceTopic_subsubTopic){ - postBody.topicReference = $scope.georesourceTopic_subsubTopic.topicId; - } - else if($scope.georesourceTopic_subTopic){ - postBody.topicReference = $scope.georesourceTopic_subTopic.topicId; - } - else if($scope.georesourceTopic_mainTopic){ - postBody.topicReference = $scope.georesourceTopic_mainTopic.topicId; - } - else { - postBody.topicReference = ""; - } - - return postBody; - }; - - $scope.addGeoresource = async function(){ - - $timeout(function(){ - $scope.loadingData = true; - }); - - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - /* - now collect data and build request for importer - */ - - /* - if any required importer data is missing --> cancel request and highlight required errors - */ - var allDataSpecified = await $scope.buildImporterObjects(); - - if (!allDataSpecified) { - - $("#georesourceAddForm").validator("update"); - $("#georesourceAddForm").validator("validate"); - return; - } - else { - - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - var newGeoresourceResponse_dryRun = undefined; - try { - newGeoresourceResponse_dryRun = await kommonitorImporterHelperService.registerNewGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_georesources, true); - - - if(! kommonitorImporterHelperService.importerResponseContainsErrors(newGeoresourceResponse_dryRun)){ - // all good, really execute the request to import data against data management API - var newGeoresourceResponse = await kommonitorImporterHelperService.registerNewGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_georesources, false); - - $rootScope.$broadcast("refreshGeoresourceOverviewTable", "add", kommonitorImporterHelperService.getIdFromImporterResponse(newGeoresourceResponse)); - - // refresh all admin dashboard diagrams due to modified metadata - $timeout(function(){ - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - }, 500); - - - $scope.successMessagePart = $scope.postBody_georesources.datasetName; - $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(newGeoresourceResponse); - - $("#georesourceAddSuccessAlert").show(); - - $scope.loadingData = false; - } - else{ - // errors ocurred - // show them - $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newGeoresourceResponse_dryRun); - - $("#georesourceAddErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - - } - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - if(newGeoresourceResponse_dryRun){ - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newGeoresourceResponse_dryRun); - } - - $("#georesourceAddErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - } - - }; - - $scope.onImportGeoresourceAddMetadata = function(){ - - $scope.georesourceMetadataImportError = ""; - - $("#georesourceMetadataImportFile").files = []; - - // trigger file chooser - $("#georesourceMetadataImportFile").click(); - - }; - - $(document).on("change", "#georesourceMetadataImportFile" ,function(){ - - console.log("Importing Georesource metadata for Add Georesource Form"); - - // get the file - var file = document.getElementById('georesourceMetadataImportFile').files[0]; - $scope.parseMetadataFromFile(file); - }); - - $scope.parseMetadataFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMetadataFile(event); - } - catch(error){ - console.error(error); - console.error("Uploaded Metadata File cannot be parsed."); - $scope.georesourceMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; - document.getElementById("georesourcesAddMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; - $("#georesourceMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMetadataFile = function(event){ - // $scope.geoJsonString = event.target.result; - $scope.metadataImportSettings = JSON.parse(event.target.result); - - if(! $scope.metadataImportSettings.metadata){ - console.error("uploaded Metadata File cannot be parsed - wrong structure."); - $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("georesourcesAddMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; - $("#georesourceMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.metadata = {}; - $scope.metadata.note = $scope.metadataImportSettings.metadata.note; - $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; - kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ - if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ - $scope.metadata.updateInterval = option; - } - }); - $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; - $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; - $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; - $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; - // initialize date - $('#georesourceAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); - - $scope.metadata.description = $scope.metadataImportSettings.metadata.description; - $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; - - $scope.datasetName = $scope.metadataImportSettings.datasetName; - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); - - // georesource specific properties - - $scope.isPOI = $scope.metadataImportSettings.isPOI; - $scope.isLOI = $scope.metadataImportSettings.isLOI; - $scope.isAOI = $scope.metadataImportSettings.isAOI; - if($scope.metadataImportSettings.isPOI){ - $scope.georesourceType = "poi"; - } - else if($scope.metadataImportSettings.isLOI){ - $scope.georesourceType = "loi"; - } - else{ - $scope.georesourceType = "aoi"; - } - kommonitorDataExchangeService.availablePoiMarkerColors.forEach(function(option){ - if(option.colorName === $scope.metadataImportSettings.poiMarkerColor){ - $scope.selectedPoiMarkerColor = option; - } - if(option.colorName === $scope.metadataImportSettings.poiSymbolColor){ - $scope.selectedPoiSymbolColor = option; - } - }); - kommonitorDataExchangeService.availableLoiDashArrayObjects.forEach(function(option){ - if(option.dashArrayValue === $scope.metadataImportSettings.loiDashArrayString){ - $scope.selectedLoiDashArrayObject = option; - $scope.onChangeLoiDashArray($scope.selectedLoiDashArrayObject); - } - }); - $scope.loiColor = $scope.metadataImportSettings.loiColor; - $scope.loiWidth = $scope.metadataImportSettings.loiWidth; - $scope.aoiColor = $scope.metadataImportSettings.aoiColor; - $scope.selectedPoiIconName = $scope.metadataImportSettings.poiSymbolBootstrap3Name; - - var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); - - if(topicHierarchy && topicHierarchy[0]){ - $scope.georesourceTopic_mainTopic = topicHierarchy[0]; - } - if(topicHierarchy && topicHierarchy[1]){ - $scope.georesourceTopic_subTopic = topicHierarchy[1]; - } - if(topicHierarchy && topicHierarchy[2]){ - $scope.georesourceTopic_subsubTopic = topicHierarchy[2]; - } - if(topicHierarchy && topicHierarchy[3]){ - $scope.georesourceTopic_subsubsubTopic = topicHierarchy[3]; - } - - setTimeout(function(){ - $("#poiSymbolPicker").val("").iconpicker('setIcon', 'glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); - // $("#poiSymbolPicker i").css('glyphicon glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); - // $("#poiSymbolPicker input").css('glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); - }, 200); - - $scope.$digest(); - } - - $scope.onExportGeoresourceAddMetadataTemplate = function(){ - - var metadataJSON = JSON.stringify($scope.georesourceMetadataStructure); - - var fileName = "Georessource_Metadaten_Vorlage_Export.json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - $scope.onExportGeoresourceAddMetadata = function(){ - var metadataExport = $scope.georesourceMetadataStructure; - - metadataExport.metadata.note = $scope.metadata.note || ""; - metadataExport.metadata.literature = $scope.metadata.literature || ""; - metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; - metadataExport.metadata.datasource = $scope.metadata.datasource || ""; - metadataExport.metadata.contact = $scope.metadata.contact || ""; - metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; - metadataExport.metadata.description = $scope.metadata.description || ""; - metadataExport.metadata.databasis = $scope.metadata.databasis || ""; - metadataExport.datasetName = $scope.datasetName || ""; - - metadataExport.allowedRoles = []; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - metadataExport.allowedRoles.push(roleId); - } - - if($scope.metadata.updateInterval){ - metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; - } - - var name = $scope.datasetName; - - // georesource specific properties - metadataExport.isPOI = $scope.isPOI; - metadataExport.isLOI = $scope.isLOI; - metadataExport.isAOI = $scope.isAOI; - - if($scope.isPOI){ - metadataExport["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; - metadataExport["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; - metadataExport["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; - - metadataExport["loiDashArrayString"] = ""; - metadataExport["loiColor"] = ""; - metadataExport["loiWidth"] = ""; - - metadataExport["aoiColor"] = ""; - } - else if($scope.isLOI){ - metadataExport["poiSymbolBootstrap3Name"] = ""; - metadataExport["poiSymbolColor"] = ""; - metadataExport["poiMarkerColor"] = ""; - - metadataExport["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; - metadataExport["loiColor"] = $scope.loiColor; - metadataExport["loiWidth"] = $scope.loiWidth; - - - metadataExport["aoiColor"] = ""; - } - else if($scope.isAOI){ - metadataExport["poiSymbolBootstrap3Name"] = ""; - metadataExport["poiSymbolColor"] = ""; - metadataExport["poiMarkerColor"] = ""; - - metadataExport["loiDashArrayString"] = ""; - metadataExport["loiColor"] = ""; - metadataExport["loiWidth"] = ""; - - metadataExport["aoiColor"] = $scope.aoiColor; - } - - if($scope.georesourceTopic_subsubsubTopic){ - metadataExport.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; - } - else if($scope.georesourceTopic_subsubTopic){ - metadataExport.topicReference = $scope.georesourceTopic_subsubTopic.topicId; - } - else if($scope.georesourceTopic_subTopic){ - metadataExport.topicReference = $scope.georesourceTopic_subTopic.topicId; - } - else if($scope.georesourceTopic_mainTopic){ - metadataExport.topicReference = $scope.georesourceTopic_mainTopic.topicId; - } - else { - metadataExport.topicReference = ""; - } - - - var metadataJSON = JSON.stringify(metadataExport); - - var fileName = "Georessource_Metadaten_Export"; - - if (name){ - fileName += "-" + name; - } - - fileName += ".json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - $scope.onChangeMarkerColor = function(markerColor){ - $scope.selectedPoiMarkerColor = markerColor; - }; - - $scope.onChangeSymbolColor = function(symbolColor){ - $scope.selectedPoiSymbolColor = symbolColor; - }; - - $scope.onChangeLoiDashArray = function(loiDashArrayObject){ - $scope.selectedLoiDashArrayObject = loiDashArrayObject; - - $("#loiDashArrayDropdownButton_addGeoresource").html(loiDashArrayObject.svgString); - }; - - $scope.onImportGeoresourceAddMappingConfig = function(){ - - $scope.georesourceMappingConfigImportError = ""; - - $("#georesourceMappingConfigAddImportFile").files = []; - - // trigger file chooser - $("#georesourceMappingConfigAddImportFile").click(); - - }; - - $(document).on("change", "#georesourceMappingConfigAddImportFile" ,function(){ - - console.log("Importing Importer Mapping Config for Add Georesource Form"); - - // get the file - var file = document.getElementById('georesourceMappingConfigAddImportFile').files[0]; - $scope.parseMappingConfigFromFile(file); - }); - - $scope.parseMappingConfigFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMappingConfigFile(event); - } - catch(error){ - console.error(error); - console.error("Uploaded MappingConfig File cannot be parsed."); - $scope.georesourceMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; - document.getElementById("georesourcesAddMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; - $("#georesourceMappingConfigImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMappingConfigFile = function(event){ - $scope.mappingConfigImportSettings = JSON.parse(event.target.result); - - if(! $scope.mappingConfigImportSettings.converter || ! $scope.mappingConfigImportSettings.dataSource || ! $scope.mappingConfigImportSettings.propertyMapping){ - console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); - $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("georesourcesAddMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; - $("#georesourceMappingConfigImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.converter = undefined; - for(var converter of kommonitorImporterHelperService.availableConverters){ - if (converter.name === $scope.mappingConfigImportSettings.converter.name){ - $scope.converter = converter; - break; - } - } - - $scope.schema = undefined; - if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema){ - for (var schema of $scope.converter.schemas) { - if (schema === $scope.mappingConfigImportSettings.converter.schema){ - $scope.schema = schema; - } - } - } - - $scope.mimeType = undefined; - if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType){ - for (var mimeType of $scope.converter.mimeTypes) { - if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType){ - $scope.mimeType = mimeType; - } - } - } - - $scope.datasourceType = undefined; - for(var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes){ - if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type){ - $scope.datasourceType = datasourceType; - break; - } - } - - $scope.$digest(); - - // converter parameters - if ($scope.converter){ - for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { - $("#converterParameter_georesourceAdd_" + convParameter.name).val(convParameter.value); - } - } - - // datasourceTypes parameters - if ($scope.datasourceType){ - for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { - $("#datasourceTypeParameter_georesourceAdd_" + dsParameter.name).val(dsParameter.value); - } - } - - // property Mapping - $scope.georesourceDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; - $scope.georesourceDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; - $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; - $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; - $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; - $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; - $scope.attributeMappings_adminView = []; - - for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { - var tmpEntry = { - "sourceName": attributeMapping.name, - "destinationName": attributeMapping.mappingName - }; - - for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { - if (dataType.apiName === attributeMapping.type){ - tmpEntry.dataType = dataType; - } - } - - $scope.attributeMappings_adminView.push(tmpEntry); - } - - if ($scope.mappingConfigImportSettings.periodOfValidity){ - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; - $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; - $scope.periodOfValidityInvalid = false; - - // update datePickers - if ($scope.periodOfValidity.startDate){ - $("#georesourceAddDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); - } - if ($scope.periodOfValidity.endDate){ - $("#georesourceAddDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); - } - } - - $scope.$digest(); - }; - - $scope.onExportGeoresourceAddMappingConfig = async function(){ - var converterDefinition = $scope.buildConverterDefinition(); - var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - - var mappingConfigExport = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - }; - - mappingConfigExport.periodOfValidity = $scope.periodOfValidity; - - var name = $scope.datasetName; - - var metadataJSON = JSON.stringify(mappingConfigExport); - - var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; - - if (name){ - fileName += "-" + name; - } - - fileName += ".json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - - - $scope.hideSuccessAlert = function(){ - $("#georesourceAddSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#georesourceAddErrorAlert").hide(); - }; - - $scope.hideMetadataErrorAlert = function(){ - $("#georesourceMetadataImportErrorAlert").hide(); - }; - - $scope.hideMappingConfigErrorAlert = function(){ - $("#georesourceMappingConfigImportErrorAlert").hide(); - }; - - kommonitorMultiStepFormHelperService.registerClickHandler(); - - } -]}); + templateUrl: "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '$timeout', + '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', + function GeoresourceAddModalAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, $scope, $rootScope, $http, $timeout, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + /* POST BODY + { + "isLOI": false, + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "allowedRoles": [ + "allowedRoles", + "allowedRoles" + ], + "datasetName": "datasetName", + "poiSymbolBootstrap3Name": "poiSymbolBootstrap3Name", + "poiSymbolColor": "white", + "isAOI": false, + "loiDashArrayString": "loiDashArrayString", + "geoJsonString": "geoJsonString", + "topicReference": "topicReference", + "poiMarkerColor": "white", + "jsonSchema": "jsonSchema", + "periodOfValidity": { + "endDate": "2000-01-23", + "startDate": "2000-01-23" + }, + "isPOI": false, + "loiColor": "loiColor", + "loiWidth": "loiWidth", + "aoiColor": "aoiColor" + } + */ + //Date picker + $('#georesourceAddDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceAddDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceAddLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + $scope.georesourceMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "datasetName": "Name of georesource dataset", + "isPOI": "boolean parameter for point of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "isLOI": "boolean parameter for lines of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "isAOI": "boolean parameter for area of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "poiSymbolBootstrap3Name": "glyphicon name of bootstrap 3 symbol to use for a POI resource", + "poiSymbolColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", + "loiDashArrayString": "dash array string value - e.g. 20 20", + "poiMarkerColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", + "loiColor": "color for lines of interest dataset", + "loiWidth": "width for lines of interest dataset", + "aoiColor": "color for area of interest dataset" + }; + $scope.georesourceMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.georesourceMetadataStructure); + $scope.georesourceMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); + $scope.metadataImportSettings; + $scope.georesourceMetadataImportError; + $scope.georesourceMetadataImportErrorAlert; + $scope.georesourceMappingConfigImportError; + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + $scope.roleManagementTableOptions = undefined; + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + // make sure that initial fetching of availableRoles has happened + $scope.$on("initialMetadataLoadingCompleted", function (event) { + refreshRoles(); + }); + function refreshRoles() { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + $scope.georesourceTopic_mainTopic = undefined; + $scope.georesourceTopic_subTopic = undefined; + $scope.georesourceTopic_subsubTopic = undefined; + $scope.georesourceTopic_subsubsubTopic = undefined; + $scope.georesourceType = "poi"; + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + $scope.selectedPoiMarkerColor = kommonitorDataExchangeService.availablePoiMarkerColors[0]; + $scope.selectedPoiSymbolColor = kommonitorDataExchangeService.availablePoiMarkerColors[1]; + $scope.selectedLoiDashArrayObject = kommonitorDataExchangeService.availableLoiDashArrayObjects[0]; + $scope.loiColor = "#bf3d2c"; + $scope.loiWidth = 3; + $scope.aoiColor = "#bf3d2c"; + $scope.selectedPoiIconName = "home"; + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + $scope.geoJsonString = undefined; + $scope.georesource_asGeoJson = undefined; + $scope.georesourceDataSourceInputInvalidReason = undefined; + $scope.georesourceDataSourceInputInvalid = false; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.postBody_georesources = undefined; + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + $scope.iconPickerOptions = { + align: 'center', + arrowClass: 'btn-default', + arrowPrevIconClass: 'fas fa-angle-left', + arrowNextIconClass: 'fas fa-angle-right', + cols: 10, + footer: true, + header: true, + icon: 'glyphicon-' + $scope.selectedPoiIconName, + iconset: 'glyphicon', + labelHeader: '{0} von {1} Seiten', + labelFooter: '{0} - {1} von {2} Icons', + placement: 'bottom', + rows: 6, + search: true, + searchText: 'Stichwortsuche (Bootstrap Glyphicons)', + selectedClass: 'btn-success', + unselectedClass: '' + }; + $('#poiSymbolPicker').iconpicker($scope.iconPickerOptions); + $('#poiSymbolPicker').on('change', function (e) { + console.log(e.icon); + // split up due to current data management request structure where we expect only the last name of Bootstrap 3.3.7 glyphicon name + // i.e. "home" for "glyphicon-home" + $scope.selectedPoiIconName = e.icon.substring(e.icon.indexOf('-') + 1); + console.log($scope.selectedPoiIconName); + }); + $scope.loadingData = false; + // initialize loiDashArray dropdown + setTimeout(function () { + for (var i = 0; i < kommonitorDataExchangeService.availableLoiDashArrayObjects.length; i++) { + $("#loiDashArrayDropdownItem-" + i).html(kommonitorDataExchangeService.availableLoiDashArrayObjects[i].svgString); + } + $("#loiDashArrayDropdownButton_addGeoresource").html($scope.selectedLoiDashArrayObject.svgString); + }, 1000); + // initialize colorPickers + $('#loiColorPicker').colorpicker(); + $('#aoiColorPicker').colorpicker(); + $scope.resetGeoresourceAddForm = function () { + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + console.log("resetGeoresourceAddForm"); + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceAddRoleManagementTable', null, kommonitorDataExchangeService.accessControl, null); + $scope.georesourceTopic_mainTopic = undefined; + $scope.georesourceTopic_subTopic = undefined; + $scope.georesourceTopic_subsubTopic = undefined; + $scope.georesourceTopic_subsubsubTopic = undefined; + $scope.georesourceType = "poi"; + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + $scope.selectedPoiMarkerColor = kommonitorDataExchangeService.availablePoiMarkerColors[0]; + $scope.selectedPoiSymbolColor = kommonitorDataExchangeService.availablePoiMarkerColors[1]; + $scope.selectedLoiDashArrayObject = kommonitorDataExchangeService.availableLoiDashArrayObjects[0]; + $scope.loiColor = "#bf3d2c"; + $scope.loiWidth = 3; + $scope.aoiColor = "#bf3d2c"; + $scope.selectedPoiIconName = "home"; + $("#poiSymbolPicker").val("").iconpicker('setIcon', 'glyphicon-' + $scope.selectedPoiIconName); + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + $scope.georesourceDataSourceInputInvalidReason = undefined; + $scope.georesourceDataSourceInputInvalid = false; + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.postBody_georesources = undefined; + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onChangeConverter = function () { + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + $scope.onChangeMimeType = function (mimeType) { + $scope.mimeType = mimeType; + }; + $scope.onChangeGeoresourceType = function () { + switch ($scope.georesourceType) { + case "poi": + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + break; + case "loi": + $scope.isPOI = false; + $scope.isLOI = true; + $scope.isAOI = false; + break; + case "aoi": + $scope.isPOI = false; + $scope.isLOI = false; + $scope.isAOI = true; + break; + default: + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + break; + } + }; + $scope.checkDatasetName = function () { + $scope.datasetNameInvalid = false; + kommonitorDataExchangeService.availableGeoresources.forEach(function (georesource) { + if (georesource.datasetName === $scope.datasetName) { + $scope.datasetNameInvalid = true; + return; + } + }); + }; + $scope.checkPeriodOfValidity = function () { + $scope.periodOfValidityInvalid = false; + if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate) { + var startDate = new Date($scope.periodOfValidity.startDate); + var endDate = new Date($scope.periodOfValidity.endDate); + if ((startDate === endDate) || startDate > endDate) { + // failure + $scope.periodOfValidityInvalid = true; + } + } + }; + $scope.onAddOrUpdateAttributeMapping = function () { + var tmpAttributeMapping_adminView = { + "sourceName": $scope.attributeMapping_sourceAttributeName, + "destinationName": $scope.attributeMapping_destinationAttributeName, + "dataType": $scope.attributeMapping_attributeType + }; + var processed = false; + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; + if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName) { + // replace object + $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; + processed = true; + break; + } + } + if (!processed) { + // new entry + $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); + } + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickEditAttributeMapping = function (attributeMappingEntry) { + $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; + $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; + $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickDeleteAttributeMapping = function (attributeMappingEntry) { + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName) { + // remove object + $scope.attributeMappings_adminView.splice(index, 1); + break; + } + } + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.buildImporterObjects = async function () { + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + $scope.postBody_georesources = $scope.buildPostBody_georesources(); + if (!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.postBody_georesources) { + return false; + } + return true; + }; + $scope.buildConverterDefinition = function () { + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_georesourceAdd_", $scope.schema, $scope.mimeType); + }; + $scope.buildDatasourceTypeDefinition = async function () { + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_georesourceAdd_', 'georesourceDataSourceInput_add'); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#georesourceAddErrorAlert").show(); + $scope.loadingData = false; + return null; + } + }; + $scope.buildPropertyMappingDefinition = function () { + // arsion from is undefined currently + return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.georesourceDataSourceNameProperty, $scope.georesourceDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); + }; + $scope.buildPostBody_georesources = function () { + var postBody = { + "geoJsonString": $scope.geoJsonString, + "allowedRoles": [], + "metadata": { + "note": $scope.metadata.note, + "literature": $scope.metadata.literature, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG || 4326, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description, + "databasis": $scope.metadata.databasis + }, + "jsonSchema": null, + "datasetName": $scope.datasetName, + "periodOfValidity": { + "endDate": $scope.periodOfValidity.endDate, + "startDate": $scope.periodOfValidity.startDate + }, + "isAOI": $scope.isAOI, + "isLOI": $scope.isLOI, + "isPOI": $scope.isPOI, + "topicReference": null + }; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + postBody.allowedRoles.push(roleId); + } + if ($scope.isPOI) { + postBody["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; + postBody["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; + postBody["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; + postBody["loiDashArrayString"] = null; + postBody["loiColor"] = null; + postBody["loiWidth"] = 3; + postBody["aoiColor"] = null; + } + else if ($scope.isLOI) { + postBody["poiSymbolBootstrap3Name"] = null; + postBody["poiSymbolColor"] = null; + postBody["poiMarkerColor"] = null; + postBody["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; + postBody["loiColor"] = $scope.loiColor; + postBody["loiWidth"] = $scope.loiWidth; + postBody["aoiColor"] = null; + } + else if ($scope.isAOI) { + postBody["poiSymbolBootstrap3Name"] = null; + postBody["poiSymbolColor"] = null; + postBody["poiMarkerColor"] = null; + postBody["loiDashArrayString"] = null; + postBody["loiColor"] = null; + postBody["loiWidth"] = 3; + postBody["aoiColor"] = $scope.aoiColor; + } + // TOPIC REFERENCE + if ($scope.georesourceTopic_subsubsubTopic) { + postBody.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; + } + else if ($scope.georesourceTopic_subsubTopic) { + postBody.topicReference = $scope.georesourceTopic_subsubTopic.topicId; + } + else if ($scope.georesourceTopic_subTopic) { + postBody.topicReference = $scope.georesourceTopic_subTopic.topicId; + } + else if ($scope.georesourceTopic_mainTopic) { + postBody.topicReference = $scope.georesourceTopic_mainTopic.topicId; + } + else { + postBody.topicReference = ""; + } + return postBody; + }; + $scope.addGeoresource = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + /* + now collect data and build request for importer + */ + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + if (!allDataSpecified) { + $("#georesourceAddForm").validator("update"); + $("#georesourceAddForm").validator("validate"); + return; + } + else { + // TODO verify input + // TODO Create and perform POST Request with loading screen + var newGeoresourceResponse_dryRun = undefined; + try { + newGeoresourceResponse_dryRun = await kommonitorImporterHelperService.registerNewGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_georesources, true); + if (!kommonitorImporterHelperService.importerResponseContainsErrors(newGeoresourceResponse_dryRun)) { + // all good, really execute the request to import data against data management API + var newGeoresourceResponse = await kommonitorImporterHelperService.registerNewGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_georesources, false); + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "add", kommonitorImporterHelperService.getIdFromImporterResponse(newGeoresourceResponse)); + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function () { + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + $scope.successMessagePart = $scope.postBody_georesources.datasetName; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(newGeoresourceResponse); + $("#georesourceAddSuccessAlert").show(); + $scope.loadingData = false; + } + else { + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newGeoresourceResponse_dryRun); + $("#georesourceAddErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if (newGeoresourceResponse_dryRun) { + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newGeoresourceResponse_dryRun); + } + $("#georesourceAddErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + }; + $scope.onImportGeoresourceAddMetadata = function () { + $scope.georesourceMetadataImportError = ""; + $("#georesourceMetadataImportFile").files = []; + // trigger file chooser + $("#georesourceMetadataImportFile").click(); + }; + $(document).on("change", "#georesourceMetadataImportFile", function () { + console.log("Importing Georesource metadata for Add Georesource Form"); + // get the file + var file = document.getElementById('georesourceMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + $scope.parseMetadataFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMetadataFile(event); + } + catch (error) { + console.error(error); + console.error("Uploaded Metadata File cannot be parsed."); + $scope.georesourceMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("georesourcesAddMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; + $("#georesourceMetadataImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMetadataFile = function (event) { + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + if (!$scope.metadataImportSettings.metadata) { + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("georesourcesAddMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; + $("#georesourceMetadataImportErrorAlert").show(); + $scope.$digest(); + } + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function (option) { + if (option.apiName === $scope.metadataImportSettings.metadata.updateInterval) { + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#georesourceAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + $scope.datasetName = $scope.metadataImportSettings.datasetName; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + // georesource specific properties + $scope.isPOI = $scope.metadataImportSettings.isPOI; + $scope.isLOI = $scope.metadataImportSettings.isLOI; + $scope.isAOI = $scope.metadataImportSettings.isAOI; + if ($scope.metadataImportSettings.isPOI) { + $scope.georesourceType = "poi"; + } + else if ($scope.metadataImportSettings.isLOI) { + $scope.georesourceType = "loi"; + } + else { + $scope.georesourceType = "aoi"; + } + kommonitorDataExchangeService.availablePoiMarkerColors.forEach(function (option) { + if (option.colorName === $scope.metadataImportSettings.poiMarkerColor) { + $scope.selectedPoiMarkerColor = option; + } + if (option.colorName === $scope.metadataImportSettings.poiSymbolColor) { + $scope.selectedPoiSymbolColor = option; + } + }); + kommonitorDataExchangeService.availableLoiDashArrayObjects.forEach(function (option) { + if (option.dashArrayValue === $scope.metadataImportSettings.loiDashArrayString) { + $scope.selectedLoiDashArrayObject = option; + $scope.onChangeLoiDashArray($scope.selectedLoiDashArrayObject); + } + }); + $scope.loiColor = $scope.metadataImportSettings.loiColor; + $scope.loiWidth = $scope.metadataImportSettings.loiWidth; + $scope.aoiColor = $scope.metadataImportSettings.aoiColor; + $scope.selectedPoiIconName = $scope.metadataImportSettings.poiSymbolBootstrap3Name; + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); + if (topicHierarchy && topicHierarchy[0]) { + $scope.georesourceTopic_mainTopic = topicHierarchy[0]; + } + if (topicHierarchy && topicHierarchy[1]) { + $scope.georesourceTopic_subTopic = topicHierarchy[1]; + } + if (topicHierarchy && topicHierarchy[2]) { + $scope.georesourceTopic_subsubTopic = topicHierarchy[2]; + } + if (topicHierarchy && topicHierarchy[3]) { + $scope.georesourceTopic_subsubsubTopic = topicHierarchy[3]; + } + setTimeout(function () { + $("#poiSymbolPicker").val("").iconpicker('setIcon', 'glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker i").css('glyphicon glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker input").css('glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + }, 200); + $scope.$digest(); + }; + $scope.onExportGeoresourceAddMetadataTemplate = function () { + var metadataJSON = JSON.stringify($scope.georesourceMetadataStructure); + var fileName = "Georessource_Metadaten_Vorlage_Export.json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onExportGeoresourceAddMetadata = function () { + var metadataExport = $scope.georesourceMetadataStructure; + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.datasetName = $scope.datasetName || ""; + metadataExport.allowedRoles = []; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + if ($scope.metadata.updateInterval) { + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + var name = $scope.datasetName; + // georesource specific properties + metadataExport.isPOI = $scope.isPOI; + metadataExport.isLOI = $scope.isLOI; + metadataExport.isAOI = $scope.isAOI; + if ($scope.isPOI) { + metadataExport["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; + metadataExport["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; + metadataExport["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; + metadataExport["loiDashArrayString"] = ""; + metadataExport["loiColor"] = ""; + metadataExport["loiWidth"] = ""; + metadataExport["aoiColor"] = ""; + } + else if ($scope.isLOI) { + metadataExport["poiSymbolBootstrap3Name"] = ""; + metadataExport["poiSymbolColor"] = ""; + metadataExport["poiMarkerColor"] = ""; + metadataExport["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; + metadataExport["loiColor"] = $scope.loiColor; + metadataExport["loiWidth"] = $scope.loiWidth; + metadataExport["aoiColor"] = ""; + } + else if ($scope.isAOI) { + metadataExport["poiSymbolBootstrap3Name"] = ""; + metadataExport["poiSymbolColor"] = ""; + metadataExport["poiMarkerColor"] = ""; + metadataExport["loiDashArrayString"] = ""; + metadataExport["loiColor"] = ""; + metadataExport["loiWidth"] = ""; + metadataExport["aoiColor"] = $scope.aoiColor; + } + if ($scope.georesourceTopic_subsubsubTopic) { + metadataExport.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; + } + else if ($scope.georesourceTopic_subsubTopic) { + metadataExport.topicReference = $scope.georesourceTopic_subsubTopic.topicId; + } + else if ($scope.georesourceTopic_subTopic) { + metadataExport.topicReference = $scope.georesourceTopic_subTopic.topicId; + } + else if ($scope.georesourceTopic_mainTopic) { + metadataExport.topicReference = $scope.georesourceTopic_mainTopic.topicId; + } + else { + metadataExport.topicReference = ""; + } + var metadataJSON = JSON.stringify(metadataExport); + var fileName = "Georessource_Metadaten_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onChangeMarkerColor = function (markerColor) { + $scope.selectedPoiMarkerColor = markerColor; + }; + $scope.onChangeSymbolColor = function (symbolColor) { + $scope.selectedPoiSymbolColor = symbolColor; + }; + $scope.onChangeLoiDashArray = function (loiDashArrayObject) { + $scope.selectedLoiDashArrayObject = loiDashArrayObject; + $("#loiDashArrayDropdownButton_addGeoresource").html(loiDashArrayObject.svgString); + }; + $scope.onImportGeoresourceAddMappingConfig = function () { + $scope.georesourceMappingConfigImportError = ""; + $("#georesourceMappingConfigAddImportFile").files = []; + // trigger file chooser + $("#georesourceMappingConfigAddImportFile").click(); + }; + $(document).on("change", "#georesourceMappingConfigAddImportFile", function () { + console.log("Importing Importer Mapping Config for Add Georesource Form"); + // get the file + var file = document.getElementById('georesourceMappingConfigAddImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + $scope.parseMappingConfigFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMappingConfigFile(event); + } + catch (error) { + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.georesourceMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("georesourcesAddMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; + $("#georesourceMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMappingConfigFile = function (event) { + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + if (!$scope.mappingConfigImportSettings.converter || !$scope.mappingConfigImportSettings.dataSource || !$scope.mappingConfigImportSettings.propertyMapping) { + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("georesourcesAddMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; + $("#georesourceMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + $scope.converter = undefined; + for (var converter of kommonitorImporterHelperService.availableConverters) { + if (converter.name === $scope.mappingConfigImportSettings.converter.name) { + $scope.converter = converter; + break; + } + } + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema) { + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema) { + $scope.schema = schema; + } + } + } + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType) { + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType) { + $scope.mimeType = mimeType; + } + } + } + $scope.datasourceType = undefined; + for (var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes) { + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type) { + $scope.datasourceType = datasourceType; + break; + } + } + $scope.$digest(); + // converter parameters + if ($scope.converter) { + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_georesourceAdd_" + convParameter.name).val(convParameter.value); + } + } + // datasourceTypes parameters + if ($scope.datasourceType) { + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_georesourceAdd_" + dsParameter.name).val(dsParameter.value); + } + } + // property Mapping + $scope.georesourceDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; + $scope.georesourceDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; + $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; + $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; + $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; + $scope.attributeMappings_adminView = []; + for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { + var tmpEntry = { + "sourceName": attributeMapping.name, + "destinationName": attributeMapping.mappingName + }; + for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { + if (dataType.apiName === attributeMapping.type) { + tmpEntry.dataType = dataType; + } + } + $scope.attributeMappings_adminView.push(tmpEntry); + } + if ($scope.mappingConfigImportSettings.periodOfValidity) { + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; + $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; + $scope.periodOfValidityInvalid = false; + // update datePickers + if ($scope.periodOfValidity.startDate) { + $("#georesourceAddDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); + } + if ($scope.periodOfValidity.endDate) { + $("#georesourceAddDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); + } + } + $scope.$digest(); + }; + $scope.onExportGeoresourceAddMappingConfig = async function () { + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + }; + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + var name = $scope.datasetName; + var metadataJSON = JSON.stringify(mappingConfigExport); + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.hideSuccessAlert = function () { + $("#georesourceAddSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#georesourceAddErrorAlert").hide(); + }; + $scope.hideMetadataErrorAlert = function () { + $("#georesourceMetadataImportErrorAlert").hide(); + }; + $scope.hideMappingConfigErrorAlert = function () { + $("#georesourceMappingConfigImportErrorAlert").hide(); + }; + kommonitorMultiStepFormHelperService.registerClickHandler(); + } + ] +}); +//# sourceMappingURL=georesource-add-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.js.map new file mode 100644 index 000000000..ba1f82176 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"georesource-add-modal.component.js","sourceRoot":"","sources":["georesource-add-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.ts new file mode 100644 index 000000000..2fbe041b2 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.component.ts @@ -0,0 +1,1125 @@ +angular.module('georesourceAddModal').component('georesourceAddModal', { + templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '$timeout', + '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', + function GeoresourceAddModalAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, $scope, $rootScope, + $http, $timeout, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + + /* POST BODY + { + "isLOI": false, + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "allowedRoles": [ + "allowedRoles", + "allowedRoles" + ], + "datasetName": "datasetName", + "poiSymbolBootstrap3Name": "poiSymbolBootstrap3Name", + "poiSymbolColor": "white", + "isAOI": false, + "loiDashArrayString": "loiDashArrayString", + "geoJsonString": "geoJsonString", + "topicReference": "topicReference", + "poiMarkerColor": "white", + "jsonSchema": "jsonSchema", + "periodOfValidity": { + "endDate": "2000-01-23", + "startDate": "2000-01-23" + }, + "isPOI": false, + "loiColor": "loiColor", + "loiWidth": "loiWidth", + "aoiColor": "aoiColor" + } + */ + + //Date picker + $('#georesourceAddDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceAddDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceAddLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + + $scope.georesourceMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "datasetName": "Name of georesource dataset", + "isPOI": "boolean parameter for point of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "isLOI": "boolean parameter for lines of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "isAOI": "boolean parameter for area of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "poiSymbolBootstrap3Name": "glyphicon name of bootstrap 3 symbol to use for a POI resource", + "poiSymbolColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", + "loiDashArrayString": "dash array string value - e.g. 20 20", + "poiMarkerColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", + "loiColor": "color for lines of interest dataset", + "loiWidth": "width for lines of interest dataset", + "aoiColor": "color for area of interest dataset" + }; + + $scope.georesourceMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.georesourceMetadataStructure); + $scope.georesourceMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); + + + $scope.metadataImportSettings; + $scope.georesourceMetadataImportError; + $scope.georesourceMetadataImportErrorAlert; + $scope.georesourceMappingConfigImportError; + + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + + $scope.roleManagementTableOptions = undefined; + + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + + // make sure that initial fetching of availableRoles has happened + $scope.$on("initialMetadataLoadingCompleted", function (event) { + refreshRoles(); + }); + + function refreshRoles() { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + + $scope.georesourceTopic_mainTopic = undefined; + $scope.georesourceTopic_subTopic = undefined; + $scope.georesourceTopic_subsubTopic = undefined; + $scope.georesourceTopic_subsubsubTopic = undefined; + + $scope.georesourceType = "poi"; + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + $scope.selectedPoiMarkerColor = kommonitorDataExchangeService.availablePoiMarkerColors[0]; + $scope.selectedPoiSymbolColor = kommonitorDataExchangeService.availablePoiMarkerColors[1]; + $scope.selectedLoiDashArrayObject = kommonitorDataExchangeService.availableLoiDashArrayObjects[0]; + $scope.loiColor = "#bf3d2c"; + $scope.loiWidth = 3; + $scope.aoiColor = "#bf3d2c"; + $scope.selectedPoiIconName = "home"; + + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + + $scope.geoJsonString = undefined; + $scope.georesource_asGeoJson = undefined; + + $scope.georesourceDataSourceInputInvalidReason = undefined; + $scope.georesourceDataSourceInputInvalid = false; + + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.postBody_georesources = undefined; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + + $scope.iconPickerOptions = { + align: 'center', // Only in div tag + arrowClass: 'btn-default', + arrowPrevIconClass: 'fas fa-angle-left', + arrowNextIconClass: 'fas fa-angle-right', + cols: 10, + footer: true, + header: true, + icon: 'glyphicon-' + $scope.selectedPoiIconName, + iconset: 'glyphicon', + labelHeader: '{0} von {1} Seiten', + labelFooter: '{0} - {1} von {2} Icons', + placement: 'bottom', // Only in button tag + rows: 6, + search: true, + searchText: 'Stichwortsuche (Bootstrap Glyphicons)', + selectedClass: 'btn-success', + unselectedClass: '' + }; + + $('#poiSymbolPicker').iconpicker($scope.iconPickerOptions); + + $('#poiSymbolPicker').on('change', function(e) { + console.log(e.icon); + // split up due to current data management request structure where we expect only the last name of Bootstrap 3.3.7 glyphicon name + // i.e. "home" for "glyphicon-home" + $scope.selectedPoiIconName = e.icon.substring(e.icon.indexOf('-')+1); + console.log($scope.selectedPoiIconName); + }); + + $scope.loadingData = false; + + // initialize loiDashArray dropdown + setTimeout(function(){ + for(var i=0; i { + $scope.$digest(); + }, 250); + }; + + $scope.onChangeConverter = function(){ + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + + $scope.onChangeMimeType = function(mimeType){ + $scope.mimeType = mimeType; + }; + + $scope.onChangeGeoresourceType = function(){ + + switch ($scope.georesourceType) { + case "poi": + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + break; + case "loi": + $scope.isPOI = false; + $scope.isLOI = true; + $scope.isAOI = false; + break; + case "aoi": + $scope.isPOI = false; + $scope.isLOI = false; + $scope.isAOI = true; + break; + default: + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + break; + } + }; + + $scope.checkDatasetName = function(){ + $scope.datasetNameInvalid = false; + kommonitorDataExchangeService.availableGeoresources.forEach(function(georesource){ + if (georesource.datasetName === $scope.datasetName){ + $scope.datasetNameInvalid = true; + return; + } + }); + }; + + $scope.checkPeriodOfValidity = function(){ + $scope.periodOfValidityInvalid = false; + if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate){ + var startDate = new Date($scope.periodOfValidity.startDate); + var endDate = new Date($scope.periodOfValidity.endDate); + + if ((startDate === endDate) || startDate > endDate){ + // failure + $scope.periodOfValidityInvalid = true; + } + } + }; + + $scope.onAddOrUpdateAttributeMapping = function(){ + var tmpAttributeMapping_adminView = { + "sourceName": $scope.attributeMapping_sourceAttributeName, + "destinationName": $scope.attributeMapping_destinationAttributeName, + "dataType": $scope.attributeMapping_attributeType + }; + + var processed = false; + + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; + + if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName){ + // replace object + $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; + processed = true; + break; + } + } + + if(! processed){ + // new entry + $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); + } + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickEditAttributeMapping = function(attributeMappingEntry){ + $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; + $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; + $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickDeleteAttributeMapping = function(attributeMappingEntry){ + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + + if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName){ + // remove object + $scope.attributeMappings_adminView.splice(index, 1); + break; + } + } + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.buildImporterObjects = async function(){ + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + $scope.postBody_georesources = $scope.buildPostBody_georesources(); + + if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.postBody_georesources){ + return false; + } + + return true; + }; + + $scope.buildConverterDefinition = function(){ + + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_georesourceAdd_", $scope.schema, $scope.mimeType); + }; + + $scope.buildDatasourceTypeDefinition = async function(){ + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_georesourceAdd_', 'georesourceDataSourceInput_add'); + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#georesourceAddErrorAlert").show(); + $scope.loadingData = false; + return null; + } + }; + + $scope.buildPropertyMappingDefinition = function(){ + // arsion from is undefined currently + return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.georesourceDataSourceNameProperty, $scope.georesourceDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); + }; + + $scope.buildPostBody_georesources = function(){ + var postBody = + { + "geoJsonString": $scope.geoJsonString, + "allowedRoles": [], + "metadata": { + "note": $scope.metadata.note, + "literature": $scope.metadata.literature, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG || 4326, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description, + "databasis": $scope.metadata.databasis + }, + "jsonSchema": null, + "datasetName": $scope.datasetName, + "periodOfValidity": { + "endDate": $scope.periodOfValidity.endDate, + "startDate": $scope.periodOfValidity.startDate + }, + "isAOI": $scope.isAOI, + "isLOI": $scope.isLOI, + "isPOI": $scope.isPOI, + "topicReference": null + }; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + postBody.allowedRoles.push(roleId); + } + + if($scope.isPOI){ + postBody["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; + postBody["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; + postBody["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; + + postBody["loiDashArrayString"] = null; + postBody["loiColor"] = null; + postBody["loiWidth"] = 3; + + postBody["aoiColor"] = null; + } + else if($scope.isLOI){ + postBody["poiSymbolBootstrap3Name"] = null; + postBody["poiSymbolColor"] = null; + postBody["poiMarkerColor"] = null; + + postBody["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; + postBody["loiColor"] = $scope.loiColor; + postBody["loiWidth"] = $scope.loiWidth; + + postBody["aoiColor"] = null; + } + else if($scope.isAOI){ + postBody["poiSymbolBootstrap3Name"] = null; + postBody["poiSymbolColor"] = null; + postBody["poiMarkerColor"] = null; + + postBody["loiDashArrayString"] = null; + postBody["loiColor"] = null; + postBody["loiWidth"] = 3; + + postBody["aoiColor"] = $scope.aoiColor; + } + + // TOPIC REFERENCE + if($scope.georesourceTopic_subsubsubTopic){ + postBody.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; + } + else if($scope.georesourceTopic_subsubTopic){ + postBody.topicReference = $scope.georesourceTopic_subsubTopic.topicId; + } + else if($scope.georesourceTopic_subTopic){ + postBody.topicReference = $scope.georesourceTopic_subTopic.topicId; + } + else if($scope.georesourceTopic_mainTopic){ + postBody.topicReference = $scope.georesourceTopic_mainTopic.topicId; + } + else { + postBody.topicReference = ""; + } + + return postBody; + }; + + $scope.addGeoresource = async function(){ + + $timeout(function(){ + $scope.loadingData = true; + }); + + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + /* + now collect data and build request for importer + */ + + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + + if (!allDataSpecified) { + + $("#georesourceAddForm").validator("update"); + $("#georesourceAddForm").validator("validate"); + return; + } + else { + + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + var newGeoresourceResponse_dryRun = undefined; + try { + newGeoresourceResponse_dryRun = await kommonitorImporterHelperService.registerNewGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_georesources, true); + + + if(! kommonitorImporterHelperService.importerResponseContainsErrors(newGeoresourceResponse_dryRun)){ + // all good, really execute the request to import data against data management API + var newGeoresourceResponse = await kommonitorImporterHelperService.registerNewGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_georesources, false); + + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "add", kommonitorImporterHelperService.getIdFromImporterResponse(newGeoresourceResponse)); + + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function(){ + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + + + $scope.successMessagePart = $scope.postBody_georesources.datasetName; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(newGeoresourceResponse); + + $("#georesourceAddSuccessAlert").show(); + + $scope.loadingData = false; + } + else{ + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newGeoresourceResponse_dryRun); + + $("#georesourceAddErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + + } + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + if(newGeoresourceResponse_dryRun){ + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newGeoresourceResponse_dryRun); + } + + $("#georesourceAddErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + + }; + + $scope.onImportGeoresourceAddMetadata = function(){ + + $scope.georesourceMetadataImportError = ""; + + $("#georesourceMetadataImportFile").files = []; + + // trigger file chooser + $("#georesourceMetadataImportFile").click(); + + }; + + $(document).on("change", "#georesourceMetadataImportFile" ,function(){ + + console.log("Importing Georesource metadata for Add Georesource Form"); + + // get the file + var file = document.getElementById('georesourceMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + + $scope.parseMetadataFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMetadataFile(event); + } + catch(error){ + console.error(error); + console.error("Uploaded Metadata File cannot be parsed."); + $scope.georesourceMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("georesourcesAddMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; + $("#georesourceMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMetadataFile = function(event){ + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + + if(! $scope.metadataImportSettings.metadata){ + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("georesourcesAddMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; + $("#georesourceMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ + if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#georesourceAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + + $scope.datasetName = $scope.metadataImportSettings.datasetName; + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + + // georesource specific properties + + $scope.isPOI = $scope.metadataImportSettings.isPOI; + $scope.isLOI = $scope.metadataImportSettings.isLOI; + $scope.isAOI = $scope.metadataImportSettings.isAOI; + if($scope.metadataImportSettings.isPOI){ + $scope.georesourceType = "poi"; + } + else if($scope.metadataImportSettings.isLOI){ + $scope.georesourceType = "loi"; + } + else{ + $scope.georesourceType = "aoi"; + } + kommonitorDataExchangeService.availablePoiMarkerColors.forEach(function(option){ + if(option.colorName === $scope.metadataImportSettings.poiMarkerColor){ + $scope.selectedPoiMarkerColor = option; + } + if(option.colorName === $scope.metadataImportSettings.poiSymbolColor){ + $scope.selectedPoiSymbolColor = option; + } + }); + kommonitorDataExchangeService.availableLoiDashArrayObjects.forEach(function(option){ + if(option.dashArrayValue === $scope.metadataImportSettings.loiDashArrayString){ + $scope.selectedLoiDashArrayObject = option; + $scope.onChangeLoiDashArray($scope.selectedLoiDashArrayObject); + } + }); + $scope.loiColor = $scope.metadataImportSettings.loiColor; + $scope.loiWidth = $scope.metadataImportSettings.loiWidth; + $scope.aoiColor = $scope.metadataImportSettings.aoiColor; + $scope.selectedPoiIconName = $scope.metadataImportSettings.poiSymbolBootstrap3Name; + + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); + + if(topicHierarchy && topicHierarchy[0]){ + $scope.georesourceTopic_mainTopic = topicHierarchy[0]; + } + if(topicHierarchy && topicHierarchy[1]){ + $scope.georesourceTopic_subTopic = topicHierarchy[1]; + } + if(topicHierarchy && topicHierarchy[2]){ + $scope.georesourceTopic_subsubTopic = topicHierarchy[2]; + } + if(topicHierarchy && topicHierarchy[3]){ + $scope.georesourceTopic_subsubsubTopic = topicHierarchy[3]; + } + + setTimeout(function(){ + $("#poiSymbolPicker").val("").iconpicker('setIcon', 'glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker i").css('glyphicon glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker input").css('glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + }, 200); + + $scope.$digest(); + } + + $scope.onExportGeoresourceAddMetadataTemplate = function(){ + + var metadataJSON = JSON.stringify($scope.georesourceMetadataStructure); + + var fileName = "Georessource_Metadaten_Vorlage_Export.json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + $scope.onExportGeoresourceAddMetadata = function(){ + var metadataExport = $scope.georesourceMetadataStructure; + + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.datasetName = $scope.datasetName || ""; + + metadataExport.allowedRoles = []; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + + if($scope.metadata.updateInterval){ + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + + var name = $scope.datasetName; + + // georesource specific properties + metadataExport.isPOI = $scope.isPOI; + metadataExport.isLOI = $scope.isLOI; + metadataExport.isAOI = $scope.isAOI; + + if($scope.isPOI){ + metadataExport["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; + metadataExport["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; + metadataExport["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; + + metadataExport["loiDashArrayString"] = ""; + metadataExport["loiColor"] = ""; + metadataExport["loiWidth"] = ""; + + metadataExport["aoiColor"] = ""; + } + else if($scope.isLOI){ + metadataExport["poiSymbolBootstrap3Name"] = ""; + metadataExport["poiSymbolColor"] = ""; + metadataExport["poiMarkerColor"] = ""; + + metadataExport["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; + metadataExport["loiColor"] = $scope.loiColor; + metadataExport["loiWidth"] = $scope.loiWidth; + + + metadataExport["aoiColor"] = ""; + } + else if($scope.isAOI){ + metadataExport["poiSymbolBootstrap3Name"] = ""; + metadataExport["poiSymbolColor"] = ""; + metadataExport["poiMarkerColor"] = ""; + + metadataExport["loiDashArrayString"] = ""; + metadataExport["loiColor"] = ""; + metadataExport["loiWidth"] = ""; + + metadataExport["aoiColor"] = $scope.aoiColor; + } + + if($scope.georesourceTopic_subsubsubTopic){ + metadataExport.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; + } + else if($scope.georesourceTopic_subsubTopic){ + metadataExport.topicReference = $scope.georesourceTopic_subsubTopic.topicId; + } + else if($scope.georesourceTopic_subTopic){ + metadataExport.topicReference = $scope.georesourceTopic_subTopic.topicId; + } + else if($scope.georesourceTopic_mainTopic){ + metadataExport.topicReference = $scope.georesourceTopic_mainTopic.topicId; + } + else { + metadataExport.topicReference = ""; + } + + + var metadataJSON = JSON.stringify(metadataExport); + + var fileName = "Georessource_Metadaten_Export"; + + if (name){ + fileName += "-" + name; + } + + fileName += ".json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + $scope.onChangeMarkerColor = function(markerColor){ + $scope.selectedPoiMarkerColor = markerColor; + }; + + $scope.onChangeSymbolColor = function(symbolColor){ + $scope.selectedPoiSymbolColor = symbolColor; + }; + + $scope.onChangeLoiDashArray = function(loiDashArrayObject){ + $scope.selectedLoiDashArrayObject = loiDashArrayObject; + + $("#loiDashArrayDropdownButton_addGeoresource").html(loiDashArrayObject.svgString); + }; + + $scope.onImportGeoresourceAddMappingConfig = function(){ + + $scope.georesourceMappingConfigImportError = ""; + + $("#georesourceMappingConfigAddImportFile").files = []; + + // trigger file chooser + $("#georesourceMappingConfigAddImportFile").click(); + + }; + + $(document).on("change", "#georesourceMappingConfigAddImportFile" ,function(){ + + console.log("Importing Importer Mapping Config for Add Georesource Form"); + + // get the file + var file = document.getElementById('georesourceMappingConfigAddImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + + $scope.parseMappingConfigFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMappingConfigFile(event); + } + catch(error){ + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.georesourceMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("georesourcesAddMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; + $("#georesourceMappingConfigImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMappingConfigFile = function(event){ + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + + if(! $scope.mappingConfigImportSettings.converter || ! $scope.mappingConfigImportSettings.dataSource || ! $scope.mappingConfigImportSettings.propertyMapping){ + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("georesourcesAddMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; + $("#georesourceMappingConfigImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.converter = undefined; + for(var converter of kommonitorImporterHelperService.availableConverters){ + if (converter.name === $scope.mappingConfigImportSettings.converter.name){ + $scope.converter = converter; + break; + } + } + + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema){ + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema){ + $scope.schema = schema; + } + } + } + + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType){ + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType){ + $scope.mimeType = mimeType; + } + } + } + + $scope.datasourceType = undefined; + for(var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes){ + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type){ + $scope.datasourceType = datasourceType; + break; + } + } + + $scope.$digest(); + + // converter parameters + if ($scope.converter){ + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_georesourceAdd_" + convParameter.name).val(convParameter.value); + } + } + + // datasourceTypes parameters + if ($scope.datasourceType){ + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_georesourceAdd_" + dsParameter.name).val(dsParameter.value); + } + } + + // property Mapping + $scope.georesourceDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; + $scope.georesourceDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; + $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; + $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; + $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; + $scope.attributeMappings_adminView = []; + + for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { + var tmpEntry = { + "sourceName": attributeMapping.name, + "destinationName": attributeMapping.mappingName + }; + + for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { + if (dataType.apiName === attributeMapping.type){ + tmpEntry.dataType = dataType; + } + } + + $scope.attributeMappings_adminView.push(tmpEntry); + } + + if ($scope.mappingConfigImportSettings.periodOfValidity){ + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; + $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; + $scope.periodOfValidityInvalid = false; + + // update datePickers + if ($scope.periodOfValidity.startDate){ + $("#georesourceAddDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); + } + if ($scope.periodOfValidity.endDate){ + $("#georesourceAddDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); + } + } + + $scope.$digest(); + }; + + $scope.onExportGeoresourceAddMappingConfig = async function(){ + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + }; + + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + + var name = $scope.datasetName; + + var metadataJSON = JSON.stringify(mappingConfigExport); + + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + + if (name){ + fileName += "-" + name; + } + + fileName += ".json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + + + $scope.hideSuccessAlert = function(){ + $("#georesourceAddSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#georesourceAddErrorAlert").hide(); + }; + + $scope.hideMetadataErrorAlert = function(){ + $("#georesourceMetadataImportErrorAlert").hide(); + }; + + $scope.hideMappingConfigErrorAlert = function(){ + $("#georesourceMappingConfigImportErrorAlert").hide(); + }; + + kommonitorMultiStepFormHelperService.registerClickHandler(); + + } +]}); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.js index d5b8b40f3..666bdef08 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('georesourceAddModal', ['kommonitorImporterHelper', 'excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=georesource-add-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.js.map new file mode 100644 index 000000000..d49763a81 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"georesource-add-modal.module.js","sourceRoot":"","sources":["georesource-add-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,0BAA0B,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.ts new file mode 100644 index 000000000..d5b8b40f3 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceAddModal/georesource-add-modal.module.ts @@ -0,0 +1 @@ +angular.module('georesourceAddModal', ['kommonitorImporterHelper', 'excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceBatchUpdateModal/georesource-batch-update-modal.component.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceBatchUpdateModal/georesource-batch-update-modal.component.js index 14e5bce1b..e52bde1d2 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceBatchUpdateModal/georesource-batch-update-modal.component.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceBatchUpdateModal/georesource-batch-update-modal.component.js @@ -1,190 +1,159 @@ +"use strict"; angular.module('georesourceBatchUpdateModal').component('georesourceBatchUpdateModal', { - templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceBatchUpdateModal/georesource-batch-update-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', 'kommonitorBatchUpdateHelperService', '$scope', '$rootScope', '$http', '$timeout', '__env', - function GeoresourceBatchUpdateModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, kommonitorBatchUpdateHelperService, $scope, $rootScope, $http, $timeout, __env) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - this.kommonitorBatchUpdateHelperServiceInstance = kommonitorBatchUpdateHelperService; - - $scope.isFirstStart = true; - $scope.lastUpdateResponseObj; - $scope.keepMissingValues = true; - - /* - { - "converter": { - "encoding": "string", - "mimeType": "string", - "name": "string", - "parameters": [{ - "name": "string", - "value": "string" - }], - "schema": "string" - }, - "dataSource": { - "parameters": [{ - "name": "string", - "value": "string" - }], - "type": "FILE" // FILE|HTTP|INLINE - }, - "propertyMapping": { - "arisenFromProperty": "string", - "attributes": [{ - "mappingName": "string", // target name - "name": "string", // source name - "type": "string" // dataType, [string|integer|float|date] - }], - "identifierProperty": "string", - "keepAttributes": true, // if true, then mapping under attributes is ignored and all attributes are imported with the same attribute name - "nameProperty": "string", - "validEndDateProperty": "string", - "validStartDateProperty": "string" - }, - "periodOfValidity": { - "startDate": "yyyy-mm-tt", - "endDate": "yyyy-mm-tt" - } - } - */ - $scope.batchList = []; - - - // on modal opened - $('#modal-batch-update-georesources').on('show.bs.modal', function () { - // this check is necessary to avoid running the initialize method on opening datepicker modals - if(event) { - if(event.target.id === "button-batch-update-georesources") { - $scope.initialize(); - } - } - }); - - // initializes the modal - $scope.initialize = function() { - - if($scope.isFirstStart) { - kommonitorBatchUpdateHelperService.addNewRowToBatchList("georesource", $scope.batchList) - $scope.isFirstStart = false; - } - - $('#georesourceDefaultColumnDatePickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#georesourceDefaultColumnDatePickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $(document).on("change", ".georesourceMappingTableInputField", function(){ - // get index of changed field - var index = kommonitorBatchUpdateHelperService.getIndexFromId(this.id); - - // get file - var file = this.files[0]; - - // read content - var reader = new FileReader(); - reader.addEventListener('load', function(event) { - kommonitorBatchUpdateHelperService.onMappingTableSelected("georesource", event, index, file, $scope.batchList); - }); - reader.readAsText(file) - }); - - $(document).on("change", ".georesourceDataSourceFileInputField", function(){ - // get index of changed field - var index = kommonitorBatchUpdateHelperService.getIndexFromId(this.id); - - // get file - var file = this.files[0]; - - // read content - var reader = new FileReader(); - reader.addEventListener('load', function() { - kommonitorBatchUpdateHelperService.onDataSourceFileSelected(file, index, $scope.batchList); - }); - reader.readAsText(file) - }); - - $scope.$digest(); - }; - - $scope.loadGeoresourcesBatchList = function() { - $("#georesourcesBatchListFile").files = []; - - // trigger file chooser - $("#georesourcesBatchListFile").trigger("click"); - }; - - $(document).on("change", "#georesourcesBatchListFile" ,function(){ - - // get the file - var file = document.getElementById('georesourcesBatchListFile').files[0]; - kommonitorBatchUpdateHelperService.parseBatchListFromFile("georesource", file, $scope.batchList) - }); - - $scope.$on('georesourceBatchListParsed', function(event, data) { - $timeout(function() { - - var newBatchList = data.newValue; - - // remove all rows - for (var i = 0; i < $scope.batchList.length; i++) - $scope.batchList[i].isSelected = true; - kommonitorBatchUpdateHelperService.deleteSelectedRowsFromBatchList($scope.batchList, $scope.allRowsSelected); - - - for(let i=0;i 0){ - // error handling - $("#georesourcesDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#georesourcesDeleteSuccessAlert").show(); - // } - - $timeout(function(){ - - $scope.loadingData = false; - }); - } - if($scope.successfullyDeletedDatasets.length > 0){ - $("#georesourcesDeleteSuccessAlert").show(); - - // refresh spatial unit overview table - $rootScope.$broadcast("refreshGeoresourceOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => {return dataset.georesourceId;})); - - // refresh all admin dashboard diagrams due to modified metadata - $timeout(function(){ - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - }, 500); - - - $timeout(function(){ - - $scope.loadingData = false; - }); - } - }, function errorCallback(errorArray) { - - $("#georesourcesDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#georesourcesDeleteSuccessAlert").show(); - // } - - $rootScope.$broadcast("refreshGeoresourceOverviewTable"); - $scope.loadingData = false; - }); - - }; - - $scope.getDeleteDatasetPromise = function(dataset){ - return $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + dataset.georesourceId, - method: "DELETE" - }).then(function successCallback(response) { - $scope.successfullyDeletedDatasets.push(dataset); - - // remove entry from array - var index = -1; - - for(var i=0; i< kommonitorDataExchangeService.availableGeoresources.length; i++){ - if(kommonitorDataExchangeService.availableGeoresources[i].georesourceId === dataset.georesourceId){ - index = i; - break; - } - } - - if (index > -1) { - kommonitorDataExchangeService.availableGeoresources.splice(index, 1); - } - - }, function errorCallback(error) { - if(error.data){ - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); - } - else{ - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); - } - }); - }; - - $scope.hideSuccessAlert = function(){ - $("#georesourcesDeleteSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#georesourcesDeleteErrorAlert").hide(); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function GeoresourceDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.datasetsToDelete = []; + $scope.loadingData = false; + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $scope.affectedScripts = []; + $scope.affectedIndicatorReferences = []; + $scope.$on("onDeleteGeoresources", function (event, datasets) { + $scope.loadingData = true; + $scope.datasetsToDelete = datasets; + $scope.resetGeoresourcesDeleteForm(); + $timeout(function () { + $scope.loadingData = false; + }); + }); + $scope.resetGeoresourcesDeleteForm = function () { + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $scope.affectedScripts = $scope.gatherAffectedScripts(); + $scope.affectedIndicatorReferences = $scope.gatherAffectedIndicatorReferences(); + $("#georesourcesDeleteSuccessAlert").hide(); + $("#georesourcesDeleteErrorAlert").hide(); + }; + $scope.gatherAffectedScripts = function () { + $scope.affectedScripts = []; + kommonitorDataExchangeService.availableProcessScripts.forEach(function (script) { + var requiredGeoresourceIds = script.requiredGeoresourceIds; + for (var i = 0; i < requiredGeoresourceIds.length; i++) { + var georesourceId = requiredGeoresourceIds[i]; + for (var k = 0; k < $scope.datasetsToDelete.length; k++) { + var datasetToDelete = $scope.datasetsToDelete[k]; + if (georesourceId === datasetToDelete.georesourceId) { + $scope.affectedScripts.push(script); + break; + } + } + } + }); + return $scope.affectedScripts; + }; + $scope.gatherAffectedIndicatorReferences = function () { + $scope.affectedIndicatorReferences = []; + kommonitorDataExchangeService.availableIndicators.forEach(function (indicator) { + var georesourceReferences = indicator.referencedGeoresources; + for (var i = 0; i < georesourceReferences.length; i++) { + var georesourceReference = georesourceReferences[i]; + for (var k = 0; k < $scope.datasetsToDelete.length; k++) { + var datasetToDelete = $scope.datasetsToDelete[k]; + if (georesourceReference.referencedGeoresourceId === datasetToDelete.georesourceId) { + $scope.affectedIndicatorReferences.push({ + "indicatorMetadata": indicator, + "georesourceReference": georesourceReference + }); + break; + } + } + } + }); + return $scope.affectedIndicatorReferences; + }; + $scope.deleteGeoresources = function () { + $scope.loadingData = true; + var deletePromises = []; + $scope.datasetsToDelete.forEach(function (dataset) { + deletePromises.push($scope.getDeleteDatasetPromise(dataset)); + }); + $q.all(deletePromises).then(async function successCallback(successArray) { + // + if ($scope.failedDatasetsAndErrors.length > 0) { + // error handling + $("#georesourcesDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#georesourcesDeleteSuccessAlert").show(); + // } + $timeout(function () { + $scope.loadingData = false; + }); + } + if ($scope.successfullyDeletedDatasets.length > 0) { + $("#georesourcesDeleteSuccessAlert").show(); + // refresh spatial unit overview table + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => { return dataset.georesourceId; })); + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function () { + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + $timeout(function () { + $scope.loadingData = false; + }); + } + }, function errorCallback(errorArray) { + $("#georesourcesDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#georesourcesDeleteSuccessAlert").show(); + // } + $rootScope.$broadcast("refreshGeoresourceOverviewTable"); + $scope.loadingData = false; + }); + }; + $scope.getDeleteDatasetPromise = function (dataset) { + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + dataset.georesourceId, + method: "DELETE" + }).then(function successCallback(response) { + $scope.successfullyDeletedDatasets.push(dataset); + // remove entry from array + var index = -1; + for (var i = 0; i < kommonitorDataExchangeService.availableGeoresources.length; i++) { + if (kommonitorDataExchangeService.availableGeoresources[i].georesourceId === dataset.georesourceId) { + index = i; + break; + } + } + if (index > -1) { + kommonitorDataExchangeService.availableGeoresources.splice(index, 1); + } + }, function errorCallback(error) { + if (error.data) { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + $scope.hideSuccessAlert = function () { + $("#georesourcesDeleteSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#georesourcesDeleteErrorAlert").hide(); + }; + } + ] +}); +//# sourceMappingURL=georesource-delete-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.component.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.component.js.map new file mode 100644 index 000000000..eb252ada7 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"georesource-delete-modal.component.js","sourceRoot":"","sources":["georesource-delete-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.component.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.component.ts new file mode 100644 index 000000000..d26a22af2 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.component.ts @@ -0,0 +1,181 @@ +angular.module('georesourceDeleteModal').component('georesourceDeleteModal', { + templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function GeoresourceDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.datasetsToDelete = []; + + $scope.loadingData = false; + + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + + $scope.affectedScripts = []; + $scope.affectedIndicatorReferences = []; + + $scope.$on("onDeleteGeoresources", function (event, datasets) { + $scope.loadingData = true; + + $scope.datasetsToDelete = datasets; + + $scope.resetGeoresourcesDeleteForm(); + + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + + + $scope.resetGeoresourcesDeleteForm = function(){ + + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $scope.affectedScripts = $scope.gatherAffectedScripts(); + $scope.affectedIndicatorReferences = $scope.gatherAffectedIndicatorReferences(); + $("#georesourcesDeleteSuccessAlert").hide(); + $("#georesourcesDeleteErrorAlert").hide(); + }; + + $scope.gatherAffectedScripts = function(){ + $scope.affectedScripts = []; + + kommonitorDataExchangeService.availableProcessScripts.forEach(function(script){ + var requiredGeoresourceIds = script.requiredGeoresourceIds; + + for(var i=0; i 0){ + // error handling + $("#georesourcesDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#georesourcesDeleteSuccessAlert").show(); + // } + + $timeout(function(){ + + $scope.loadingData = false; + }); + } + if($scope.successfullyDeletedDatasets.length > 0){ + $("#georesourcesDeleteSuccessAlert").show(); + + // refresh spatial unit overview table + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => {return dataset.georesourceId;})); + + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function(){ + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + + + $timeout(function(){ + + $scope.loadingData = false; + }); + } + }, function errorCallback(errorArray) { + + $("#georesourcesDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#georesourcesDeleteSuccessAlert").show(); + // } + + $rootScope.$broadcast("refreshGeoresourceOverviewTable"); + $scope.loadingData = false; + }); + + }; + + $scope.getDeleteDatasetPromise = function(dataset){ + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + dataset.georesourceId, + method: "DELETE" + }).then(function successCallback(response) { + $scope.successfullyDeletedDatasets.push(dataset); + + // remove entry from array + var index = -1; + + for(var i=0; i< kommonitorDataExchangeService.availableGeoresources.length; i++){ + if(kommonitorDataExchangeService.availableGeoresources[i].georesourceId === dataset.georesourceId){ + index = i; + break; + } + } + + if (index > -1) { + kommonitorDataExchangeService.availableGeoresources.splice(index, 1); + } + + }, function errorCallback(error) { + if(error.data){ + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else{ + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + + $scope.hideSuccessAlert = function(){ + $("#georesourcesDeleteSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#georesourcesDeleteErrorAlert").hide(); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.js index daf6f631a..fa6c7db61 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('georesourceDeleteModal', []); +//# sourceMappingURL=georesource-delete-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.js.map new file mode 100644 index 000000000..b2c367726 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"georesource-delete-modal.module.js","sourceRoot":"","sources":["georesource-delete-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.ts new file mode 100644 index 000000000..daf6f631a --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceDeleteModal/georesource-delete-modal.module.ts @@ -0,0 +1 @@ +angular.module('georesourceDeleteModal', []); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.js index 61e0450c0..487dcb6e5 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.js @@ -1,1016 +1,799 @@ +"use strict"; angular.module('georesourceEditFeaturesModal').component('georesourceEditFeaturesModal', { - templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorSingleFeatureMapHelperService', - 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', - function GeoresourcesEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, kommonitorSingleFeatureMapHelperService, - kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; - this.kommonitorSingleFeatureMapHelperServiceInstance = kommonitorSingleFeatureMapHelperService; - - /* PUT BODY - { - "geoJsonString": "geoJsonString", - "periodOfValidity": { - "endDate": "2000-01-23", - "startDate": "2000-01-23" - } - } - */ - - //Date picker - $('#georesourceEditFeaturesDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#georesourceEditFeaturesDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#georesourceSingleFeatureDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#georesourceSingleFeatureDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $scope.georesourceFeaturesGeoJSON; - $scope.currentGeoresourceDataset; - $scope.remainingFeatureHeaders; - - $scope.georesourceMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); - $scope.georesourceMappingConfigImportError; - - $scope.loadingData = false; - - // variables for single feature import - $scope.featureIdValue = 0; - $scope.featureIdExampleString = undefined; - $scope.featureIdIsValid = false; - $scope.featureNameValue = undefined; - $scope.featureGeometryValue = undefined; - $scope.featureStartDateValue = undefined; - $scope.featureEndDateValue = undefined; - // [{property: name, value: value}] - $scope.featureSchemaProperties = []; - $scope.schemaObject; - - $scope.isPartialUpdate = false; - - // variables for multiple feature import - - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = undefined; - $scope.periodOfValidity.endDate = undefined; - $scope.periodOfValidityInvalid = false; - - $scope.georesourceEditFeaturesDataSourceInputInvalidReason = undefined; - $scope.georesourceEditFeaturesDataSourceInputInvalid = false; - $scope.georesourceDataSourceIdProperty = undefined; - $scope.georesourceDataSourceNameProperty = undefined; - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.featureInfoText_singleFeatureAddMenu = undefined; - $scope.mimeType = undefined; - $scope.datasourceType = undefined; - $scope.georesourceDataSourceIdProperty = undefined; - $scope.georesourceDataSourceNameProperty = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.putBody_georesources = undefined; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_data = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - $scope.attributeMappings_adminView = []; - $scope.keepAttributes = true; - $scope.keepMissingValues = true; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.importerErrors = undefined; - - $scope.$on("onEditGeoresourceFeatures", function (event, georesourceDataset) { - kommonitorMultiStepFormHelperService.registerClickHandler(); - if($scope.currentGeoresourceDataset && $scope.currentGeoresourceDataset.datasetName === georesourceDataset.datasetName){ - return; - } - else{ - $scope.currentGeoresourceDataset = georesourceDataset; - - // $scope.refreshGeoresourceEditFeaturesOverviewTable(); - - $scope.resetGeoresourceEditFeaturesForm(); - - kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", [], []); - - } - - }); - - $scope.initSingleFeatureAddMenu = async function(){ - // init geomap for single feature import, handling geocoding and feature geometry - let domId = "singleFeatureGeoMap"; - let resourceType = kommonitorSingleFeatureMapHelperService.resourceType_point; - if($scope.currentGeoresourceDataset.isLOI){ - resourceType = kommonitorSingleFeatureMapHelperService.resourceType_line; - } - else if($scope.currentGeoresourceDataset.isAOI){ - resourceType = kommonitorSingleFeatureMapHelperService.resourceType_polygon; - } - kommonitorSingleFeatureMapHelperService.initSingleFeatureGeoMap(domId, resourceType); - - // init featureSchema for single feature import - await $scope.initFeatureSchema(); - - // add data layer to singleFeatureMap - $http({ - url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", - method: "GET", - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $scope.georesourceFeaturesGeoJSON = response.data; - kommonitorSingleFeatureMapHelperService.addDataLayertoSingleFeatureGeoMap($scope.georesourceFeaturesGeoJSON); - - $scope.featureInfoText_singleFeatureAddMenu = "" + $scope.georesourceFeaturesGeoJSON.features.length + " weitere Features im Datensatz vorhanden"; - - //once the dataset features are fetched we may make a proposal for the ID of a new Feature - $scope.featureIdValue = $scope.generateIdProposalFromExistingFeatures(); - $scope.addExampleValuesToSchemaProperties(); - - }, function errorCallback(error) { - $scope.featureInfoText_singleFeatureAddMenu = "Keine weiteren Features im Datensatz vorhanden oder Fehler bei Abruf"; - }).finally(function (){ - $scope.validateSingleFeatureId(); - // $timeout(function(){ - - // $scope.$digest(); - // }, 250); - }); - } - - $scope.generateIdProposalFromExistingFeatures = function(){ - if (! $scope.georesourceFeaturesGeoJSON){ - return 0; - } - // String or Integer - let idDataType = $scope.schemaObject[__env.FEATURE_ID_PROPERTY_NAME]; - - // array of id values - let existingFeatureIds = $scope.georesourceFeaturesGeoJSON.features.map(feature => { - if(feature.properties[__env.FEATURE_ID_PROPERTY_NAME]){ - return feature.properties[__env.FEATURE_ID_PROPERTY_NAME]; - } - else{ - return 0; - } - }); - - let length = existingFeatureIds.length; - $scope.featureIdExampleString = "" + existingFeatureIds[0] + "; " + existingFeatureIds[Math.round(length/2) ] + "; " + existingFeatureIds[length - 1]; - - if(idDataType == "Integer" || idDataType == "Double"){ - return $scope.generateIdProposalFromExistingFeatures_numeric(existingFeatureIds); - } - else{ - // generate UUID - return $scope.generateIdProposalFromExistingFeatures_uuid(existingFeatureIds); - } - }; - - $scope.generateIdProposalFromExistingFeatures_numeric = function(existingFeatureIds){ - - // determine max value - let maxValue = Math.max(...existingFeatureIds); - - // return increment - return maxValue + 1; - }; - - $scope.generateIdProposalFromExistingFeatures_uuid = function(existingFeatureIds){ - // return UUID using UUID library - return uuidv4(); - }; - - $scope.validateSingleFeatureId = function(){ - $scope.featureIdIsValid = true; - if($scope.georesourceFeaturesGeoJSON && $scope.featureIdValue){ - let filteredFeatures = $scope.georesourceFeaturesGeoJSON.features.filter(feature => feature.properties[__env.FEATURE_ID_PROPERTY_NAME] == $scope.featureIdValue); - - if(filteredFeatures.length == 0){ - $scope.featureIdIsValid = true; - } - else{ - $scope.featureIdIsValid = false; - } - return $scope.featureIdIsValid; - } - else{ - // no other data available in dataset - if ($scope.featureIdValue == undefined || $scope.featureIdValue == null){ - $scope.featureIdIsValid = false; - } - else{ - $scope.featureIdIsValid = true; - } - } - - return $scope.featureIdIsValid; - }; - - $scope.initFeatureSchema = async function(){ - $scope.featureSchemaProperties = []; - - return await $http({ - url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/schema", - method: "GET", - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $scope.schemaObject = response.data; - - for (var property in $scope.schemaObject){ - if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME){ - $scope.featureSchemaProperties.push( - {property: property, - value: undefined} - ); - } - } - - return $scope.schemaObject; - - }, function errorCallback(error) { - - }); - }; - - $scope.addExampleValuesToSchemaProperties = function(){ - if ($scope.georesourceFeaturesGeoJSON && $scope.featureSchemaProperties && $scope.georesourceFeaturesGeoJSON.features && $scope.georesourceFeaturesGeoJSON.features[0]){ - let exampleFeature = $scope.georesourceFeaturesGeoJSON.features[0]; - for (const element of $scope.featureSchemaProperties) { - element.exampleValue = exampleFeature.properties[element.property]; - } - } - }; - - $scope.addSingleGeoresourceFeature = async function(){ - - $timeout(function(){ - $scope.loadingData = true; - }); - - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - /* - now collect data and build request for importer - */ - - var allDataSpecified = await $scope.buildImporterObjects_singleFeatureImport(); - - // TODO Create and perform POST Request with loading screen - - var updateGeoresourceResponse_dryRun = undefined; - try { - updateGeoresourceResponse_dryRun = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, true); - - // this callback will be called asynchronously - // when the response is available - - - - - if(! kommonitorImporterHelperService.importerResponseContainsErrors(updateGeoresourceResponse_dryRun)){ - // all good, really execute the request to import data against data management API - var updateGeoresourceResponse = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, false); - - $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); - - $scope.refreshGeoresourceEditFeaturesOverviewTable(); - $scope.initSingleFeatureAddMenu(); - - $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; - $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateGeoresourceResponse); - - // as the update was successfull we must prevent the user from importing the same object again - $scope.featureIdIsValid = false; - // add the new feature to current dataset! - if($scope.georesourceFeaturesGeoJSON){ - $scope.georesourceFeaturesGeoJSON.features.push($scope.featureGeometryValue.features[0]); - } - else{ - $scope.georesourceFeaturesGeoJSON = turf.featureCollection([ - $scope.featureGeometryValue.features[0] - ]); - } - - - $("#georesourceEditFeaturesSuccessAlert").show(); - $scope.loadingData = false; - } - else{ - // errors ocurred - // show them - $scope.errorMessagePart = "Das zu importierende Feature des Datensatzes weist kritische Fehler auf"; - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); - - $("#georesourceEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - - } - } catch (error) { - console.error(error); - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - if(updateGeoresourceResponse_dryRun){ - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); - } - - $("#georesourceEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - }; - - $scope.$on("onUpdateSingleFeatureGeometry", function(event, geoJSON){ - $scope.featureGeometryValue = geoJSON; - $scope.$digest(); - }); - - $scope.refreshGeoresourceEditFeaturesOverviewTable = function(){ - - $scope.loadingData = true; - // fetch all georesource features - $http({ - url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", - method: "GET", - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $scope.georesourceFeaturesGeoJSON = response.data; - - var tmpRemainingHeaders = []; - - for (var property in $scope.georesourceFeaturesGeoJSON.features[0].properties){ - if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME){ - tmpRemainingHeaders.push(property); - } - } - - $scope.remainingFeatureHeaders = tmpRemainingHeaders; - - // as we require the information about the dataset ID within each feature to enable feature record updates from within the datatable - // we must include the dataset ID within each feature - - kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", tmpRemainingHeaders, $scope.georesourceFeaturesGeoJSON.features, $scope.currentGeoresourceDataset.georesourceId, kommonitorDataGridHelperService.resourceType_georesource, $scope.enableDeleteFeatures); - - - $scope.loadingData = false; - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#georesourceEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - }); - }; - - $scope.clearAllGeoresourceFeatures = function(){ - $scope.loadingData = true; - // delete all georesource features - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", - method: "DELETE", - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $scope.georesourceFeaturesGeoJSON = undefined; - $scope.remainingFeatureHeaders = undefined; - - $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); - // empty data grid as all data has been deleted - kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", [], []); - // reset whole form - $scope.resetGeoresourceEditFeaturesForm(); - - $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; - - $("#georesourceEditFeaturesSuccessAlert").show(); - $scope.loadingData = false; - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#georesourceEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - }); - }; - - $scope.resetGeoresourceEditFeaturesForm = function(){ - - // reset edit banners - kommonitorDataGridHelperService.featureTable_georesource_lastUpdate_timestamp_success = undefined; - kommonitorDataGridHelperService.featureTable_georesource_lastUpdate_timestamp_failure = undefined; - - // variables for single feature import - $scope.featureIdValue = 0; - $scope.featureIdExampleString = undefined; - $scope.featureIdIsValid = false; - $scope.featureNameValue = undefined; - $scope.featureGeometryValue = undefined; - $scope.featureStartDateValue = undefined; - $scope.featureEndDateValue = undefined; - // [{property: name, value: value}] - $scope.featureSchemaProperties = []; - - // reinit single feature add menu - $scope.initSingleFeatureAddMenu(); - - //variables for multiple feature import - - $scope.georesourceFeaturesGeoJSON = undefined; - $scope.remainingFeatureHeaders = undefined; - - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = undefined; - $scope.periodOfValidity.endDate = undefined; - $scope.periodOfValidityInvalid = false; - - $scope.georesourceEditFeaturesDataSourceInputInvalidReason = undefined; - $scope.georesourceEditFeaturesDataSourceInputInvalid = false; - $scope.georesourceDataSourceIdProperty = undefined; - $scope.georesourceDataSourceNameProperty = undefined; - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.mimeType = undefined; - $scope.featureInfoText_singleFeatureAddMenu = undefined; - $scope.datasourceType = undefined; - $scope.georesourceDataSourceIdProperty = undefined; - $scope.georesourceDataSourceNameProperty = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.putBody_georesources = undefined; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_data = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - $scope.attributeMappings_adminView = []; - $scope.keepAttributes = true; - $scope.keepMissingValues = true; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.importerErrors = undefined; - - $("#georesourceEditFeaturesSuccessAlert").hide(); - $("#georesourceEditFeaturesErrorAlert").hide(); - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onChangeConverter = function(){ - $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; - $scope.mimeType = $scope.converter.mimeTypes[0]; - }; - - $scope.onChangeMimeType = function(mimeType){ - $scope.mimeType = mimeType; - }; - - $scope.filterByKomMonitorProperties = function() { - return function( item ) { - - try{ - if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate"){ - return false; - } - return true; - } - catch(error){ - return false; - } - }; - }; - - $scope.getFeatureId = function(geojsonFeature){ - return geojsonFeature.properties[__env.FEATURE_ID_PROPERTY_NAME]; - }; - - $scope.getFeatureName = function(geojsonFeature){ - return geojsonFeature.properties[__env.FEATURE_NAME_PROPERTY_NAME]; - }; - - $scope.checkPeriodOfValidity = function(){ - $scope.periodOfValidityInvalid = false; - if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate){ - var startDate = new Date($scope.periodOfValidity.startDate); - var endDate = new Date($scope.periodOfValidity.endDate); - - if ((startDate === endDate) || startDate > endDate){ - // failure - $scope.periodOfValidityInvalid = true; - } - } - }; - - $scope.onAddOrUpdateAttributeMapping = function(){ - var tmpAttributeMapping_adminView = { - "sourceName": $scope.attributeMapping_sourceAttributeName, - "destinationName": $scope.attributeMapping_destinationAttributeName, - "dataType": $scope.attributeMapping_attributeType - }; - - var processed = false; - - for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { - var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; - - if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName){ - // replace object - $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; - processed = true; - break; - } - } - - if(! processed){ - // new entry - $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); - } - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickEditAttributeMapping = function(attributeMappingEntry){ - $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; - $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; - $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickDeleteAttributeMapping = function(attributeMappingEntry){ - for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { - - if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName){ - // remove object - $scope.attributeMappings_adminView.splice(index, 1); - break; - } - } - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.buildImporterObjects_singleFeatureImport = async function(){ - $scope.converterDefinition = kommonitorImporterHelperService.converterDefinition_singleFeatureImport; - $scope.datasourceTypeDefinition = kommonitorImporterHelperService.datasourceDefinition_singleFeatureImport; - $scope.propertyMappingDefinition = kommonitorImporterHelperService.propertyMappingDefinition_singleFeatureImport; - - // make geoJSON FeatureCollection and fill feature properties from single feature menu - $scope.featureGeometryValue.features[0].properties[__env.FEATURE_ID_PROPERTY_NAME] = $scope.featureIdValue; - $scope.featureGeometryValue.features[0].properties[__env.FEATURE_NAME_PROPERTY_NAME] = $scope.featureNameValue; - $scope.featureGeometryValue.features[0].properties[__env.VALID_START_DATE_PROPERTY_NAME] = $scope.featureStartDateValue; - $scope.featureGeometryValue.features[0].properties[__env.VALID_END_DATE_PROPERTY_NAME] = $scope.featureEndDateValue; - - for (const element of $scope.featureSchemaProperties) { - $scope.featureGeometryValue.features[0].properties[element.property] = element.value; - } - - $scope.datasourceTypeDefinition.parameters[0].value = JSON.stringify($scope.featureGeometryValue); - - var scopeProperties = { - "periodOfValidity": { - "endDate": $scope.featureEndDateValue, - "startDate": $scope.featureStartDateValue - }, - "isPartialUpdate": true - }; - $scope.putBody_georesources = kommonitorImporterHelperService.buildPutBody_georesources(scopeProperties); - - if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_georesources){ - return false; - } - - return true; - }; - - $scope.buildImporterObjects = async function(){ - $scope.converterDefinition = $scope.buildConverterDefinition(); - $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - - var scopeProperties = { - "periodOfValidity": { - "endDate": $scope.periodOfValidity.endDate, - "startDate": $scope.periodOfValidity.startDate - }, - "isPartialUpdate": $scope.isPartialUpdate - } - $scope.putBody_georesources = kommonitorImporterHelperService.buildPutBody_georesources(scopeProperties); - - if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_georesources){ - return false; - } - - return true; - }; - - $scope.buildConverterDefinition = function(){ - - return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_georesourceEditFeatures_", $scope.schema, $scope.mimeType); - }; - - $scope.buildDatasourceTypeDefinition = async function(){ - try { - return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_georesourceEditFeatures_', 'georesourceDataSourceInput_editFeatures'); - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#georesourceEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - return null; - } - }; - - $scope.buildPropertyMappingDefinition = function(){ - // arsion from is undefined currently - return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.georesourceDataSourceNameProperty, $scope.georesourceDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); - }; - - $scope.editGeoresourceFeatures = async function(){ - - $timeout(function(){ - $scope.loadingData = true; - }); - - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - /* - now collect data and build request for importer - */ - - /* - if any required importer data is missing --> cancel request and highlight required errors - */ - var allDataSpecified = await $scope.buildImporterObjects(); - - if (!allDataSpecified) { - - $("#georesourceEditFeaturesForm").validator("update"); - $("#georesourceEditFeaturesForm").validator("validate"); - return; - } - else { - - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - var updateGeoresourceResponse_dryRun = undefined; - try { - updateGeoresourceResponse_dryRun = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, true); - - // this callback will be called asynchronously - // when the response is available - - - - - if(! kommonitorImporterHelperService.importerResponseContainsErrors(updateGeoresourceResponse_dryRun)){ - // all good, really execute the request to import data against data management API - var updateGeoresourceResponse = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, false); - - $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); - $scope.refreshGeoresourceEditFeaturesOverviewTable(); - $scope.initSingleFeatureAddMenu(); - - $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; - $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateGeoresourceResponse); - - $("#georesourceEditFeaturesSuccessAlert").show(); - $scope.loadingData = false; - } - else{ - // errors ocurred - // show them - $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); - - $("#georesourceEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - - } - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - if(updateGeoresourceResponse_dryRun){ - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); - } - - $("#georesourceEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - } - }; - - $scope.onImportGeoresourceEditFeaturesMappingConfig = function(){ - - $scope.georesourceMappingConfigImportError = ""; - - $("#georesourceMappingConfigEditFeaturesImportFile").files = []; - - // trigger file chooser - $("#georesourceMappingConfigEditFeaturesImportFile").click(); - - }; - - $(document).on("change", "#georesourceMappingConfigEditFeaturesImportFile" ,function(){ - - console.log("Importing Importer Mapping Config for EditFeatures Georesource Form"); - - // get the file - var file = document.getElementById('georesourceMappingConfigEditFeaturesImportFile').files[0]; - $scope.parseMappingConfigFromFile(file); - }); - - $scope.parseMappingConfigFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMappingConfigFile(event); - } - catch(error){ - console.error(error); - console.error("Uploaded MappingConfig File cannot be parsed."); - $scope.georesourceMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; - document.getElementById("georesourcesEditFeaturesMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; - $("#georesourceEditFeaturesMappingConfigImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMappingConfigFile = function(event){ - $scope.mappingConfigImportSettings = JSON.parse(event.target.result); - - if(! $scope.mappingConfigImportSettings.converter || ! $scope.mappingConfigImportSettings.dataSource || ! $scope.mappingConfigImportSettings.propertyMapping){ - console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); - $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("georesourcesEditFeaturesMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; - $("#georesourceEditFeaturesMappingConfigImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.converter = undefined; - for(var converter of kommonitorImporterHelperService.availableConverters){ - if (converter.name === $scope.mappingConfigImportSettings.converter.name){ - $scope.converter = converter; - break; - } - } - - $scope.schema = undefined; - if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema){ - for (var schema of $scope.converter.schemas) { - if (schema === $scope.mappingConfigImportSettings.converter.schema){ - $scope.schema = schema; - } - } - } - - $scope.mimeType = undefined; - if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType){ - for (var mimeType of $scope.converter.mimeTypes) { - if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType){ - $scope.mimeType = mimeType; - } - } - } - - $scope.datasourceType = undefined; - for(var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes){ - if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type){ - $scope.datasourceType = datasourceType; - break; - } - } - - $scope.$digest(); - - // converter parameters - if ($scope.converter){ - for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { - $("#converterParameter_georesourceEditFeatures_" + convParameter.name).val(convParameter.value); - } - } - - // datasourceTypes parameters - if ($scope.datasourceType){ - for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { - $("#datasourceTypeParameter_georesourceEditFeatures_" + dsParameter.name).val(dsParameter.value); - } - } - - // property Mapping - $scope.georesourceDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; - $scope.georesourceDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; - $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; - $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; - $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; - $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; - $scope.attributeMappings_adminView = []; - - for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { - var tmpEntry = { - "sourceName": attributeMapping.name, - "destinationName": attributeMapping.mappingName - }; - - for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { - if (dataType.apiName === attributeMapping.type){ - tmpEntry.dataType = dataType; - } - } - - $scope.attributeMappings_adminView.push(tmpEntry); - } - - if ($scope.mappingConfigImportSettings.periodOfValidity){ - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; - $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; - $scope.periodOfValidityInvalid = false; - - // update datePickers - if ($scope.periodOfValidity.startDate){ - $("#georesourceEditFeaturesDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); - } - if ($scope.periodOfValidity.endDate){ - $("#georesourceEditFeaturesDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); - } - } - - $scope.$digest(); - }; - - $scope.onExportGeoresourceEditFeaturesMappingConfig = async function(){ - var converterDefinition = $scope.buildConverterDefinition(); - var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - - var mappingConfigExport = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - }; - - mappingConfigExport.periodOfValidity = $scope.periodOfValidity; - - var name = $scope.datasetName; - - var metadataJSON = JSON.stringify(mappingConfigExport); - - var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; - - if (name){ - fileName += "-" + name; - } - - fileName += ".json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - - $scope.hideSuccessAlert = function(){ - $("#georesourceEditFeaturesSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#georesourceEditFeaturesErrorAlert").hide(); - }; - - $scope.hideMappingConfigErrorAlert = function(){ - $("#georesourceEditFeaturesMappingConfigImportErrorAlert").hide(); - }; - - $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_georesource, function(event){ - $timeout(function(){ - - $scope.loadingData = true; - }); - }); - - $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_georesource, function(event){ - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - - $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_georesource, function(event){ - $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); - $scope.refreshGeoresourceEditFeaturesOverviewTable(); - }); - - $scope.onChangeEnableDeleteFeatures = function(){ - if($scope.enableDeleteFeatures){ - $(".georesourceDeleteFeatureRecordBtn").attr("disabled", false); - } - else{ - $(".georesourceDeleteFeatureRecordBtn").attr("disabled", true); - } - } - - } -]}); + templateUrl: "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorSingleFeatureMapHelperService', + 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + function GeoresourcesEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, kommonitorSingleFeatureMapHelperService, kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; + this.kommonitorSingleFeatureMapHelperServiceInstance = kommonitorSingleFeatureMapHelperService; + /* PUT BODY + { + "geoJsonString": "geoJsonString", + "periodOfValidity": { + "endDate": "2000-01-23", + "startDate": "2000-01-23" + } + } + */ + //Date picker + $('#georesourceEditFeaturesDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceEditFeaturesDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceSingleFeatureDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceSingleFeatureDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + $scope.georesourceFeaturesGeoJSON; + $scope.currentGeoresourceDataset; + $scope.remainingFeatureHeaders; + $scope.georesourceMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); + $scope.georesourceMappingConfigImportError; + $scope.loadingData = false; + // variables for single feature import + $scope.featureIdValue = 0; + $scope.featureIdExampleString = undefined; + $scope.featureIdIsValid = false; + $scope.featureNameValue = undefined; + $scope.featureGeometryValue = undefined; + $scope.featureStartDateValue = undefined; + $scope.featureEndDateValue = undefined; + // [{property: name, value: value}] + $scope.featureSchemaProperties = []; + $scope.schemaObject; + $scope.isPartialUpdate = false; + // variables for multiple feature import + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + $scope.georesourceEditFeaturesDataSourceInputInvalidReason = undefined; + $scope.georesourceEditFeaturesDataSourceInputInvalid = false; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + $scope.converter = undefined; + $scope.schema = undefined; + $scope.featureInfoText_singleFeatureAddMenu = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_georesources = undefined; + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + $scope.$on("onEditGeoresourceFeatures", function (event, georesourceDataset) { + kommonitorMultiStepFormHelperService.registerClickHandler(); + if ($scope.currentGeoresourceDataset && $scope.currentGeoresourceDataset.datasetName === georesourceDataset.datasetName) { + return; + } + else { + $scope.currentGeoresourceDataset = georesourceDataset; + // $scope.refreshGeoresourceEditFeaturesOverviewTable(); + $scope.resetGeoresourceEditFeaturesForm(); + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", [], []); + } + }); + $scope.initSingleFeatureAddMenu = async function () { + // init geomap for single feature import, handling geocoding and feature geometry + let domId = "singleFeatureGeoMap"; + let resourceType = kommonitorSingleFeatureMapHelperService.resourceType_point; + if ($scope.currentGeoresourceDataset.isLOI) { + resourceType = kommonitorSingleFeatureMapHelperService.resourceType_line; + } + else if ($scope.currentGeoresourceDataset.isAOI) { + resourceType = kommonitorSingleFeatureMapHelperService.resourceType_polygon; + } + kommonitorSingleFeatureMapHelperService.initSingleFeatureGeoMap(domId, resourceType); + // init featureSchema for single feature import + await $scope.initFeatureSchema(); + // add data layer to singleFeatureMap + $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $scope.georesourceFeaturesGeoJSON = response.data; + kommonitorSingleFeatureMapHelperService.addDataLayertoSingleFeatureGeoMap($scope.georesourceFeaturesGeoJSON); + $scope.featureInfoText_singleFeatureAddMenu = "" + $scope.georesourceFeaturesGeoJSON.features.length + " weitere Features im Datensatz vorhanden"; + //once the dataset features are fetched we may make a proposal for the ID of a new Feature + $scope.featureIdValue = $scope.generateIdProposalFromExistingFeatures(); + $scope.addExampleValuesToSchemaProperties(); + }, function errorCallback(error) { + $scope.featureInfoText_singleFeatureAddMenu = "Keine weiteren Features im Datensatz vorhanden oder Fehler bei Abruf"; + }).finally(function () { + $scope.validateSingleFeatureId(); + // $timeout(function(){ + // $scope.$digest(); + // }, 250); + }); + }; + $scope.generateIdProposalFromExistingFeatures = function () { + if (!$scope.georesourceFeaturesGeoJSON) { + return 0; + } + // String or Integer + let idDataType = $scope.schemaObject[__env.FEATURE_ID_PROPERTY_NAME]; + // array of id values + let existingFeatureIds = $scope.georesourceFeaturesGeoJSON.features.map(feature => { + if (feature.properties[__env.FEATURE_ID_PROPERTY_NAME]) { + return feature.properties[__env.FEATURE_ID_PROPERTY_NAME]; + } + else { + return 0; + } + }); + let length = existingFeatureIds.length; + $scope.featureIdExampleString = "" + existingFeatureIds[0] + "; " + existingFeatureIds[Math.round(length / 2)] + "; " + existingFeatureIds[length - 1]; + if (idDataType == "Integer" || idDataType == "Double") { + return $scope.generateIdProposalFromExistingFeatures_numeric(existingFeatureIds); + } + else { + // generate UUID + return $scope.generateIdProposalFromExistingFeatures_uuid(existingFeatureIds); + } + }; + $scope.generateIdProposalFromExistingFeatures_numeric = function (existingFeatureIds) { + // determine max value + let maxValue = Math.max(...existingFeatureIds); + // return increment + return maxValue + 1; + }; + $scope.generateIdProposalFromExistingFeatures_uuid = function (existingFeatureIds) { + // return UUID using UUID library + return uuidv4(); + }; + $scope.validateSingleFeatureId = function () { + $scope.featureIdIsValid = true; + if ($scope.georesourceFeaturesGeoJSON && $scope.featureIdValue) { + let filteredFeatures = $scope.georesourceFeaturesGeoJSON.features.filter(feature => feature.properties[__env.FEATURE_ID_PROPERTY_NAME] == $scope.featureIdValue); + if (filteredFeatures.length == 0) { + $scope.featureIdIsValid = true; + } + else { + $scope.featureIdIsValid = false; + } + return $scope.featureIdIsValid; + } + else { + // no other data available in dataset + if ($scope.featureIdValue == undefined || $scope.featureIdValue == null) { + $scope.featureIdIsValid = false; + } + else { + $scope.featureIdIsValid = true; + } + } + return $scope.featureIdIsValid; + }; + $scope.initFeatureSchema = async function () { + $scope.featureSchemaProperties = []; + return await $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/schema", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $scope.schemaObject = response.data; + for (var property in $scope.schemaObject) { + if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME) { + $scope.featureSchemaProperties.push({ property: property, + value: undefined }); + } + } + return $scope.schemaObject; + }, function errorCallback(error) { + }); + }; + $scope.addExampleValuesToSchemaProperties = function () { + if ($scope.georesourceFeaturesGeoJSON && $scope.featureSchemaProperties && $scope.georesourceFeaturesGeoJSON.features && $scope.georesourceFeaturesGeoJSON.features[0]) { + let exampleFeature = $scope.georesourceFeaturesGeoJSON.features[0]; + for (const element of $scope.featureSchemaProperties) { + element.exampleValue = exampleFeature.properties[element.property]; + } + } + }; + $scope.addSingleGeoresourceFeature = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + /* + now collect data and build request for importer + */ + var allDataSpecified = await $scope.buildImporterObjects_singleFeatureImport(); + // TODO Create and perform POST Request with loading screen + var updateGeoresourceResponse_dryRun = undefined; + try { + updateGeoresourceResponse_dryRun = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, true); + // this callback will be called asynchronously + // when the response is available + if (!kommonitorImporterHelperService.importerResponseContainsErrors(updateGeoresourceResponse_dryRun)) { + // all good, really execute the request to import data against data management API + var updateGeoresourceResponse = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, false); + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + $scope.refreshGeoresourceEditFeaturesOverviewTable(); + $scope.initSingleFeatureAddMenu(); + $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateGeoresourceResponse); + // as the update was successfull we must prevent the user from importing the same object again + $scope.featureIdIsValid = false; + // add the new feature to current dataset! + if ($scope.georesourceFeaturesGeoJSON) { + $scope.georesourceFeaturesGeoJSON.features.push($scope.featureGeometryValue.features[0]); + } + else { + $scope.georesourceFeaturesGeoJSON = turf.featureCollection([ + $scope.featureGeometryValue.features[0] + ]); + } + $("#georesourceEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + } + else { + // errors ocurred + // show them + $scope.errorMessagePart = "Das zu importierende Feature des Datensatzes weist kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + catch (error) { + console.error(error); + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if (updateGeoresourceResponse_dryRun) { + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); + } + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + }; + $scope.$on("onUpdateSingleFeatureGeometry", function (event, geoJSON) { + $scope.featureGeometryValue = geoJSON; + $scope.$digest(); + }); + $scope.refreshGeoresourceEditFeaturesOverviewTable = function () { + $scope.loadingData = true; + // fetch all georesource features + $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $scope.georesourceFeaturesGeoJSON = response.data; + var tmpRemainingHeaders = []; + for (var property in $scope.georesourceFeaturesGeoJSON.features[0].properties) { + if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME) { + tmpRemainingHeaders.push(property); + } + } + $scope.remainingFeatureHeaders = tmpRemainingHeaders; + // as we require the information about the dataset ID within each feature to enable feature record updates from within the datatable + // we must include the dataset ID within each feature + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", tmpRemainingHeaders, $scope.georesourceFeaturesGeoJSON.features, $scope.currentGeoresourceDataset.georesourceId, kommonitorDataGridHelperService.resourceType_georesource, $scope.enableDeleteFeatures); + $scope.loadingData = false; + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + }); + }; + $scope.clearAllGeoresourceFeatures = function () { + $scope.loadingData = true; + // delete all georesource features + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", + method: "DELETE", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $scope.georesourceFeaturesGeoJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + // empty data grid as all data has been deleted + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", [], []); + // reset whole form + $scope.resetGeoresourceEditFeaturesForm(); + $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; + $("#georesourceEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + }); + }; + $scope.resetGeoresourceEditFeaturesForm = function () { + // reset edit banners + kommonitorDataGridHelperService.featureTable_georesource_lastUpdate_timestamp_success = undefined; + kommonitorDataGridHelperService.featureTable_georesource_lastUpdate_timestamp_failure = undefined; + // variables for single feature import + $scope.featureIdValue = 0; + $scope.featureIdExampleString = undefined; + $scope.featureIdIsValid = false; + $scope.featureNameValue = undefined; + $scope.featureGeometryValue = undefined; + $scope.featureStartDateValue = undefined; + $scope.featureEndDateValue = undefined; + // [{property: name, value: value}] + $scope.featureSchemaProperties = []; + // reinit single feature add menu + $scope.initSingleFeatureAddMenu(); + //variables for multiple feature import + $scope.georesourceFeaturesGeoJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + $scope.georesourceEditFeaturesDataSourceInputInvalidReason = undefined; + $scope.georesourceEditFeaturesDataSourceInputInvalid = false; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.featureInfoText_singleFeatureAddMenu = undefined; + $scope.datasourceType = undefined; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_georesources = undefined; + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + $("#georesourceEditFeaturesSuccessAlert").hide(); + $("#georesourceEditFeaturesErrorAlert").hide(); + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onChangeConverter = function () { + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + $scope.onChangeMimeType = function (mimeType) { + $scope.mimeType = mimeType; + }; + $scope.filterByKomMonitorProperties = function () { + return function (item) { + try { + if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate") { + return false; + } + return true; + } + catch (error) { + return false; + } + }; + }; + $scope.getFeatureId = function (geojsonFeature) { + return geojsonFeature.properties[__env.FEATURE_ID_PROPERTY_NAME]; + }; + $scope.getFeatureName = function (geojsonFeature) { + return geojsonFeature.properties[__env.FEATURE_NAME_PROPERTY_NAME]; + }; + $scope.checkPeriodOfValidity = function () { + $scope.periodOfValidityInvalid = false; + if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate) { + var startDate = new Date($scope.periodOfValidity.startDate); + var endDate = new Date($scope.periodOfValidity.endDate); + if ((startDate === endDate) || startDate > endDate) { + // failure + $scope.periodOfValidityInvalid = true; + } + } + }; + $scope.onAddOrUpdateAttributeMapping = function () { + var tmpAttributeMapping_adminView = { + "sourceName": $scope.attributeMapping_sourceAttributeName, + "destinationName": $scope.attributeMapping_destinationAttributeName, + "dataType": $scope.attributeMapping_attributeType + }; + var processed = false; + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; + if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName) { + // replace object + $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; + processed = true; + break; + } + } + if (!processed) { + // new entry + $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); + } + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickEditAttributeMapping = function (attributeMappingEntry) { + $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; + $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; + $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickDeleteAttributeMapping = function (attributeMappingEntry) { + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName) { + // remove object + $scope.attributeMappings_adminView.splice(index, 1); + break; + } + } + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.buildImporterObjects_singleFeatureImport = async function () { + $scope.converterDefinition = kommonitorImporterHelperService.converterDefinition_singleFeatureImport; + $scope.datasourceTypeDefinition = kommonitorImporterHelperService.datasourceDefinition_singleFeatureImport; + $scope.propertyMappingDefinition = kommonitorImporterHelperService.propertyMappingDefinition_singleFeatureImport; + // make geoJSON FeatureCollection and fill feature properties from single feature menu + $scope.featureGeometryValue.features[0].properties[__env.FEATURE_ID_PROPERTY_NAME] = $scope.featureIdValue; + $scope.featureGeometryValue.features[0].properties[__env.FEATURE_NAME_PROPERTY_NAME] = $scope.featureNameValue; + $scope.featureGeometryValue.features[0].properties[__env.VALID_START_DATE_PROPERTY_NAME] = $scope.featureStartDateValue; + $scope.featureGeometryValue.features[0].properties[__env.VALID_END_DATE_PROPERTY_NAME] = $scope.featureEndDateValue; + for (const element of $scope.featureSchemaProperties) { + $scope.featureGeometryValue.features[0].properties[element.property] = element.value; + } + $scope.datasourceTypeDefinition.parameters[0].value = JSON.stringify($scope.featureGeometryValue); + var scopeProperties = { + "periodOfValidity": { + "endDate": $scope.featureEndDateValue, + "startDate": $scope.featureStartDateValue + }, + "isPartialUpdate": true + }; + $scope.putBody_georesources = kommonitorImporterHelperService.buildPutBody_georesources(scopeProperties); + if (!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_georesources) { + return false; + } + return true; + }; + $scope.buildImporterObjects = async function () { + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + var scopeProperties = { + "periodOfValidity": { + "endDate": $scope.periodOfValidity.endDate, + "startDate": $scope.periodOfValidity.startDate + }, + "isPartialUpdate": $scope.isPartialUpdate + }; + $scope.putBody_georesources = kommonitorImporterHelperService.buildPutBody_georesources(scopeProperties); + if (!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_georesources) { + return false; + } + return true; + }; + $scope.buildConverterDefinition = function () { + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_georesourceEditFeatures_", $scope.schema, $scope.mimeType); + }; + $scope.buildDatasourceTypeDefinition = async function () { + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_georesourceEditFeatures_', 'georesourceDataSourceInput_editFeatures'); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + return null; + } + }; + $scope.buildPropertyMappingDefinition = function () { + // arsion from is undefined currently + return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.georesourceDataSourceNameProperty, $scope.georesourceDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); + }; + $scope.editGeoresourceFeatures = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + /* + now collect data and build request for importer + */ + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + if (!allDataSpecified) { + $("#georesourceEditFeaturesForm").validator("update"); + $("#georesourceEditFeaturesForm").validator("validate"); + return; + } + else { + // TODO verify input + // TODO Create and perform POST Request with loading screen + var updateGeoresourceResponse_dryRun = undefined; + try { + updateGeoresourceResponse_dryRun = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, true); + // this callback will be called asynchronously + // when the response is available + if (!kommonitorImporterHelperService.importerResponseContainsErrors(updateGeoresourceResponse_dryRun)) { + // all good, really execute the request to import data against data management API + var updateGeoresourceResponse = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, false); + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + $scope.refreshGeoresourceEditFeaturesOverviewTable(); + $scope.initSingleFeatureAddMenu(); + $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateGeoresourceResponse); + $("#georesourceEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + } + else { + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if (updateGeoresourceResponse_dryRun) { + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); + } + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + }; + $scope.onImportGeoresourceEditFeaturesMappingConfig = function () { + $scope.georesourceMappingConfigImportError = ""; + $("#georesourceMappingConfigEditFeaturesImportFile").files = []; + // trigger file chooser + $("#georesourceMappingConfigEditFeaturesImportFile").click(); + }; + $(document).on("change", "#georesourceMappingConfigEditFeaturesImportFile", function () { + console.log("Importing Importer Mapping Config for EditFeatures Georesource Form"); + // get the file + var file = document.getElementById('georesourceMappingConfigEditFeaturesImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + $scope.parseMappingConfigFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMappingConfigFile(event); + } + catch (error) { + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.georesourceMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("georesourcesEditFeaturesMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; + $("#georesourceEditFeaturesMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMappingConfigFile = function (event) { + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + if (!$scope.mappingConfigImportSettings.converter || !$scope.mappingConfigImportSettings.dataSource || !$scope.mappingConfigImportSettings.propertyMapping) { + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("georesourcesEditFeaturesMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; + $("#georesourceEditFeaturesMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + $scope.converter = undefined; + for (var converter of kommonitorImporterHelperService.availableConverters) { + if (converter.name === $scope.mappingConfigImportSettings.converter.name) { + $scope.converter = converter; + break; + } + } + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema) { + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema) { + $scope.schema = schema; + } + } + } + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType) { + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType) { + $scope.mimeType = mimeType; + } + } + } + $scope.datasourceType = undefined; + for (var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes) { + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type) { + $scope.datasourceType = datasourceType; + break; + } + } + $scope.$digest(); + // converter parameters + if ($scope.converter) { + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_georesourceEditFeatures_" + convParameter.name).val(convParameter.value); + } + } + // datasourceTypes parameters + if ($scope.datasourceType) { + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_georesourceEditFeatures_" + dsParameter.name).val(dsParameter.value); + } + } + // property Mapping + $scope.georesourceDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; + $scope.georesourceDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; + $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; + $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; + $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; + $scope.attributeMappings_adminView = []; + for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { + var tmpEntry = { + "sourceName": attributeMapping.name, + "destinationName": attributeMapping.mappingName + }; + for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { + if (dataType.apiName === attributeMapping.type) { + tmpEntry.dataType = dataType; + } + } + $scope.attributeMappings_adminView.push(tmpEntry); + } + if ($scope.mappingConfigImportSettings.periodOfValidity) { + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; + $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; + $scope.periodOfValidityInvalid = false; + // update datePickers + if ($scope.periodOfValidity.startDate) { + $("#georesourceEditFeaturesDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); + } + if ($scope.periodOfValidity.endDate) { + $("#georesourceEditFeaturesDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); + } + } + $scope.$digest(); + }; + $scope.onExportGeoresourceEditFeaturesMappingConfig = async function () { + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + }; + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + var name = $scope.datasetName; + var metadataJSON = JSON.stringify(mappingConfigExport); + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.hideSuccessAlert = function () { + $("#georesourceEditFeaturesSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#georesourceEditFeaturesErrorAlert").hide(); + }; + $scope.hideMappingConfigErrorAlert = function () { + $("#georesourceEditFeaturesMappingConfigImportErrorAlert").hide(); + }; + $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_georesource, function (event) { + $timeout(function () { + $scope.loadingData = true; + }); + }); + $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_georesource, function (event) { + $timeout(function () { + $scope.loadingData = false; + }); + }); + $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_georesource, function (event) { + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + $scope.refreshGeoresourceEditFeaturesOverviewTable(); + }); + $scope.onChangeEnableDeleteFeatures = function () { + if ($scope.enableDeleteFeatures) { + $(".georesourceDeleteFeatureRecordBtn").attr("disabled", false); + } + else { + $(".georesourceDeleteFeatureRecordBtn").attr("disabled", true); + } + }; + } + ] +}); +//# sourceMappingURL=georesource-edit-features-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.js.map new file mode 100644 index 000000000..956962768 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"georesource-edit-features-modal.component.js","sourceRoot":"","sources":["georesource-edit-features-modal.component.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,SAAS,CAAC,8BAA8B,EAAE;IACxF,WAAW,EAAG,mIAAmI;IACjJ,UAAU,EAAG,CAAC,+BAA+B,EAAE,iCAAiC,EAAE,yCAAyC;QAC1H,iCAAiC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,sCAAsC;QAC/H,SAAS,uCAAuC,CAAC,6BAA6B,EAAE,+BAA+B,EAAE,uCAAuC,EACvJ,+BAA+B,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,oCAAoC;YAElH,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;YAC3E,IAAI,CAAC,uCAAuC,GAAG,+BAA+B,CAAC;YAC/E,IAAI,CAAC,uCAAuC,GAAG,+BAA+B,CAAC;YAC/E,IAAI,CAAC,+CAA+C,GAAG,uCAAuC,CAAC;YAE/F;;;;;;;;cAQE;YAEF,aAAa;YACX,CAAC,CAAC,yCAAyC,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;YAC3G,CAAC,CAAC,uCAAuC,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;YACvG,CAAC,CAAC,wCAAwC,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;YACxG,CAAC,CAAC,0CAA0C,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;YAE1G,MAAM,CAAC,0BAA0B,CAAC;YAClC,MAAM,CAAC,yBAAyB,CAAC;YACjC,MAAM,CAAC,uBAAuB,CAAC;YAE/B,MAAM,CAAC,wCAAwC,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,+BAA+B,CAAC,sBAAsB,CAAC,CAAC;YAC5J,MAAM,CAAC,mCAAmC,CAAC;YAE3C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAE3B,sCAAsC;YACtC,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,sBAAsB,GAAG,SAAS,CAAC;YAC1C,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAChC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;YACpC,MAAM,CAAC,oBAAoB,GAAG,SAAS,CAAC;YACxC,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;YACzC,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;YACvC,mCAAmC;YACnC,MAAM,CAAC,uBAAuB,GAAG,EAAE,CAAC;YACpC,MAAM,CAAC,YAAY,CAAC;YAEpB,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;YAE/B,wCAAwC;YAExC,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC7B,MAAM,CAAC,gBAAgB,CAAC,SAAS,GAAG,SAAS,CAAC;YAC9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAC;YAC5C,MAAM,CAAC,uBAAuB,GAAG,KAAK,CAAC;YAEvC,MAAM,CAAC,mDAAmD,GAAG,SAAS,CAAC;YACvE,MAAM,CAAC,6CAA6C,GAAG,KAAK,CAAC;YAC7D,MAAM,CAAC,+BAA+B,GAAG,SAAS,CAAC;YACnD,MAAM,CAAC,iCAAiC,GAAG,SAAS,CAAC;YAErD,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YAC7B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;YAC1B,MAAM,CAAC,oCAAoC,GAAG,SAAS,CAAC;YACxD,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC3B,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;YAClC,MAAM,CAAC,+BAA+B,GAAG,SAAS,CAAC;YACnD,MAAM,CAAC,iCAAiC,GAAG,SAAS,CAAC;YAErD,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;YACvC,MAAM,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC5C,MAAM,CAAC,yBAAyB,GAAG,SAAS,CAAC;YAC7C,MAAM,CAAC,oBAAoB,GAAG,SAAS,CAAC;YAExC,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC;YAC9C,MAAM,CAAC,4BAA4B,GAAG,SAAS,CAAC;YAEhD,MAAM,CAAC,oCAAoC,GAAG,SAAS,CAAC;YACxD,MAAM,CAAC,yCAAyC,GAAG,SAAS,CAAC;YAC7D,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;YACzC,MAAM,CAAC,8BAA8B,GAAG,+BAA+B,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC;YAC3G,MAAM,CAAC,2BAA2B,GAAG,EAAE,CAAC;YACxC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;YAC7B,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAEjC,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;YACpC,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;YAElC,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,UAAU,KAAK,EAAE,kBAAkB;gBAC1E,oCAAoC,CAAC,oBAAoB,EAAE,CAAC;gBAC5D,IAAG,MAAM,CAAC,yBAAyB,IAAI,MAAM,CAAC,yBAAyB,CAAC,WAAW,KAAK,kBAAkB,CAAC,WAAW,EAAC;oBACtH,OAAO;iBACP;qBACG;oBACH,MAAM,CAAC,yBAAyB,GAAG,kBAAkB,CAAC;oBAEtD,wDAAwD;oBAExD,MAAM,CAAC,gCAAgC,EAAE,CAAC;oBAE1C,+BAA+B,CAAC,0CAA0C,CAAC,yBAAyB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;iBAE9G;YAEF,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,wBAAwB,GAAG,KAAK;gBACtC,iFAAiF;gBACjF,IAAI,KAAK,GAAG,qBAAqB,CAAC;gBACjC,IAAI,YAAY,GAAG,uCAAuC,CAAC,kBAAkB,CAAC;gBAC9E,IAAG,MAAM,CAAC,yBAAyB,CAAC,KAAK,EAAC;oBACzC,YAAY,GAAG,uCAAuC,CAAC,iBAAiB,CAAC;iBACzE;qBACI,IAAG,MAAM,CAAC,yBAAyB,CAAC,KAAK,EAAC;oBAC9C,YAAY,GAAG,uCAAuC,CAAC,oBAAoB,CAAC;iBAC5E;gBACD,uCAAuC,CAAC,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBAEtF,+CAA+C;gBAC/C,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAEjC,qCAAqC;gBACrC,KAAK,CAAC;oBACL,GAAG,EAAE,6BAA6B,CAAC,6CAA6C,EAAE,GAAG,gBAAgB,GAAG,MAAM,CAAC,yBAAyB,CAAC,aAAa,GAAG,cAAc;oBACvK,MAAM,EAAE,KAAK;oBACb,aAAa;oBACb,+BAA+B;oBAC/B,IAAI;iBACJ,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,QAAQ;oBAExC,MAAM,CAAC,0BAA0B,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAClD,uCAAuC,CAAC,iCAAiC,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;oBAE7G,MAAM,CAAC,oCAAoC,GAAG,EAAE,GAAG,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,MAAM,GAAG,0CAA0C,CAAC;oBAElJ,0FAA0F;oBAC1F,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,sCAAsC,EAAE,CAAC;oBACxE,MAAM,CAAC,kCAAkC,EAAE,CAAC;gBAE5C,CAAC,EAAE,SAAS,aAAa,CAAC,KAAK;oBAC9B,MAAM,CAAC,oCAAoC,GAAG,sEAAsE,CAAC;gBACvH,CAAC,CAAC,CAAC,OAAO,CAAC;oBACV,MAAM,CAAC,uBAAuB,EAAE,CAAC;oBACjC,uBAAuB;oBAEvB,qBAAqB;oBACrB,WAAW;gBACZ,CAAC,CAAC,CAAC;YACJ,CAAC,CAAA;YAED,MAAM,CAAC,sCAAsC,GAAG;gBAC/C,IAAI,CAAE,MAAM,CAAC,0BAA0B,EAAC;oBACvC,OAAO,CAAC,CAAC;iBACT;gBACD,oBAAoB;gBACpB,IAAI,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAErE,qBAAqB;gBACrB,IAAI,kBAAkB,GAAG,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBACjF,IAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAC;wBACrD,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;qBAC1D;yBACG;wBACH,OAAO,CAAC,CAAC;qBACT;gBACF,CAAC,CAAC,CAAC;gBAEH,IAAI,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;gBACvC,MAAM,CAAC,sBAAsB,GAAG,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAC,CAAC,CAAC,CAAE,GAAG,IAAI,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAEtJ,IAAG,UAAU,IAAI,SAAS,IAAI,UAAU,IAAI,QAAQ,EAAC;oBACpD,OAAO,MAAM,CAAC,8CAA8C,CAAC,kBAAkB,CAAC,CAAC;iBACjF;qBACG;oBACH,gBAAgB;oBAChB,OAAO,MAAM,CAAC,2CAA2C,CAAC,kBAAkB,CAAC,CAAC;iBAC9E;YACF,CAAC,CAAC;YAEF,MAAM,CAAC,8CAA8C,GAAG,UAAS,kBAAkB;gBAElF,sBAAsB;gBACtB,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;gBAE/C,mBAAmB;gBACnB,OAAO,QAAQ,GAAG,CAAC,CAAC;YACrB,CAAC,CAAC;YAEF,MAAM,CAAC,2CAA2C,GAAG,UAAS,kBAAkB;gBAC/E,kCAAkC;gBAClC,OAAO,MAAM,EAAE,CAAC;YACjB,CAAC,CAAC;YAEF,MAAM,CAAC,uBAAuB,GAAG;gBAChC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC/B,IAAG,MAAM,CAAC,0BAA0B,IAAI,MAAM,CAAC,cAAc,EAAC;oBAC7D,IAAI,gBAAgB,GAAG,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC;oBAEjK,IAAG,gBAAgB,CAAC,MAAM,IAAI,CAAC,EAAC;wBAC/B,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;qBAC/B;yBACG;wBACH,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;qBAChC;oBACD,OAAO,MAAM,CAAC,gBAAgB,CAAC;iBAC/B;qBACG;oBACH,qCAAqC;oBACrC,IAAI,MAAM,CAAC,cAAc,IAAI,SAAS,IAAI,MAAM,CAAC,cAAc,IAAI,IAAI,EAAC;wBACvE,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;qBAChC;yBACG;wBACH,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;qBAC/B;iBACD;gBAED,OAAO,MAAM,CAAC,gBAAgB,CAAC;YAChC,CAAC,CAAC;YAEF,MAAM,CAAC,iBAAiB,GAAG,KAAK;gBAC/B,MAAM,CAAC,uBAAuB,GAAG,EAAE,CAAC;gBAEpC,OAAO,MAAM,KAAK,CAAC;oBAClB,GAAG,EAAE,6BAA6B,CAAC,6CAA6C,EAAE,GAAG,gBAAgB,GAAG,MAAM,CAAC,yBAAyB,CAAC,aAAa,GAAG,SAAS;oBAClK,MAAM,EAAE,KAAK;oBACb,aAAa;oBACb,+BAA+B;oBAC/B,IAAI;iBACJ,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,QAAQ;oBAExC,MAAM,CAAC,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAEpC,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,YAAY,EAAC;wBACxC,IAAI,QAAQ,IAAI,KAAK,CAAC,wBAAwB,IAAI,QAAQ,IAAI,KAAK,CAAC,0BAA0B,IAAI,QAAQ,IAAI,KAAK,CAAC,8BAA8B,IAAI,QAAQ,IAAI,KAAK,CAAC,4BAA4B,EAAC;4BACpM,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAClC,EAAC,QAAQ,EAAE,QAAQ;gCACnB,KAAK,EAAE,SAAS,EAAC,CACjB,CAAC;yBACF;qBACD;oBAED,OAAO,MAAM,CAAC,YAAY,CAAC;gBAE3B,CAAC,EAAE,SAAS,aAAa,CAAC,KAAK;gBAEhC,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,CAAC,kCAAkC,GAAG;gBAC3C,IAAI,MAAM,CAAC,0BAA0B,IAAI,MAAM,CAAC,uBAAuB,IAAI,MAAM,CAAC,0BAA0B,CAAC,QAAQ,IAAI,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAC;oBACtK,IAAI,cAAc,GAAG,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACnE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,uBAAuB,EAAE;wBACrD,OAAO,CAAC,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;qBACnE;iBACD;YACF,CAAC,CAAC;YAEF,MAAM,CAAC,2BAA2B,GAAG,KAAK;gBAEzC,QAAQ,CAAC;oBACR,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;gBACjC,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAErC;;sBAEG;gBAEF,IAAI,gBAAgB,GAAG,MAAM,MAAM,CAAC,wCAAwC,EAAE,CAAC;gBAE/E,2DAA2D;gBAE3D,IAAI,gCAAgC,GAAG,SAAS,CAAC;gBACjD,IAAI;oBACH,gCAAgC,GAAG,MAAM,+BAA+B,CAAC,iBAAiB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;oBAE7Q,8CAA8C;oBAC9C,iCAAiC;oBAKjC,IAAG,CAAE,+BAA+B,CAAC,8BAA8B,CAAC,gCAAgC,CAAC,EAAC;wBACrG,kFAAkF;wBAClF,IAAI,yBAAyB,GAAG,MAAM,+BAA+B,CAAC,iBAAiB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;wBAE3Q,UAAU,CAAC,UAAU,CAAC,iCAAiC,EAAE,MAAM,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;wBAEjH,MAAM,CAAC,2CAA2C,EAAE,CAAC;wBACrD,MAAM,CAAC,wBAAwB,EAAE,CAAC;wBAElC,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC;wBACzE,MAAM,CAAC,gBAAgB,GAAG,+BAA+B,CAAC,uCAAuC,CAAC,yBAAyB,CAAC,CAAC;wBAE7H,8FAA8F;wBAC9F,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;wBAChC,0CAA0C;wBAC1C,IAAG,MAAM,CAAC,0BAA0B,EAAC;4BACpC,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;yBACzF;6BACG;4BACH,MAAM,CAAC,0BAA0B,GAAG,IAAI,CAAC,iBAAiB,CAAC;gCAC1D,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;6BACrC,CAAC,CAAC;yBACL;wBAGD,CAAC,CAAC,sCAAsC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACjD,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;qBAC3B;yBACG;wBACH,iBAAiB;wBACjB,aAAa;wBACb,MAAM,CAAC,gBAAgB,GAAG,yEAAyE,CAAC;wBACpG,MAAM,CAAC,cAAc,GAAG,+BAA+B,CAAC,6BAA6B,CAAC,gCAAgC,CAAC,CAAC;wBAExH,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC/C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;wBAE3B,UAAU,CAAC,GAAG,EAAE;4BACf,MAAM,CAAC,OAAO,EAAE,CAAC;wBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;qBAER;iBACD;gBAAC,OAAO,KAAK,EAAE;oBACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACrB,IAAG,KAAK,CAAC,IAAI,EAAC;wBACb,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACxF;yBACG;wBACH,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;qBACnF;oBACD,IAAG,gCAAgC,EAAC;wBACnC,MAAM,CAAC,cAAc,GAAG,+BAA+B,CAAC,6BAA6B,CAAC,gCAAgC,CAAC,CAAC;qBACxH;oBAED,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;oBAE3B,UAAU,CAAC,GAAG,EAAE;wBACf,MAAM,CAAC,OAAO,EAAE,CAAC;oBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;iBACR;YACH,CAAC,CAAC;YAEF,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,UAAS,KAAK,EAAE,OAAO;gBAClE,MAAM,CAAC,oBAAoB,GAAG,OAAO,CAAC;gBACtC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,2CAA2C,GAAG;gBAEpD,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC1B,iCAAiC;gBACjC,KAAK,CAAC;oBACL,GAAG,EAAE,6BAA6B,CAAC,6CAA6C,EAAE,GAAG,gBAAgB,GAAG,MAAM,CAAC,yBAAyB,CAAC,aAAa,GAAG,cAAc;oBACvK,MAAM,EAAE,KAAK;oBACb,aAAa;oBACb,+BAA+B;oBAC/B,IAAI;iBACJ,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,QAAQ;oBAExC,MAAM,CAAC,0BAA0B,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAElD,IAAI,mBAAmB,GAAG,EAAE,CAAC;oBAE7B,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAC;wBAC7E,IAAI,QAAQ,IAAI,KAAK,CAAC,wBAAwB,IAAI,QAAQ,IAAI,KAAK,CAAC,0BAA0B,IAAI,QAAQ,IAAI,KAAK,CAAC,8BAA8B,IAAI,QAAQ,IAAI,KAAK,CAAC,4BAA4B,EAAC;4BACpM,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;yBACnC;qBACD;oBAED,MAAM,CAAC,uBAAuB,GAAG,mBAAmB,CAAC;oBAErD,oIAAoI;oBACpI,sDAAsD;oBAEtD,+BAA+B,CAAC,0CAA0C,CAAC,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAAE,+BAA+B,CAAC,wBAAwB,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC;oBAG7S,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAE5B,CAAC,EAAE,SAAS,aAAa,CAAC,KAAK;oBAC9B,IAAG,KAAK,CAAC,IAAI,EAAC;wBACb,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACxF;yBACG;wBACH,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;qBACnF;oBAED,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,CAAC,2BAA2B,GAAG;gBACpC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC1B,kCAAkC;gBAClC,KAAK,CAAC;oBACL,GAAG,EAAE,6BAA6B,CAAC,0BAA0B,GAAG,gBAAgB,GAAG,MAAM,CAAC,yBAAyB,CAAC,aAAa,GAAG,cAAc;oBAClJ,MAAM,EAAE,QAAQ;oBAChB,aAAa;oBACb,+BAA+B;oBAC/B,IAAI;iBACJ,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,QAAQ;oBAExC,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC;oBAC9C,MAAM,CAAC,uBAAuB,GAAG,SAAS,CAAC;oBAE3C,UAAU,CAAC,UAAU,CAAC,iCAAiC,EAAE,MAAM,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;oBACjH,oDAAoD;oBACpD,+BAA+B,CAAC,0CAA0C,CAAC,yBAAyB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC9G,mBAAmB;oBACnB,MAAM,CAAC,gCAAgC,EAAE,CAAC;oBAE1C,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC;oBAEzE,CAAC,CAAC,sCAAsC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjD,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAE3B,CAAC,EAAE,SAAS,aAAa,CAAC,KAAK;oBAC9B,IAAG,KAAK,CAAC,IAAI,EAAC;wBACb,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACxF;yBACG;wBACH,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;qBACnF;oBAED,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,CAAC,gCAAgC,GAAG;gBAEzC,qBAAqB;gBACrB,+BAA+B,CAAC,qDAAqD,GAAG,SAAS,CAAC;gBAClG,+BAA+B,CAAC,qDAAqD,GAAG,SAAS,CAAC;gBAElG,sCAAsC;gBACtC,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;gBAC1B,MAAM,CAAC,sBAAsB,GAAG,SAAS,CAAC;gBAC1C,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;gBAChC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBACpC,MAAM,CAAC,oBAAoB,GAAG,SAAS,CAAC;gBACxC,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;gBACzC,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;gBACvC,mCAAmC;gBACnC,MAAM,CAAC,uBAAuB,GAAG,EAAE,CAAC;gBAEpC,iCAAiC;gBACjC,MAAM,CAAC,wBAAwB,EAAE,CAAC;gBAElC,uCAAuC;gBAEvC,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC;gBAC9C,MAAM,CAAC,uBAAuB,GAAG,SAAS,CAAC;gBAE3C,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC7B,MAAM,CAAC,gBAAgB,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAC;gBAC5C,MAAM,CAAC,uBAAuB,GAAG,KAAK,CAAC;gBAEvC,MAAM,CAAC,mDAAmD,GAAG,SAAS,CAAC;gBACvE,MAAM,CAAC,6CAA6C,GAAG,KAAK,CAAC;gBAC7D,MAAM,CAAC,+BAA+B,GAAG,SAAS,CAAC;gBACnD,MAAM,CAAC,iCAAiC,GAAG,SAAS,CAAC;gBAErD,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC7B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC5B,MAAM,CAAC,oCAAoC,GAAG,SAAS,CAAC;gBACxD,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;gBAClC,MAAM,CAAC,+BAA+B,GAAG,SAAS,CAAC;gBACnD,MAAM,CAAC,iCAAiC,GAAG,SAAS,CAAC;gBAErD,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;gBACvC,MAAM,CAAC,wBAAwB,GAAG,SAAS,CAAC;gBAC5C,MAAM,CAAC,yBAAyB,GAAG,SAAS,CAAC;gBAC7C,MAAM,CAAC,oBAAoB,GAAG,SAAS,CAAC;gBAExC,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC;gBAC9C,MAAM,CAAC,4BAA4B,GAAG,SAAS,CAAC;gBAEhD,MAAM,CAAC,oCAAoC,GAAG,SAAS,CAAC;gBACxD,MAAM,CAAC,yCAAyC,GAAG,SAAS,CAAC;gBAC7D,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;gBACzC,MAAM,CAAC,8BAA8B,GAAG,+BAA+B,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC;gBAC3G,MAAM,CAAC,2BAA2B,GAAG,EAAE,CAAC;gBACxC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC7B,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAEhC,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBACpC,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;gBAElC,CAAC,CAAC,sCAAsC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjD,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAE/C,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,iBAAiB,GAAG;gBAC1B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnF,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,GAAG,UAAS,QAAQ;gBAC1C,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC5B,CAAC,CAAC;YAEF,MAAM,CAAC,4BAA4B,GAAG;gBACrC,OAAO,UAAU,IAAI;oBAEpB,IAAG;wBACF,IAAI,IAAI,KAAK,KAAK,CAAC,wBAAwB,IAAI,IAAI,KAAK,KAAK,CAAC,0BAA0B,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,cAAc,EAAC;4BAChJ,OAAO,KAAK,CAAC;yBACb;wBACD,OAAO,IAAI,CAAC;qBACZ;oBACD,OAAM,KAAK,EAAC;wBACX,OAAO,KAAK,CAAC;qBACb;gBACF,CAAC,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,CAAC,YAAY,GAAG,UAAS,cAAc;gBAC5C,OAAO,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAClE,CAAC,CAAC;YAEF,MAAM,CAAC,cAAc,GAAG,UAAS,cAAc;gBAC9C,OAAO,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACpE,CAAC,CAAC;YAEF,MAAM,CAAC,qBAAqB,GAAG;gBAC9B,MAAM,CAAC,uBAAuB,GAAG,KAAK,CAAC;gBACvC,IAAI,MAAM,CAAC,gBAAgB,CAAC,SAAS,IAAI,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAC;oBACxE,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;oBAC5D,IAAI,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBAExD,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,IAAI,SAAS,GAAG,OAAO,EAAC;wBAClD,UAAU;wBACV,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAC;qBACtC;iBACD;YACF,CAAC,CAAC;YAEF,MAAM,CAAC,6BAA6B,GAAG;gBACtC,IAAI,6BAA6B,GAAG;oBACnC,YAAY,EAAE,MAAM,CAAC,oCAAoC;oBACzD,iBAAiB,EAAE,MAAM,CAAC,yCAAyC;oBACnE,UAAU,EAAE,MAAM,CAAC,8BAA8B;iBACjD,CAAC;gBAEF,IAAI,SAAS,GAAG,KAAK,CAAC;gBAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,2BAA2B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAC/E,IAAI,+BAA+B,GAAG,MAAM,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;oBAEhF,IAAI,+BAA+B,CAAC,UAAU,KAAK,6BAA6B,CAAC,UAAU,EAAC;wBAC3F,iBAAiB;wBACjB,MAAM,CAAC,2BAA2B,CAAC,KAAK,CAAC,GAAG,6BAA6B,CAAC;wBAC1E,SAAS,GAAG,IAAI,CAAC;wBACjB,MAAM;qBACN;iBACD;gBAED,IAAG,CAAE,SAAS,EAAC;oBACd,YAAY;oBACZ,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;iBACvE;gBAED,MAAM,CAAC,oCAAoC,GAAG,SAAS,CAAC;gBACxD,MAAM,CAAC,yCAAyC,GAAG,SAAS,CAAC;gBAC7D,MAAM,CAAC,8BAA8B,GAAG,+BAA+B,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC;gBAE3G,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,2BAA2B,GAAG,UAAS,qBAAqB;gBAClE,MAAM,CAAC,oCAAoC,GAAG,qBAAqB,CAAC,UAAU,CAAC;gBAC/E,MAAM,CAAC,yCAAyC,GAAG,qBAAqB,CAAC,eAAe,CAAC;gBACzF,MAAM,CAAC,8BAA8B,GAAG,qBAAqB,CAAC,QAAQ,CAAC;gBAEvE,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,6BAA6B,GAAG,UAAS,qBAAqB;gBACpE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,2BAA2B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAE/E,IAAI,MAAM,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK,qBAAqB,CAAC,UAAU,EAAC;wBAC7F,gBAAgB;wBAChB,MAAM,CAAC,2BAA2B,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBACpD,MAAM;qBACN;iBACD;gBAED,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,wCAAwC,GAAG,KAAK;gBACtD,MAAM,CAAC,mBAAmB,GAAG,+BAA+B,CAAC,uCAAuC,CAAC;gBACrG,MAAM,CAAC,wBAAwB,GAAG,+BAA+B,CAAC,wCAAwC,CAAC;gBAC3G,MAAM,CAAC,yBAAyB,GAAG,+BAA+B,CAAC,6CAA6C,CAAC;gBAEjH,sFAAsF;gBACtF,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC;gBAC3G,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,0BAA0B,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAC/G,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC;gBACxH,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,4BAA4B,CAAC,GAAG,MAAM,CAAC,mBAAmB,CAAC;gBAEpH,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,uBAAuB,EAAE;oBACrD,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;iBACrF;gBAED,MAAM,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBAElG,IAAI,eAAe,GAAG;oBACrB,kBAAkB,EAAE;wBACnB,SAAS,EAAE,MAAM,CAAC,mBAAmB;wBACrC,WAAW,EAAE,MAAM,CAAC,qBAAqB;qBACzC;oBACD,iBAAiB,EAAE,IAAI;iBACvB,CAAC;gBACF,MAAM,CAAC,oBAAoB,GAAG,+BAA+B,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC;gBAEzG,IAAG,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,MAAM,CAAC,wBAAwB,IAAI,CAAC,MAAM,CAAC,yBAAyB,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAC;oBACvI,OAAO,KAAK,CAAC;iBACb;gBAED,OAAO,IAAI,CAAC;YACb,CAAC,CAAC;YAEF,MAAM,CAAC,oBAAoB,GAAG,KAAK;gBAClC,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,wBAAwB,EAAE,CAAC;gBAC/D,MAAM,CAAC,wBAAwB,GAAG,MAAM,MAAM,CAAC,6BAA6B,EAAE,CAAC;gBAC/E,MAAM,CAAC,yBAAyB,GAAG,MAAM,CAAC,8BAA8B,EAAE,CAAC;gBAE3E,IAAI,eAAe,GAAG;oBACrB,kBAAkB,EAAE;wBACnB,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO;wBAC1C,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,SAAS;qBAC9C;oBACD,iBAAiB,EAAE,MAAM,CAAC,eAAe;iBACzC,CAAA;gBACD,MAAM,CAAC,oBAAoB,GAAG,+BAA+B,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC;gBAEzG,IAAG,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,MAAM,CAAC,wBAAwB,IAAI,CAAC,MAAM,CAAC,yBAAyB,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAC;oBACvI,OAAO,KAAK,CAAC;iBACb;gBAED,OAAO,IAAI,CAAC;YACb,CAAC,CAAC;YAEF,MAAM,CAAC,wBAAwB,GAAG;gBAEjC,OAAO,+BAA+B,CAAC,wBAAwB,CAAC,MAAM,CAAC,SAAS,EAAE,6CAA6C,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClK,CAAC,CAAC;YAEF,MAAM,CAAC,6BAA6B,GAAG,KAAK;gBAC3C,IAAI;oBACH,OAAO,MAAM,+BAA+B,CAAC,6BAA6B,CAAC,MAAM,CAAC,cAAc,EAAE,kDAAkD,EAAE,yCAAyC,CAAC,CAAC;iBACjM;gBAAC,OAAO,KAAK,EAAE;oBACf,IAAG,KAAK,CAAC,IAAI,EAAC;wBACb,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACxF;yBACG;wBACH,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;qBACnF;oBAED,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC3B,OAAO,IAAI,CAAC;iBACZ;YACF,CAAC,CAAC;YAEF,MAAM,CAAC,8BAA8B,GAAG;gBACvC,qCAAqC;gBACrC,OAAO,+BAA+B,CAAC,oCAAoC,CAAC,MAAM,CAAC,iCAAiC,EAAE,MAAM,CAAC,+BAA+B,EAAE,MAAM,CAAC,4BAA4B,EAAE,MAAM,CAAC,0BAA0B,EAAE,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,2BAA2B,CAAC,CAAC;YACvU,CAAC,CAAC;YAEF,MAAM,CAAC,uBAAuB,GAAG,KAAK;gBAErC,QAAQ,CAAC;oBACR,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;gBACjC,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAErC;;sBAEG;gBAEF;;kBAEE;gBACF,IAAI,gBAAgB,GAAG,MAAM,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBAE3D,IAAI,CAAC,gBAAgB,EAAE;oBAEtB,CAAC,CAAC,8BAA8B,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBACtD,CAAC,CAAC,8BAA8B,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;oBACxD,OAAO;iBACP;qBACI;oBAGJ,oBAAoB;oBAEpB,2DAA2D;oBAE3D,IAAI,gCAAgC,GAAG,SAAS,CAAC;oBACjD,IAAI;wBACH,gCAAgC,GAAG,MAAM,+BAA+B,CAAC,iBAAiB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;wBAE7Q,8CAA8C;wBAC9C,iCAAiC;wBAKjC,IAAG,CAAE,+BAA+B,CAAC,8BAA8B,CAAC,gCAAgC,CAAC,EAAC;4BACrG,kFAAkF;4BAClF,IAAI,yBAAyB,GAAG,MAAM,+BAA+B,CAAC,iBAAiB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;4BAE3Q,UAAU,CAAC,UAAU,CAAC,iCAAiC,EAAE,MAAM,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;4BACjH,MAAM,CAAC,2CAA2C,EAAE,CAAC;4BACrD,MAAM,CAAC,wBAAwB,EAAE,CAAC;4BAElC,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC;4BACzE,MAAM,CAAC,gBAAgB,GAAG,+BAA+B,CAAC,uCAAuC,CAAC,yBAAyB,CAAC,CAAC;4BAE7H,CAAC,CAAC,sCAAsC,CAAC,CAAC,IAAI,EAAE,CAAC;4BACjD,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;yBAC3B;6BACG;4BACH,iBAAiB;4BACjB,aAAa;4BACb,MAAM,CAAC,gBAAgB,GAAG,mFAAmF,CAAC;4BAC9G,MAAM,CAAC,cAAc,GAAG,+BAA+B,CAAC,6BAA6B,CAAC,gCAAgC,CAAC,CAAC;4BAExH,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;4BAC/C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;4BAE3B,UAAU,CAAC,GAAG,EAAE;gCACf,MAAM,CAAC,OAAO,EAAE,CAAC;4BAClB,CAAC,EAAE,GAAG,CAAC,CAAC;yBAER;qBACD;oBAAC,OAAO,KAAK,EAAE;wBACf,IAAG,KAAK,CAAC,IAAI,EAAC;4BACb,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;yBACxF;6BACG;4BACH,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;yBACnF;wBACD,IAAG,gCAAgC,EAAC;4BACnC,MAAM,CAAC,cAAc,GAAG,+BAA+B,CAAC,6BAA6B,CAAC,gCAAgC,CAAC,CAAC;yBACxH;wBAED,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC/C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;wBAE3B,UAAU,CAAC,GAAG,EAAE;4BACf,MAAM,CAAC,OAAO,EAAE,CAAC;wBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;qBACR;iBACD;YACH,CAAC,CAAC;YAEF,MAAM,CAAC,4CAA4C,GAAG;gBAErD,MAAM,CAAC,mCAAmC,GAAG,EAAE,CAAC;gBAEhD,CAAC,CAAC,iDAAiD,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAEhE,uBAAuB;gBACvB,CAAC,CAAC,iDAAiD,CAAC,CAAC,KAAK,EAAE,CAAC;YAE9D,CAAC,CAAC;YAEF,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,iDAAiD,EAAE;gBAE3E,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;gBAEnF,eAAe;gBACf,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,gDAAgD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9F,MAAM,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,0BAA0B,GAAG,UAAS,IAAI;gBAChD,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;gBAElC,UAAU,CAAC,MAAM,GAAG,UAAS,KAAK;oBAEjC,IAAG;wBACF,MAAM,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;qBACzC;oBACD,OAAM,KAAK,EAAC;wBACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBACrB,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;wBAC/D,MAAM,CAAC,mCAAmC,GAAG,wDAAwD,CAAC;wBACtG,QAAQ,CAAC,cAAc,CAAC,0CAA0C,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,wCAAwC,CAAC;wBAChI,CAAC,CAAC,uDAAuD,CAAC,CAAC,IAAI,EAAE,CAAC;wBAElE,MAAM,CAAC,OAAO,EAAE,CAAC;qBACjB;gBAEF,CAAC,CAAC;gBAEF,wCAAwC;gBACxC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC;YAEF,MAAM,CAAC,0BAA0B,GAAG,UAAS,KAAK;gBACjD,MAAM,CAAC,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAErE,IAAG,CAAE,MAAM,CAAC,2BAA2B,CAAC,SAAS,IAAI,CAAE,MAAM,CAAC,2BAA2B,CAAC,UAAU,IAAI,CAAE,MAAM,CAAC,2BAA2B,CAAC,eAAe,EAAC;oBAC5J,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;oBACjF,MAAM,CAAC,8BAA8B,GAAG,qEAAqE,CAAC;oBAC9G,QAAQ,CAAC,cAAc,CAAC,0CAA0C,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,wCAAwC,CAAC;oBAChI,CAAC,CAAC,uDAAuD,CAAC,CAAC,IAAI,EAAE,CAAC;oBAElE,MAAM,CAAC,OAAO,EAAE,CAAC;iBACjB;gBAEC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC/B,KAAI,IAAI,SAAS,IAAI,+BAA+B,CAAC,mBAAmB,EAAC;oBACxE,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,2BAA2B,CAAC,SAAS,CAAC,IAAI,EAAC;wBACxE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;wBAC7B,MAAM;qBACN;iBACD;gBAEA,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC1B,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM,CAAC,2BAA2B,CAAC,SAAS,CAAC,MAAM,EAAC;oBACvG,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE;wBAC5C,IAAI,MAAM,KAAK,MAAM,CAAC,2BAA2B,CAAC,SAAS,CAAC,MAAM,EAAC;4BAClE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;yBACvB;qBACD;iBACD;gBAED,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC5B,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,IAAI,MAAM,CAAC,2BAA2B,CAAC,SAAS,CAAC,QAAQ,EAAC;oBAC3G,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE;wBAChD,IAAI,QAAQ,KAAK,MAAM,CAAC,2BAA2B,CAAC,SAAS,CAAC,QAAQ,EAAC;4BACtE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;yBAC3B;qBACD;iBACD;gBAED,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;gBAClC,KAAI,IAAI,cAAc,IAAI,+BAA+B,CAAC,wBAAwB,EAAC;oBAClF,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,CAAC,2BAA2B,CAAC,UAAU,CAAC,IAAI,EAAC;wBAC9E,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;wBACvC,MAAM;qBACN;iBACD;gBAED,MAAM,CAAC,OAAO,EAAE,CAAC;gBAEjB,uBAAuB;gBACvB,IAAI,MAAM,CAAC,SAAS,EAAC;oBACpB,KAAK,IAAI,aAAa,IAAI,MAAM,CAAC,2BAA2B,CAAC,SAAS,CAAC,UAAU,EAAE;wBACzE,CAAC,CAAC,8CAA8C,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;qBACzG;iBACD;gBAED,6BAA6B;gBAC7B,IAAI,MAAM,CAAC,cAAc,EAAC;oBACzB,KAAK,IAAI,WAAW,IAAI,MAAM,CAAC,2BAA2B,CAAC,UAAU,CAAC,UAAU,EAAE;wBACxE,CAAC,CAAC,mDAAmD,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;qBAC1G;iBACD;gBAED,mBAAmB;gBACnB,MAAM,CAAC,iCAAiC,GAAG,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,YAAY,CAAC;gBAC3G,MAAM,CAAC,+BAA+B,GAAG,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,kBAAkB,CAAC;gBAC/G,MAAM,CAAC,4BAA4B,GAAI,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,sBAAsB,CAAC;gBACjH,MAAM,CAAC,0BAA0B,GAAI,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,oBAAoB,CAAC;gBAC7G,MAAM,CAAC,cAAc,GAAI,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,cAAc,CAAC;gBAC3F,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,gCAAgC,CAAC;gBAC/G,MAAM,CAAC,2BAA2B,GAAG,EAAE,CAAC;gBAExC,KAAK,IAAI,gBAAgB,IAAI,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,UAAU,EAAE;oBAC3F,IAAI,QAAQ,GAAG;wBACd,YAAY,EAAE,gBAAgB,CAAC,IAAI;wBACnC,iBAAiB,EAAE,gBAAgB,CAAC,WAAW;qBAC/C,CAAC;oBAEF,KAAK,MAAM,QAAQ,IAAI,+BAA+B,CAAC,+BAA+B,EAAE;wBACvF,IAAI,QAAQ,CAAC,OAAO,KAAK,gBAAgB,CAAC,IAAI,EAAC;4BAC9C,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;yBAC7B;qBACD;oBAED,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAClD;gBAED,IAAI,MAAM,CAAC,2BAA2B,CAAC,gBAAgB,EAAC;oBACvD,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;oBAC7B,MAAM,CAAC,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,SAAS,CAAC;oBAClG,MAAM,CAAC,gBAAgB,CAAC,OAAO,GAAG,MAAM,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,OAAO,CAAC;oBAC9F,MAAM,CAAC,uBAAuB,GAAG,KAAK,CAAC;oBAEvC,qBAAqB;oBACrB,IAAI,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAC;wBACrC,CAAC,CAAC,yCAAyC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;qBACtG;oBACD,IAAI,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAC;wBACnC,CAAC,CAAC,uCAAuC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;qBAClG;iBACD;gBAED,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC;YAEF,MAAM,CAAC,4CAA4C,GAAG,KAAK;gBAC1D,IAAI,mBAAmB,GAAG,MAAM,CAAC,wBAAwB,EAAE,CAAC;gBAC5D,IAAI,wBAAwB,GAAG,MAAM,MAAM,CAAC,6BAA6B,EAAE,CAAC;gBAC5E,IAAI,yBAAyB,GAAG,MAAM,CAAC,8BAA8B,EAAE,CAAC;gBAExE,IAAI,mBAAmB,GAAG;oBACzB,WAAW,EAAE,mBAAmB;oBAChC,YAAY,EAAE,wBAAwB;oBACtC,iBAAiB,EAAE,yBAAyB;iBAC5C,CAAC;gBAEF,mBAAmB,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBAE/D,IAAI,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;gBAE9B,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;gBAEvD,IAAI,QAAQ,GAAG,gDAAgD,CAAC;gBAEhE,IAAI,IAAI,EAAC;oBACR,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC;iBACvB;gBAED,QAAQ,IAAI,OAAO,CAAC;gBAEpB,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,EAAC,IAAI,EAAE,kBAAkB,EAAC,CAAC,CAAC;gBAChE,IAAI,IAAI,GAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAEtC,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACpC,CAAC,CAAC,QAAQ,GAAM,QAAQ,CAAC;gBACzB,CAAC,CAAC,IAAI,GAAU,IAAI,CAAC;gBACrB,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC;gBACvB,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACpB,CAAC,CAAC,GAAG,GAAG,qBAAqB,CAAC;gBAC9B,CAAC,CAAC,KAAK,EAAE,CAAC;gBAEV,CAAC,CAAC,MAAM,EAAE,CAAC;YACZ,CAAC,CAAC;YAGD,MAAM,CAAC,gBAAgB,GAAG;gBACzB,CAAC,CAAC,sCAAsC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,CAAC,CAAC;YAEF,MAAM,CAAC,cAAc,GAAG;gBACvB,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,CAAC,CAAC;YAEF,MAAM,CAAC,2BAA2B,GAAG;gBACpC,CAAC,CAAC,uDAAuD,CAAC,CAAC,IAAI,EAAE,CAAC;YACnE,CAAC,CAAC;YAEF,UAAU,CAAC,GAAG,CAAC,kBAAkB,GAAG,+BAA+B,CAAC,wBAAwB,EAAE,UAAS,KAAK;gBAC3G,QAAQ,CAAC;oBAER,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,GAAG,CAAC,kBAAkB,GAAG,+BAA+B,CAAC,wBAAwB,EAAE,UAAS,KAAK;gBAC3G,QAAQ,CAAC;oBAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,GAAG,CAAC,uBAAuB,GAAG,+BAA+B,CAAC,wBAAwB,EAAE,UAAS,KAAK;gBAChH,UAAU,CAAC,UAAU,CAAC,iCAAiC,EAAE,MAAM,EAAE,MAAM,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;gBACjH,MAAM,CAAC,2CAA2C,EAAE,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,4BAA4B,GAAG;gBACrC,IAAG,MAAM,CAAC,oBAAoB,EAAC;oBAC9B,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;iBAChE;qBACG;oBACH,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;iBAC/D;YACF,CAAC,CAAA;QAEH,CAAC;KACD;CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.ts new file mode 100644 index 000000000..61e0450c0 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.component.ts @@ -0,0 +1,1016 @@ +angular.module('georesourceEditFeaturesModal').component('georesourceEditFeaturesModal', { + templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorSingleFeatureMapHelperService', + 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + function GeoresourcesEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, kommonitorSingleFeatureMapHelperService, + kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; + this.kommonitorSingleFeatureMapHelperServiceInstance = kommonitorSingleFeatureMapHelperService; + + /* PUT BODY + { + "geoJsonString": "geoJsonString", + "periodOfValidity": { + "endDate": "2000-01-23", + "startDate": "2000-01-23" + } + } + */ + + //Date picker + $('#georesourceEditFeaturesDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceEditFeaturesDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceSingleFeatureDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourceSingleFeatureDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + + $scope.georesourceFeaturesGeoJSON; + $scope.currentGeoresourceDataset; + $scope.remainingFeatureHeaders; + + $scope.georesourceMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); + $scope.georesourceMappingConfigImportError; + + $scope.loadingData = false; + + // variables for single feature import + $scope.featureIdValue = 0; + $scope.featureIdExampleString = undefined; + $scope.featureIdIsValid = false; + $scope.featureNameValue = undefined; + $scope.featureGeometryValue = undefined; + $scope.featureStartDateValue = undefined; + $scope.featureEndDateValue = undefined; + // [{property: name, value: value}] + $scope.featureSchemaProperties = []; + $scope.schemaObject; + + $scope.isPartialUpdate = false; + + // variables for multiple feature import + + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + + $scope.georesourceEditFeaturesDataSourceInputInvalidReason = undefined; + $scope.georesourceEditFeaturesDataSourceInputInvalid = false; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.featureInfoText_singleFeatureAddMenu = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_georesources = undefined; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + + $scope.$on("onEditGeoresourceFeatures", function (event, georesourceDataset) { + kommonitorMultiStepFormHelperService.registerClickHandler(); + if($scope.currentGeoresourceDataset && $scope.currentGeoresourceDataset.datasetName === georesourceDataset.datasetName){ + return; + } + else{ + $scope.currentGeoresourceDataset = georesourceDataset; + + // $scope.refreshGeoresourceEditFeaturesOverviewTable(); + + $scope.resetGeoresourceEditFeaturesForm(); + + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", [], []); + + } + + }); + + $scope.initSingleFeatureAddMenu = async function(){ + // init geomap for single feature import, handling geocoding and feature geometry + let domId = "singleFeatureGeoMap"; + let resourceType = kommonitorSingleFeatureMapHelperService.resourceType_point; + if($scope.currentGeoresourceDataset.isLOI){ + resourceType = kommonitorSingleFeatureMapHelperService.resourceType_line; + } + else if($scope.currentGeoresourceDataset.isAOI){ + resourceType = kommonitorSingleFeatureMapHelperService.resourceType_polygon; + } + kommonitorSingleFeatureMapHelperService.initSingleFeatureGeoMap(domId, resourceType); + + // init featureSchema for single feature import + await $scope.initFeatureSchema(); + + // add data layer to singleFeatureMap + $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + $scope.georesourceFeaturesGeoJSON = response.data; + kommonitorSingleFeatureMapHelperService.addDataLayertoSingleFeatureGeoMap($scope.georesourceFeaturesGeoJSON); + + $scope.featureInfoText_singleFeatureAddMenu = "" + $scope.georesourceFeaturesGeoJSON.features.length + " weitere Features im Datensatz vorhanden"; + + //once the dataset features are fetched we may make a proposal for the ID of a new Feature + $scope.featureIdValue = $scope.generateIdProposalFromExistingFeatures(); + $scope.addExampleValuesToSchemaProperties(); + + }, function errorCallback(error) { + $scope.featureInfoText_singleFeatureAddMenu = "Keine weiteren Features im Datensatz vorhanden oder Fehler bei Abruf"; + }).finally(function (){ + $scope.validateSingleFeatureId(); + // $timeout(function(){ + + // $scope.$digest(); + // }, 250); + }); + } + + $scope.generateIdProposalFromExistingFeatures = function(){ + if (! $scope.georesourceFeaturesGeoJSON){ + return 0; + } + // String or Integer + let idDataType = $scope.schemaObject[__env.FEATURE_ID_PROPERTY_NAME]; + + // array of id values + let existingFeatureIds = $scope.georesourceFeaturesGeoJSON.features.map(feature => { + if(feature.properties[__env.FEATURE_ID_PROPERTY_NAME]){ + return feature.properties[__env.FEATURE_ID_PROPERTY_NAME]; + } + else{ + return 0; + } + }); + + let length = existingFeatureIds.length; + $scope.featureIdExampleString = "" + existingFeatureIds[0] + "; " + existingFeatureIds[Math.round(length/2) ] + "; " + existingFeatureIds[length - 1]; + + if(idDataType == "Integer" || idDataType == "Double"){ + return $scope.generateIdProposalFromExistingFeatures_numeric(existingFeatureIds); + } + else{ + // generate UUID + return $scope.generateIdProposalFromExistingFeatures_uuid(existingFeatureIds); + } + }; + + $scope.generateIdProposalFromExistingFeatures_numeric = function(existingFeatureIds){ + + // determine max value + let maxValue = Math.max(...existingFeatureIds); + + // return increment + return maxValue + 1; + }; + + $scope.generateIdProposalFromExistingFeatures_uuid = function(existingFeatureIds){ + // return UUID using UUID library + return uuidv4(); + }; + + $scope.validateSingleFeatureId = function(){ + $scope.featureIdIsValid = true; + if($scope.georesourceFeaturesGeoJSON && $scope.featureIdValue){ + let filteredFeatures = $scope.georesourceFeaturesGeoJSON.features.filter(feature => feature.properties[__env.FEATURE_ID_PROPERTY_NAME] == $scope.featureIdValue); + + if(filteredFeatures.length == 0){ + $scope.featureIdIsValid = true; + } + else{ + $scope.featureIdIsValid = false; + } + return $scope.featureIdIsValid; + } + else{ + // no other data available in dataset + if ($scope.featureIdValue == undefined || $scope.featureIdValue == null){ + $scope.featureIdIsValid = false; + } + else{ + $scope.featureIdIsValid = true; + } + } + + return $scope.featureIdIsValid; + }; + + $scope.initFeatureSchema = async function(){ + $scope.featureSchemaProperties = []; + + return await $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/schema", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + $scope.schemaObject = response.data; + + for (var property in $scope.schemaObject){ + if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME){ + $scope.featureSchemaProperties.push( + {property: property, + value: undefined} + ); + } + } + + return $scope.schemaObject; + + }, function errorCallback(error) { + + }); + }; + + $scope.addExampleValuesToSchemaProperties = function(){ + if ($scope.georesourceFeaturesGeoJSON && $scope.featureSchemaProperties && $scope.georesourceFeaturesGeoJSON.features && $scope.georesourceFeaturesGeoJSON.features[0]){ + let exampleFeature = $scope.georesourceFeaturesGeoJSON.features[0]; + for (const element of $scope.featureSchemaProperties) { + element.exampleValue = exampleFeature.properties[element.property]; + } + } + }; + + $scope.addSingleGeoresourceFeature = async function(){ + + $timeout(function(){ + $scope.loadingData = true; + }); + + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + /* + now collect data and build request for importer + */ + + var allDataSpecified = await $scope.buildImporterObjects_singleFeatureImport(); + + // TODO Create and perform POST Request with loading screen + + var updateGeoresourceResponse_dryRun = undefined; + try { + updateGeoresourceResponse_dryRun = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, true); + + // this callback will be called asynchronously + // when the response is available + + + + + if(! kommonitorImporterHelperService.importerResponseContainsErrors(updateGeoresourceResponse_dryRun)){ + // all good, really execute the request to import data against data management API + var updateGeoresourceResponse = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, false); + + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + + $scope.refreshGeoresourceEditFeaturesOverviewTable(); + $scope.initSingleFeatureAddMenu(); + + $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateGeoresourceResponse); + + // as the update was successfull we must prevent the user from importing the same object again + $scope.featureIdIsValid = false; + // add the new feature to current dataset! + if($scope.georesourceFeaturesGeoJSON){ + $scope.georesourceFeaturesGeoJSON.features.push($scope.featureGeometryValue.features[0]); + } + else{ + $scope.georesourceFeaturesGeoJSON = turf.featureCollection([ + $scope.featureGeometryValue.features[0] + ]); + } + + + $("#georesourceEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + } + else{ + // errors ocurred + // show them + $scope.errorMessagePart = "Das zu importierende Feature des Datensatzes weist kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); + + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + + } + } catch (error) { + console.error(error); + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if(updateGeoresourceResponse_dryRun){ + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); + } + + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + }; + + $scope.$on("onUpdateSingleFeatureGeometry", function(event, geoJSON){ + $scope.featureGeometryValue = geoJSON; + $scope.$digest(); + }); + + $scope.refreshGeoresourceEditFeaturesOverviewTable = function(){ + + $scope.loadingData = true; + // fetch all georesource features + $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + $scope.georesourceFeaturesGeoJSON = response.data; + + var tmpRemainingHeaders = []; + + for (var property in $scope.georesourceFeaturesGeoJSON.features[0].properties){ + if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME){ + tmpRemainingHeaders.push(property); + } + } + + $scope.remainingFeatureHeaders = tmpRemainingHeaders; + + // as we require the information about the dataset ID within each feature to enable feature record updates from within the datatable + // we must include the dataset ID within each feature + + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", tmpRemainingHeaders, $scope.georesourceFeaturesGeoJSON.features, $scope.currentGeoresourceDataset.georesourceId, kommonitorDataGridHelperService.resourceType_georesource, $scope.enableDeleteFeatures); + + + $scope.loadingData = false; + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + }); + }; + + $scope.clearAllGeoresourceFeatures = function(){ + $scope.loadingData = true; + // delete all georesource features + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId + "/allFeatures", + method: "DELETE", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + $scope.georesourceFeaturesGeoJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + // empty data grid as all data has been deleted + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("georesourceFeatureTable", [], []); + // reset whole form + $scope.resetGeoresourceEditFeaturesForm(); + + $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; + + $("#georesourceEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + }); + }; + + $scope.resetGeoresourceEditFeaturesForm = function(){ + + // reset edit banners + kommonitorDataGridHelperService.featureTable_georesource_lastUpdate_timestamp_success = undefined; + kommonitorDataGridHelperService.featureTable_georesource_lastUpdate_timestamp_failure = undefined; + + // variables for single feature import + $scope.featureIdValue = 0; + $scope.featureIdExampleString = undefined; + $scope.featureIdIsValid = false; + $scope.featureNameValue = undefined; + $scope.featureGeometryValue = undefined; + $scope.featureStartDateValue = undefined; + $scope.featureEndDateValue = undefined; + // [{property: name, value: value}] + $scope.featureSchemaProperties = []; + + // reinit single feature add menu + $scope.initSingleFeatureAddMenu(); + + //variables for multiple feature import + + $scope.georesourceFeaturesGeoJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + + $scope.georesourceEditFeaturesDataSourceInputInvalidReason = undefined; + $scope.georesourceEditFeaturesDataSourceInputInvalid = false; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.featureInfoText_singleFeatureAddMenu = undefined; + $scope.datasourceType = undefined; + $scope.georesourceDataSourceIdProperty = undefined; + $scope.georesourceDataSourceNameProperty = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_georesources = undefined; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + + $("#georesourceEditFeaturesSuccessAlert").hide(); + $("#georesourceEditFeaturesErrorAlert").hide(); + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onChangeConverter = function(){ + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + + $scope.onChangeMimeType = function(mimeType){ + $scope.mimeType = mimeType; + }; + + $scope.filterByKomMonitorProperties = function() { + return function( item ) { + + try{ + if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate"){ + return false; + } + return true; + } + catch(error){ + return false; + } + }; + }; + + $scope.getFeatureId = function(geojsonFeature){ + return geojsonFeature.properties[__env.FEATURE_ID_PROPERTY_NAME]; + }; + + $scope.getFeatureName = function(geojsonFeature){ + return geojsonFeature.properties[__env.FEATURE_NAME_PROPERTY_NAME]; + }; + + $scope.checkPeriodOfValidity = function(){ + $scope.periodOfValidityInvalid = false; + if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate){ + var startDate = new Date($scope.periodOfValidity.startDate); + var endDate = new Date($scope.periodOfValidity.endDate); + + if ((startDate === endDate) || startDate > endDate){ + // failure + $scope.periodOfValidityInvalid = true; + } + } + }; + + $scope.onAddOrUpdateAttributeMapping = function(){ + var tmpAttributeMapping_adminView = { + "sourceName": $scope.attributeMapping_sourceAttributeName, + "destinationName": $scope.attributeMapping_destinationAttributeName, + "dataType": $scope.attributeMapping_attributeType + }; + + var processed = false; + + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; + + if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName){ + // replace object + $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; + processed = true; + break; + } + } + + if(! processed){ + // new entry + $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); + } + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickEditAttributeMapping = function(attributeMappingEntry){ + $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; + $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; + $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickDeleteAttributeMapping = function(attributeMappingEntry){ + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + + if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName){ + // remove object + $scope.attributeMappings_adminView.splice(index, 1); + break; + } + } + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.buildImporterObjects_singleFeatureImport = async function(){ + $scope.converterDefinition = kommonitorImporterHelperService.converterDefinition_singleFeatureImport; + $scope.datasourceTypeDefinition = kommonitorImporterHelperService.datasourceDefinition_singleFeatureImport; + $scope.propertyMappingDefinition = kommonitorImporterHelperService.propertyMappingDefinition_singleFeatureImport; + + // make geoJSON FeatureCollection and fill feature properties from single feature menu + $scope.featureGeometryValue.features[0].properties[__env.FEATURE_ID_PROPERTY_NAME] = $scope.featureIdValue; + $scope.featureGeometryValue.features[0].properties[__env.FEATURE_NAME_PROPERTY_NAME] = $scope.featureNameValue; + $scope.featureGeometryValue.features[0].properties[__env.VALID_START_DATE_PROPERTY_NAME] = $scope.featureStartDateValue; + $scope.featureGeometryValue.features[0].properties[__env.VALID_END_DATE_PROPERTY_NAME] = $scope.featureEndDateValue; + + for (const element of $scope.featureSchemaProperties) { + $scope.featureGeometryValue.features[0].properties[element.property] = element.value; + } + + $scope.datasourceTypeDefinition.parameters[0].value = JSON.stringify($scope.featureGeometryValue); + + var scopeProperties = { + "periodOfValidity": { + "endDate": $scope.featureEndDateValue, + "startDate": $scope.featureStartDateValue + }, + "isPartialUpdate": true + }; + $scope.putBody_georesources = kommonitorImporterHelperService.buildPutBody_georesources(scopeProperties); + + if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_georesources){ + return false; + } + + return true; + }; + + $scope.buildImporterObjects = async function(){ + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + + var scopeProperties = { + "periodOfValidity": { + "endDate": $scope.periodOfValidity.endDate, + "startDate": $scope.periodOfValidity.startDate + }, + "isPartialUpdate": $scope.isPartialUpdate + } + $scope.putBody_georesources = kommonitorImporterHelperService.buildPutBody_georesources(scopeProperties); + + if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_georesources){ + return false; + } + + return true; + }; + + $scope.buildConverterDefinition = function(){ + + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_georesourceEditFeatures_", $scope.schema, $scope.mimeType); + }; + + $scope.buildDatasourceTypeDefinition = async function(){ + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_georesourceEditFeatures_', 'georesourceDataSourceInput_editFeatures'); + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + return null; + } + }; + + $scope.buildPropertyMappingDefinition = function(){ + // arsion from is undefined currently + return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.georesourceDataSourceNameProperty, $scope.georesourceDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); + }; + + $scope.editGeoresourceFeatures = async function(){ + + $timeout(function(){ + $scope.loadingData = true; + }); + + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + /* + now collect data and build request for importer + */ + + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + + if (!allDataSpecified) { + + $("#georesourceEditFeaturesForm").validator("update"); + $("#georesourceEditFeaturesForm").validator("validate"); + return; + } + else { + + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + var updateGeoresourceResponse_dryRun = undefined; + try { + updateGeoresourceResponse_dryRun = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, true); + + // this callback will be called asynchronously + // when the response is available + + + + + if(! kommonitorImporterHelperService.importerResponseContainsErrors(updateGeoresourceResponse_dryRun)){ + // all good, really execute the request to import data against data management API + var updateGeoresourceResponse = await kommonitorImporterHelperService.updateGeoresource($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentGeoresourceDataset.georesourceId, $scope.putBody_georesources, false); + + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + $scope.refreshGeoresourceEditFeaturesOverviewTable(); + $scope.initSingleFeatureAddMenu(); + + $scope.successMessagePart = $scope.currentGeoresourceDataset.datasetName; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateGeoresourceResponse); + + $("#georesourceEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + } + else{ + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); + + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + + } + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if(updateGeoresourceResponse_dryRun){ + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateGeoresourceResponse_dryRun); + } + + $("#georesourceEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + }; + + $scope.onImportGeoresourceEditFeaturesMappingConfig = function(){ + + $scope.georesourceMappingConfigImportError = ""; + + $("#georesourceMappingConfigEditFeaturesImportFile").files = []; + + // trigger file chooser + $("#georesourceMappingConfigEditFeaturesImportFile").click(); + + }; + + $(document).on("change", "#georesourceMappingConfigEditFeaturesImportFile" ,function(){ + + console.log("Importing Importer Mapping Config for EditFeatures Georesource Form"); + + // get the file + var file = document.getElementById('georesourceMappingConfigEditFeaturesImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + + $scope.parseMappingConfigFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMappingConfigFile(event); + } + catch(error){ + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.georesourceMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("georesourcesEditFeaturesMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; + $("#georesourceEditFeaturesMappingConfigImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMappingConfigFile = function(event){ + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + + if(! $scope.mappingConfigImportSettings.converter || ! $scope.mappingConfigImportSettings.dataSource || ! $scope.mappingConfigImportSettings.propertyMapping){ + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("georesourcesEditFeaturesMappingConfigPre").innerHTML = $scope.georesourceMappingConfigStructure_pretty; + $("#georesourceEditFeaturesMappingConfigImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.converter = undefined; + for(var converter of kommonitorImporterHelperService.availableConverters){ + if (converter.name === $scope.mappingConfigImportSettings.converter.name){ + $scope.converter = converter; + break; + } + } + + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema){ + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema){ + $scope.schema = schema; + } + } + } + + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType){ + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType){ + $scope.mimeType = mimeType; + } + } + } + + $scope.datasourceType = undefined; + for(var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes){ + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type){ + $scope.datasourceType = datasourceType; + break; + } + } + + $scope.$digest(); + + // converter parameters + if ($scope.converter){ + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_georesourceEditFeatures_" + convParameter.name).val(convParameter.value); + } + } + + // datasourceTypes parameters + if ($scope.datasourceType){ + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_georesourceEditFeatures_" + dsParameter.name).val(dsParameter.value); + } + } + + // property Mapping + $scope.georesourceDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; + $scope.georesourceDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; + $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; + $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; + $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; + $scope.attributeMappings_adminView = []; + + for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { + var tmpEntry = { + "sourceName": attributeMapping.name, + "destinationName": attributeMapping.mappingName + }; + + for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { + if (dataType.apiName === attributeMapping.type){ + tmpEntry.dataType = dataType; + } + } + + $scope.attributeMappings_adminView.push(tmpEntry); + } + + if ($scope.mappingConfigImportSettings.periodOfValidity){ + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; + $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; + $scope.periodOfValidityInvalid = false; + + // update datePickers + if ($scope.periodOfValidity.startDate){ + $("#georesourceEditFeaturesDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); + } + if ($scope.periodOfValidity.endDate){ + $("#georesourceEditFeaturesDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); + } + } + + $scope.$digest(); + }; + + $scope.onExportGeoresourceEditFeaturesMappingConfig = async function(){ + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + }; + + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + + var name = $scope.datasetName; + + var metadataJSON = JSON.stringify(mappingConfigExport); + + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + + if (name){ + fileName += "-" + name; + } + + fileName += ".json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + + $scope.hideSuccessAlert = function(){ + $("#georesourceEditFeaturesSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#georesourceEditFeaturesErrorAlert").hide(); + }; + + $scope.hideMappingConfigErrorAlert = function(){ + $("#georesourceEditFeaturesMappingConfigImportErrorAlert").hide(); + }; + + $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_georesource, function(event){ + $timeout(function(){ + + $scope.loadingData = true; + }); + }); + + $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_georesource, function(event){ + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + + $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_georesource, function(event){ + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + $scope.refreshGeoresourceEditFeaturesOverviewTable(); + }); + + $scope.onChangeEnableDeleteFeatures = function(){ + if($scope.enableDeleteFeatures){ + $(".georesourceDeleteFeatureRecordBtn").attr("disabled", false); + } + else{ + $(".georesourceDeleteFeatureRecordBtn").attr("disabled", true); + } + } + + } +]}); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.js index bba9244db..6eaef3d53 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('georesourceEditFeaturesModal', ['kommonitorDataGridHelper', 'kommonitorImporterHelper', 'kommonitorSingleFeatureMapHelper', 'kommonitorMultiStepFormHelper']); +//# sourceMappingURL=georesource-edit-features-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.js.map new file mode 100644 index 000000000..d0e89d51d --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"georesource-edit-features-modal.module.js","sourceRoot":"","sources":["georesource-edit-features-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,8BAA8B,EAAE,CAAC,0BAA0B,EAAE,0BAA0B,EAAE,kCAAkC,EAAE,+BAA+B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.ts new file mode 100644 index 000000000..bba9244db --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditFeaturesModal/georesource-edit-features-modal.module.ts @@ -0,0 +1 @@ +angular.module('georesourceEditFeaturesModal', ['kommonitorDataGridHelper', 'kommonitorImporterHelper', 'kommonitorSingleFeatureMapHelper', 'kommonitorMultiStepFormHelper']); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.js index c56e79237..a96d875ba 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.js @@ -1,692 +1,562 @@ +"use strict"; angular.module('georesourceEditMetadataModal').component('georesourceEditMetadataModal', { - templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', - 'kommonitorDataGridHelperService', - function GeoresourceEditMetadataModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout, - kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.currentGeoresourceDataset; - - /* POST BODY - { - "isLOI": false, - "metadata": { - "note": "note", - "literature": "literature", - "updateInterval": "ARBITRARY", - "sridEPSG": 0.8008281904610115, - "datasource": "datasource", - "contact": "contact", - "lastUpdate": "2000-01-23", - "description": "description", - "databasis": "databasis" - }, - "allowedRoles": [ - "allowedRoles", - "allowedRoles" - ], - "datasetName": "datasetName", - "poiSymbolBootstrap3Name": "poiSymbolBootstrap3Name", - "poiSymbolColor": "white", - "isAOI": false, - "loiDashArrayString": "loiDashArrayString", - "topicReference": "topicReference", - "poiMarkerColor": "white", - "isPOI": false, - "loiColor": "loiColor", - "loiWidth": "loiWidth", - "aoiColor": "aoiColor" - } - */ - - //Date picker - $('#georesourceEditLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $scope.loadingData = false; - - $scope.georesourceMetadataStructure = { - "metadata": { - "note": "an optional note", - "literature": "optional text about literature", - "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", - "sridEPSG": 4326, - "datasource": "text about data source", - "contact": "text about contact details", - "lastUpdate": "YYYY-MM-DD", - "description": "description about spatial unit dataset", - "databasis": "text about data basis", - }, - "allowedRoles": ['roleId'], - "datasetName": "Name of georesource dataset", - "isPOI": "boolean parameter for point of interest dataset - only one of isPOI, isLOI, isAOI can be true", - "isLOI": "boolean parameter for lines of interest dataset - only one of isPOI, isLOI, isAOI can be true", - "isAOI": "boolean parameter for area of interest dataset - only one of isPOI, isLOI, isAOI can be true", - "poiSymbolBootstrap3Name": "glyphicon name of bootstrap 3 symbol to use for a POI resource", - "poiSymbolColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", - "loiDashArrayString": "dash array string value - e.g. 20 20", - "poiMarkerColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", - "loiColor": "color for lines of interest dataset", - "loiWidth": "width for lines of interest dataset", - "aoiColor": "color for area of interest dataset" - }; - - $scope.georesourceMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.georesourceMetadataStructure); - - $scope.metadataImportSettings; - $scope.georesourceMetadataImportError; - $scope.georesourceMetadataImportErrorAlert; - - $scope.datasetName = undefined; - $scope.datasetNameInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = undefined; - $scope.metadata.literature = undefined; - $scope.metadata.updateInterval = undefined; - $scope.metadata.sridEPSG = undefined; - $scope.metadata.datasource = undefined; - $scope.metadata.databasis = undefined; - $scope.metadata.contact = undefined; - $scope.metadata.lastUpdate = undefined; - $scope.metadata.description = undefined; - - $scope.roleManagementTableOptions = undefined; - - $scope.georesourceTopic_mainTopic = undefined; - $scope.georesourceTopic_subTopic = undefined; - $scope.georesourceTopic_subsubTopic = undefined; - $scope.georesourceTopic_subsubsubTopic = undefined; - - $scope.georesourceType = "poi"; - $scope.isPOI = true; - $scope.isLOI = false; - $scope.isAOI = false; - $scope.selectedPoiMarkerColor = kommonitorDataExchangeService.availablePoiMarkerColors[0]; - $scope.selectedPoiSymbolColor = kommonitorDataExchangeService.availablePoiMarkerColors[1]; - $scope.selectedLoiDashArrayObject = kommonitorDataExchangeService.availableLoiDashArrayObjects[0]; - $scope.loiColor = "#bf3d2c"; - $scope.loiWidth = 3; - $scope.aoiColor = "#bf3d2c"; - $scope.selectedPoiIconName = "home"; - - $scope.iconPickerOptions = { - align: 'center', // Only in div tag - arrowClass: 'btn-default', - arrowPrevIconClass: 'fas fa-angle-left', - arrowNextIconClass: 'fas fa-angle-right', - cols: 10, - footer: true, - header: true, - icon: 'glyphicon-' + $scope.selectedPoiIconName, - iconset: 'glyphicon', - labelHeader: '{0} von {1} Seiten', - labelFooter: '{0} - {1} von {2} Icons', - placement: 'bottom', // Only in button tag - rows: 6, - search: true, - searchText: 'Stichwortsuche (Bootstrap Glyphicons)', - selectedClass: 'btn-success', - unselectedClass: '' - }; - - $scope.$on("availableRolesUpdate", function (event) { - refreshRoles(); - }); - - function refreshRoles() { - let allowedRoles = $scope.currentGeoresourceDataset ? $scope.currentGeoresourceDataset.allowedRoles : []; - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); - } - - $('#poiSymbolEditPicker').iconpicker($scope.iconPickerOptions); - - $('#poiSymbolEditPicker').on('change', function(e) { - // split up due to current data management request structure where we expect only the last name of Bootstrap 3.3.7 glyphicon name - // i.e. "home" for "glyphicon-home" - $scope.selectedPoiIconName = e.icon.substring(e.icon.indexOf('-')+1); - }); - - $scope.loadingData = false; - - // initialize loiDashArray dropdown - setTimeout(function(){ - for(var i=0; i { - $scope.$digest(); - }, 250); - }; - - $scope.checkDatasetName = function(){ - $scope.datasetNameInvalid = false; - kommonitorDataExchangeService.availableGeoresources.forEach(function(georesource){ - if (georesource.datasetName === $scope.datasetName){ - $scope.datasetNameInvalid = true; - return; - } - }); - }; - - $scope.editGeoresourceMetadata = function(){ - - var patchBody = - { - "metadata": { - "note": $scope.metadata.note, - "literature": $scope.metadata.literature, - "updateInterval": $scope.metadata.updateInterval.apiName, - "sridEPSG": $scope.metadata.sridEPSG, - "datasource": $scope.metadata.datasource, - "contact": $scope.metadata.contact, - "lastUpdate": $scope.metadata.lastUpdate, - "description": $scope.metadata.description, - "databasis": $scope.metadata.databasis, - "sridEPSG": 4326 - }, - "allowedRoles": [], - "datasetName": $scope.datasetName, - "isAOI": $scope.isAOI, - "isLOI": $scope.isLOI, - "isPOI": $scope.isPOI, - "topicReference": null - }; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - patchBody.allowedRoles.push(roleId); - } - - if($scope.isPOI){ - patchBody["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; - patchBody["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; - patchBody["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; - - patchBody["loiDashArrayString"] = null; - patchBody["loiColor"] = null; - patchBody["loiWidth"] = null; - - patchBody["aoiColor"] = null; - } - else if($scope.isLOI){ - patchBody["poiSymbolBootstrap3Name"] = null; - patchBody["poiSymbolColor"] = null; - patchBody["poiMarkerColor"] = null; - - patchBody["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; - patchBody["loiColor"] = $scope.loiColor; - patchBody["loiWidth"] = $scope.loiWidth; - - patchBody["aoiColor"] = null; - } - else if($scope.isAOI){ - patchBody["poiSymbolBootstrap3Name"] = null; - patchBody["poiSymbolColor"] = null; - patchBody["poiMarkerColor"] = null; - - patchBody["loiDashArrayString"] = null; - patchBody["loiColor"] = null; - patchBody["loiWidth"] = null; - - patchBody["aoiColor"] = $scope.aoiColor; - } - - // TOPIC REFERENCE - if($scope.georesourceTopic_subsubsubTopic){ - patchBody.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; - } - else if($scope.georesourceTopic_subsubTopic){ - patchBody.topicReference = $scope.georesourceTopic_subsubTopic.topicId; - } - else if($scope.georesourceTopic_subTopic){ - patchBody.topicReference = $scope.georesourceTopic_subTopic.topicId; - } - else if($scope.georesourceTopic_mainTopic){ - patchBody.topicReference = $scope.georesourceTopic_mainTopic.topicId; - } - else { - patchBody.topicReference = ""; - } - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - $scope.loadingData = true; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId, - method: "PATCH", - data: patchBody - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.successMessagePart = $scope.datasetName; - - $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); - $("#georesourceEditMetadataSuccessAlert").show(); - $scope.loadingData = false; - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#georesourceEditMetadataErrorAlert").show(); - $scope.loadingData = false; - - // setTimeout(function() { - // $("#georesourceEditMetadataSuccessAlert").hide(); - // }, 3000); - }); - }; - - $scope.onImportGeoresourceEditMetadata = function(){ - - $scope.georesourceMetadataImportError = ""; - - $("#georesourceEditMetadataImportFile").files = []; - - // trigger file chooser - $("#georesourceEditMetadataImportFile").click(); - - }; - - $(document).on("change", "#georesourceEditMetadataImportFile" ,function(){ - - console.log("Importing Georesource metadata for Edit Georesource Form"); - - // get the file - var file = document.getElementById('georesourceEditMetadataImportFile').files[0]; - $scope.parseMetadataFromFile(file); - }); - - $scope.parseMetadataFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMetadataFile(event); - } - catch(error){ - console.error("Uploaded Metadata File cannot be parsed."); - $scope.georesourceMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; - document.getElementById("georesourcesEditMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; - $("#georesourceEditMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMetadataFile = function(event){ - // $scope.geoJsonString = event.target.result; - $scope.metadataImportSettings = JSON.parse(event.target.result); - - if(! $scope.metadataImportSettings.metadata){ - console.error("uploaded Metadata File cannot be parsed - wrong structure."); - $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("georesourcesEditMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; - $("#georesourceEditMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.metadata = {}; - $scope.metadata.note = $scope.metadataImportSettings.metadata.note; - $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; - kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ - if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ - $scope.metadata.updateInterval = option; - } - }); - $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; - $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; - $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; - $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; - // initialize date - $('#georesourceEditLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); - - $scope.metadata.description = $scope.metadataImportSettings.metadata.description; - $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; - - $scope.datasetName = $scope.metadataImportSettings.datasetName; - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); - - // georesource specific properties - - $scope.isPOI = $scope.metadataImportSettings.isPOI; - $scope.isLOI = $scope.metadataImportSettings.isLOI; - $scope.isAOI = $scope.metadataImportSettings.isAOI; - if($scope.metadataImportSettings.isPOI){ - $scope.georesourceType = "poi"; - } - else if($scope.metadataImportSettings.isLOI){ - $scope.georesourceType = "loi"; - } - else{ - $scope.georesourceType = "aoi"; - } - kommonitorDataExchangeService.availablePoiMarkerColors.forEach(function(option){ - if(option.colorName === $scope.metadataImportSettings.poiMarkerColor){ - $scope.selectedPoiMarkerColor = option; - } - if(option.colorName === $scope.metadataImportSettings.poiSymbolColor){ - $scope.selectedPoiSymbolColor = option; - } - }); - kommonitorDataExchangeService.availableLoiDashArrayObjects.forEach(function(option){ - if(option.dashArrayValue === $scope.metadataImportSettings.loiDashArrayString){ - $scope.selectedLoiDashArrayObject = option; - $scope.onChangeLoiDashArray($scope.selectedLoiDashArrayObject); - } - }); - $scope.loiColor = $scope.metadataImportSettings.loiColor; - $scope.loiWidth = $scope.metadataImportSettings.loiWidth; - $scope.aoiColor = $scope.metadataImportSettings.aoiColor; - - $('#loiColorEditPicker').colorpicker('setValue', $scope.loiColor); - $('#aoiColorEditPicker').colorpicker('setValue', $scope.aoiColor); - - $scope.selectedPoiIconName = $scope.metadataImportSettings.poiSymbolBootstrap3Name; - - var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); - - if(topicHierarchy && topicHierarchy[0]){ - $scope.georesourceTopic_mainTopic = topicHierarchy[0]; - } - if(topicHierarchy && topicHierarchy[1]){ - $scope.georesourceTopic_subTopic = topicHierarchy[1]; - } - if(topicHierarchy && topicHierarchy[2]){ - $scope.georesourceTopic_subsubTopic = topicHierarchy[2]; - } - if(topicHierarchy && topicHierarchy[3]){ - $scope.georesourceTopic_subsubsubTopic = topicHierarchy[3]; - } - - setTimeout(function(){ - $("#poiSymbolEditPicker").val("").iconpicker('setIcon', 'glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); - // $("#poiSymbolPicker i").css('glyphicon glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); - // $("#poiSymbolPicker input").css('glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); - }, 200); - - $scope.$digest(); - } - - $scope.onExportGeoresourceEditMetadataTemplate = function(){ - - var metadataJSON = JSON.stringify($scope.georesourceMetadataStructure); - - var fileName = "Georessource_Metadaten_Vorlage_Export.json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - $scope.onExportGeoresourceEditMetadata = function(){ - var metadataExport = $scope.georesourceMetadataStructure; - - metadataExport.metadata.note = $scope.metadata.note || ""; - metadataExport.metadata.literature = $scope.metadata.literature || ""; - metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; - metadataExport.metadata.datasource = $scope.metadata.datasource || ""; - metadataExport.metadata.contact = $scope.metadata.contact || ""; - metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; - metadataExport.metadata.description = $scope.metadata.description || ""; - metadataExport.metadata.databasis = $scope.metadata.databasis || ""; - metadataExport.datasetName = $scope.datasetName || ""; - - metadataExport.allowedRoles = []; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - metadataExport.allowedRoles.push(roleId); - } - - if($scope.metadata.updateInterval){ - metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; - } - - var name = $scope.datasetName; - - // georesource specific properties - metadataExport.isPOI = $scope.isPOI; - metadataExport.isLOI = $scope.isLOI; - metadataExport.isAOI = $scope.isAOI; - - if($scope.isPOI){ - metadataExport["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; - metadataExport["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; - metadataExport["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; - - metadataExport["loiDashArrayString"] = ""; - metadataExport["loiColor"] = ""; - metadataExport["loiWidth"] = ""; - - metadataExport["aoiColor"] = ""; - } - else if($scope.isLOI){ - metadataExport["poiSymbolBootstrap3Name"] = ""; - metadataExport["poiSymbolColor"] = ""; - metadataExport["poiMarkerColor"] = ""; - - metadataExport["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; - metadataExport["loiColor"] = $scope.loiColor; - metadataExport["loiWidth"] = $scope.loiWidth; - - metadataExport["aoiColor"] = ""; - } - else if($scope.isAOI){ - metadataExport["poiSymbolBootstrap3Name"] = ""; - metadataExport["poiSymbolColor"] = ""; - metadataExport["poiMarkerColor"] = ""; - - metadataExport["loiDashArrayString"] = ""; - metadataExport["loiColor"] = ""; - metadataExport["loiWidth"] = ""; - - metadataExport["aoiColor"] = $scope.aoiColor; - } - - if($scope.georesourceTopic_subsubsubTopic){ - metadataExport.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; - } - else if($scope.georesourceTopic_subsubTopic){ - metadataExport.topicReference = $scope.georesourceTopic_subsubTopic.topicId; - } - else if($scope.georesourceTopic_subTopic){ - metadataExport.topicReference = $scope.georesourceTopic_subTopic.topicId; - } - else if($scope.georesourceTopic_mainTopic){ - metadataExport.topicReference = $scope.georesourceTopic_mainTopic.topicId; - } - else { - metadataExport.topicReference = ""; - } - - - var metadataJSON = JSON.stringify(metadataExport); - - var fileName = "Georessource_Metadaten_Export"; - - if (name){ - fileName += "-" + name; - } - - fileName += ".json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - $scope.onChangeMarkerColor = function(markerColor){ - $scope.selectedPoiMarkerColor = markerColor; - }; - - $scope.onChangeSymbolColor = function(symbolColor){ - $scope.selectedPoiSymbolColor = symbolColor; - }; - - $scope.onChangeLoiDashArray = function(loiDashArrayObject){ - $scope.selectedLoiDashArrayObject = loiDashArrayObject; - $("#loiDashArrayEditDropdownButton").html(loiDashArrayObject.svgString); - }; - - $scope.hideSuccessAlert = function(){ - $("#georesourceEditMetadataSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#georesourceEditMetadataErrorAlert").hide(); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + 'kommonitorDataGridHelperService', + function GeoresourceEditMetadataModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.currentGeoresourceDataset; + /* POST BODY + { + "isLOI": false, + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "allowedRoles": [ + "allowedRoles", + "allowedRoles" + ], + "datasetName": "datasetName", + "poiSymbolBootstrap3Name": "poiSymbolBootstrap3Name", + "poiSymbolColor": "white", + "isAOI": false, + "loiDashArrayString": "loiDashArrayString", + "topicReference": "topicReference", + "poiMarkerColor": "white", + "isPOI": false, + "loiColor": "loiColor", + "loiWidth": "loiWidth", + "aoiColor": "aoiColor" + } + */ + //Date picker + $('#georesourceEditLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + $scope.loadingData = false; + $scope.georesourceMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "datasetName": "Name of georesource dataset", + "isPOI": "boolean parameter for point of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "isLOI": "boolean parameter for lines of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "isAOI": "boolean parameter for area of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "poiSymbolBootstrap3Name": "glyphicon name of bootstrap 3 symbol to use for a POI resource", + "poiSymbolColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", + "loiDashArrayString": "dash array string value - e.g. 20 20", + "poiMarkerColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", + "loiColor": "color for lines of interest dataset", + "loiWidth": "width for lines of interest dataset", + "aoiColor": "color for area of interest dataset" + }; + $scope.georesourceMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.georesourceMetadataStructure); + $scope.metadataImportSettings; + $scope.georesourceMetadataImportError; + $scope.georesourceMetadataImportErrorAlert; + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + $scope.roleManagementTableOptions = undefined; + $scope.georesourceTopic_mainTopic = undefined; + $scope.georesourceTopic_subTopic = undefined; + $scope.georesourceTopic_subsubTopic = undefined; + $scope.georesourceTopic_subsubsubTopic = undefined; + $scope.georesourceType = "poi"; + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + $scope.selectedPoiMarkerColor = kommonitorDataExchangeService.availablePoiMarkerColors[0]; + $scope.selectedPoiSymbolColor = kommonitorDataExchangeService.availablePoiMarkerColors[1]; + $scope.selectedLoiDashArrayObject = kommonitorDataExchangeService.availableLoiDashArrayObjects[0]; + $scope.loiColor = "#bf3d2c"; + $scope.loiWidth = 3; + $scope.aoiColor = "#bf3d2c"; + $scope.selectedPoiIconName = "home"; + $scope.iconPickerOptions = { + align: 'center', + arrowClass: 'btn-default', + arrowPrevIconClass: 'fas fa-angle-left', + arrowNextIconClass: 'fas fa-angle-right', + cols: 10, + footer: true, + header: true, + icon: 'glyphicon-' + $scope.selectedPoiIconName, + iconset: 'glyphicon', + labelHeader: '{0} von {1} Seiten', + labelFooter: '{0} - {1} von {2} Icons', + placement: 'bottom', + rows: 6, + search: true, + searchText: 'Stichwortsuche (Bootstrap Glyphicons)', + selectedClass: 'btn-success', + unselectedClass: '' + }; + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + function refreshRoles() { + let allowedRoles = $scope.currentGeoresourceDataset ? $scope.currentGeoresourceDataset.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + } + $('#poiSymbolEditPicker').iconpicker($scope.iconPickerOptions); + $('#poiSymbolEditPicker').on('change', function (e) { + // split up due to current data management request structure where we expect only the last name of Bootstrap 3.3.7 glyphicon name + // i.e. "home" for "glyphicon-home" + $scope.selectedPoiIconName = e.icon.substring(e.icon.indexOf('-') + 1); + }); + $scope.loadingData = false; + // initialize loiDashArray dropdown + setTimeout(function () { + for (var i = 0; i < kommonitorDataExchangeService.availableLoiDashArrayObjects.length; i++) { + $("#loiDashArrayEditDropdownItem-" + i).html(kommonitorDataExchangeService.availableLoiDashArrayObjects[i].svgString); + } + $("#loiDashArrayEditDropdownButton").html($scope.selectedLoiDashArrayObject.svgString); + }, 1000); + // initialize colorPickers + $('#loiColorEditPicker').colorpicker(); + $('#aoiColorEditPicker').colorpicker(); + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.$on("onEditGeoresourceMetadata", function (event, georesourceDataset) { + $scope.currentGeoresourceDataset = georesourceDataset; + $scope.resetGeoresourceEditMetadataForm(); + kommonitorMultiStepFormHelperService.registerClickHandler(); + }); + $scope.resetGeoresourceEditMetadataForm = function () { + $scope.datasetName = $scope.currentGeoresourceDataset.datasetName; + $scope.datasetNameInvalid = false; + $scope.metadata = {}; + $scope.metadata.note = $scope.currentGeoresourceDataset.metadata.note; + $scope.metadata.literature = $scope.currentGeoresourceDataset.metadata.literature; + $scope.metadata.sridEPSG = 4326; + $scope.metadata.datasource = $scope.currentGeoresourceDataset.metadata.datasource; + $scope.metadata.databasis = $scope.currentGeoresourceDataset.metadata.databasis; + $scope.metadata.contact = $scope.currentGeoresourceDataset.metadata.contact; + $scope.metadata.description = $scope.currentGeoresourceDataset.metadata.description; + $scope.metadata.lastUpdate = $scope.currentGeoresourceDataset.metadata.lastUpdate; + // $('#georesourceEditLastUpdateDatepicker').data({date: $scope.currentGeoresourceDataset.metadata.lastUpdate}); + $('#georesourceEditLastUpdateDatepicker').datepicker('setDate', $scope.currentGeoresourceDataset.metadata.lastUpdate); + kommonitorDataExchangeService.updateIntervalOptions.forEach(function (option) { + if (option.apiName === $scope.currentGeoresourceDataset.metadata.updateInterval) { + $scope.metadata.updateInterval = option; + } + }); + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.currentGeoresourceDataset.allowedRoles); + $scope.isPOI = $scope.currentGeoresourceDataset.isPOI; + $scope.isLOI = $scope.currentGeoresourceDataset.isLOI; + $scope.isAOI = $scope.currentGeoresourceDataset.isAOI; + if ($scope.isPOI) { + $scope.georesourceType = "poi"; + } + else if ($scope.isLOI) { + $scope.georesourceType = "loi"; + } + else { + $scope.georesourceType = "aoi"; + } + kommonitorDataExchangeService.availablePoiMarkerColors.forEach(function (option) { + if (option.colorName === $scope.currentGeoresourceDataset.poiMarkerColor) { + $scope.selectedPoiMarkerColor = option; + } + if (option.colorName === $scope.currentGeoresourceDataset.poiSymbolColor) { + $scope.selectedPoiSymbolColor = option; + } + }); + kommonitorDataExchangeService.availableLoiDashArrayObjects.forEach(function (option) { + if (option.dashArrayValue === $scope.currentGeoresourceDataset.loiDashArrayString) { + $scope.selectedLoiDashArrayObject = option; + $scope.onChangeLoiDashArray($scope.selectedLoiDashArrayObject); + } + }); + $scope.loiColor = $scope.currentGeoresourceDataset.loiColor; + $scope.loiWidth = $scope.currentGeoresourceDataset.loiWidth || 3; + $scope.aoiColor = $scope.currentGeoresourceDataset.aoiColor; + $('#loiColorEditPicker').colorpicker('setValue', $scope.loiColor); + $('#aoiColorEditPicker').colorpicker('setValue', $scope.aoiColor); + $scope.selectedPoiIconName = $scope.currentGeoresourceDataset.poiSymbolBootstrap3Name; + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.currentGeoresourceDataset.topicReference); + if (topicHierarchy && topicHierarchy[0]) { + $scope.georesourceTopic_mainTopic = topicHierarchy[0]; + } + if (topicHierarchy && topicHierarchy[1]) { + $scope.georesourceTopic_subTopic = topicHierarchy[1]; + } + if (topicHierarchy && topicHierarchy[2]) { + $scope.georesourceTopic_subsubTopic = topicHierarchy[2]; + } + if (topicHierarchy && topicHierarchy[3]) { + $scope.georesourceTopic_subsubsubTopic = topicHierarchy[3]; + } + setTimeout(function () { + $("#poiSymbolEditPicker").val("").iconpicker('setIcon', 'glyphicon-' + $scope.currentGeoresourceDataset.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker i").css('glyphicon glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker input").css('glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + }, 200); + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $("#georesourceEditMetadataSuccessAlert").hide(); + $("#georesourceEditMetadataErrorAlert").hide(); + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.checkDatasetName = function () { + $scope.datasetNameInvalid = false; + kommonitorDataExchangeService.availableGeoresources.forEach(function (georesource) { + if (georesource.datasetName === $scope.datasetName) { + $scope.datasetNameInvalid = true; + return; + } + }); + }; + $scope.editGeoresourceMetadata = function () { + var patchBody = { + "metadata": { + "note": $scope.metadata.note, + "literature": $scope.metadata.literature, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description, + "databasis": $scope.metadata.databasis, + "sridEPSG": 4326 + }, + "allowedRoles": [], + "datasetName": $scope.datasetName, + "isAOI": $scope.isAOI, + "isLOI": $scope.isLOI, + "isPOI": $scope.isPOI, + "topicReference": null + }; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + patchBody.allowedRoles.push(roleId); + } + if ($scope.isPOI) { + patchBody["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; + patchBody["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; + patchBody["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; + patchBody["loiDashArrayString"] = null; + patchBody["loiColor"] = null; + patchBody["loiWidth"] = null; + patchBody["aoiColor"] = null; + } + else if ($scope.isLOI) { + patchBody["poiSymbolBootstrap3Name"] = null; + patchBody["poiSymbolColor"] = null; + patchBody["poiMarkerColor"] = null; + patchBody["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; + patchBody["loiColor"] = $scope.loiColor; + patchBody["loiWidth"] = $scope.loiWidth; + patchBody["aoiColor"] = null; + } + else if ($scope.isAOI) { + patchBody["poiSymbolBootstrap3Name"] = null; + patchBody["poiSymbolColor"] = null; + patchBody["poiMarkerColor"] = null; + patchBody["loiDashArrayString"] = null; + patchBody["loiColor"] = null; + patchBody["loiWidth"] = null; + patchBody["aoiColor"] = $scope.aoiColor; + } + // TOPIC REFERENCE + if ($scope.georesourceTopic_subsubsubTopic) { + patchBody.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; + } + else if ($scope.georesourceTopic_subsubTopic) { + patchBody.topicReference = $scope.georesourceTopic_subsubTopic.topicId; + } + else if ($scope.georesourceTopic_subTopic) { + patchBody.topicReference = $scope.georesourceTopic_subTopic.topicId; + } + else if ($scope.georesourceTopic_mainTopic) { + patchBody.topicReference = $scope.georesourceTopic_mainTopic.topicId; + } + else { + patchBody.topicReference = ""; + } + // TODO verify input + // TODO Create and perform POST Request with loading screen + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId, + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.successMessagePart = $scope.datasetName; + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + $("#georesourceEditMetadataSuccessAlert").show(); + $scope.loadingData = false; + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#georesourceEditMetadataErrorAlert").show(); + $scope.loadingData = false; + // setTimeout(function() { + // $("#georesourceEditMetadataSuccessAlert").hide(); + // }, 3000); + }); + }; + $scope.onImportGeoresourceEditMetadata = function () { + $scope.georesourceMetadataImportError = ""; + $("#georesourceEditMetadataImportFile").files = []; + // trigger file chooser + $("#georesourceEditMetadataImportFile").click(); + }; + $(document).on("change", "#georesourceEditMetadataImportFile", function () { + console.log("Importing Georesource metadata for Edit Georesource Form"); + // get the file + var file = document.getElementById('georesourceEditMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + $scope.parseMetadataFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMetadataFile(event); + } + catch (error) { + console.error("Uploaded Metadata File cannot be parsed."); + $scope.georesourceMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("georesourcesEditMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; + $("#georesourceEditMetadataImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMetadataFile = function (event) { + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + if (!$scope.metadataImportSettings.metadata) { + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("georesourcesEditMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; + $("#georesourceEditMetadataImportErrorAlert").show(); + $scope.$digest(); + } + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function (option) { + if (option.apiName === $scope.metadataImportSettings.metadata.updateInterval) { + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#georesourceEditLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + $scope.datasetName = $scope.metadataImportSettings.datasetName; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + // georesource specific properties + $scope.isPOI = $scope.metadataImportSettings.isPOI; + $scope.isLOI = $scope.metadataImportSettings.isLOI; + $scope.isAOI = $scope.metadataImportSettings.isAOI; + if ($scope.metadataImportSettings.isPOI) { + $scope.georesourceType = "poi"; + } + else if ($scope.metadataImportSettings.isLOI) { + $scope.georesourceType = "loi"; + } + else { + $scope.georesourceType = "aoi"; + } + kommonitorDataExchangeService.availablePoiMarkerColors.forEach(function (option) { + if (option.colorName === $scope.metadataImportSettings.poiMarkerColor) { + $scope.selectedPoiMarkerColor = option; + } + if (option.colorName === $scope.metadataImportSettings.poiSymbolColor) { + $scope.selectedPoiSymbolColor = option; + } + }); + kommonitorDataExchangeService.availableLoiDashArrayObjects.forEach(function (option) { + if (option.dashArrayValue === $scope.metadataImportSettings.loiDashArrayString) { + $scope.selectedLoiDashArrayObject = option; + $scope.onChangeLoiDashArray($scope.selectedLoiDashArrayObject); + } + }); + $scope.loiColor = $scope.metadataImportSettings.loiColor; + $scope.loiWidth = $scope.metadataImportSettings.loiWidth; + $scope.aoiColor = $scope.metadataImportSettings.aoiColor; + $('#loiColorEditPicker').colorpicker('setValue', $scope.loiColor); + $('#aoiColorEditPicker').colorpicker('setValue', $scope.aoiColor); + $scope.selectedPoiIconName = $scope.metadataImportSettings.poiSymbolBootstrap3Name; + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); + if (topicHierarchy && topicHierarchy[0]) { + $scope.georesourceTopic_mainTopic = topicHierarchy[0]; + } + if (topicHierarchy && topicHierarchy[1]) { + $scope.georesourceTopic_subTopic = topicHierarchy[1]; + } + if (topicHierarchy && topicHierarchy[2]) { + $scope.georesourceTopic_subsubTopic = topicHierarchy[2]; + } + if (topicHierarchy && topicHierarchy[3]) { + $scope.georesourceTopic_subsubsubTopic = topicHierarchy[3]; + } + setTimeout(function () { + $("#poiSymbolEditPicker").val("").iconpicker('setIcon', 'glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker i").css('glyphicon glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker input").css('glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + }, 200); + $scope.$digest(); + }; + $scope.onExportGeoresourceEditMetadataTemplate = function () { + var metadataJSON = JSON.stringify($scope.georesourceMetadataStructure); + var fileName = "Georessource_Metadaten_Vorlage_Export.json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onExportGeoresourceEditMetadata = function () { + var metadataExport = $scope.georesourceMetadataStructure; + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.datasetName = $scope.datasetName || ""; + metadataExport.allowedRoles = []; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + if ($scope.metadata.updateInterval) { + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + var name = $scope.datasetName; + // georesource specific properties + metadataExport.isPOI = $scope.isPOI; + metadataExport.isLOI = $scope.isLOI; + metadataExport.isAOI = $scope.isAOI; + if ($scope.isPOI) { + metadataExport["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; + metadataExport["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; + metadataExport["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; + metadataExport["loiDashArrayString"] = ""; + metadataExport["loiColor"] = ""; + metadataExport["loiWidth"] = ""; + metadataExport["aoiColor"] = ""; + } + else if ($scope.isLOI) { + metadataExport["poiSymbolBootstrap3Name"] = ""; + metadataExport["poiSymbolColor"] = ""; + metadataExport["poiMarkerColor"] = ""; + metadataExport["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; + metadataExport["loiColor"] = $scope.loiColor; + metadataExport["loiWidth"] = $scope.loiWidth; + metadataExport["aoiColor"] = ""; + } + else if ($scope.isAOI) { + metadataExport["poiSymbolBootstrap3Name"] = ""; + metadataExport["poiSymbolColor"] = ""; + metadataExport["poiMarkerColor"] = ""; + metadataExport["loiDashArrayString"] = ""; + metadataExport["loiColor"] = ""; + metadataExport["loiWidth"] = ""; + metadataExport["aoiColor"] = $scope.aoiColor; + } + if ($scope.georesourceTopic_subsubsubTopic) { + metadataExport.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; + } + else if ($scope.georesourceTopic_subsubTopic) { + metadataExport.topicReference = $scope.georesourceTopic_subsubTopic.topicId; + } + else if ($scope.georesourceTopic_subTopic) { + metadataExport.topicReference = $scope.georesourceTopic_subTopic.topicId; + } + else if ($scope.georesourceTopic_mainTopic) { + metadataExport.topicReference = $scope.georesourceTopic_mainTopic.topicId; + } + else { + metadataExport.topicReference = ""; + } + var metadataJSON = JSON.stringify(metadataExport); + var fileName = "Georessource_Metadaten_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onChangeMarkerColor = function (markerColor) { + $scope.selectedPoiMarkerColor = markerColor; + }; + $scope.onChangeSymbolColor = function (symbolColor) { + $scope.selectedPoiSymbolColor = symbolColor; + }; + $scope.onChangeLoiDashArray = function (loiDashArrayObject) { + $scope.selectedLoiDashArrayObject = loiDashArrayObject; + $("#loiDashArrayEditDropdownButton").html(loiDashArrayObject.svgString); + }; + $scope.hideSuccessAlert = function () { + $("#georesourceEditMetadataSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#georesourceEditMetadataErrorAlert").hide(); + }; + } + ] +}); +//# sourceMappingURL=georesource-edit-metadata-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.js.map new file mode 100644 index 000000000..c8c02627c --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"georesource-edit-metadata-modal.component.js","sourceRoot":"","sources":["georesource-edit-metadata-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.ts new file mode 100644 index 000000000..c56e79237 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.component.ts @@ -0,0 +1,692 @@ +angular.module('georesourceEditMetadataModal').component('georesourceEditMetadataModal', { + templateUrl : "components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + 'kommonitorDataGridHelperService', + function GeoresourceEditMetadataModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout, + kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.currentGeoresourceDataset; + + /* POST BODY + { + "isLOI": false, + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "allowedRoles": [ + "allowedRoles", + "allowedRoles" + ], + "datasetName": "datasetName", + "poiSymbolBootstrap3Name": "poiSymbolBootstrap3Name", + "poiSymbolColor": "white", + "isAOI": false, + "loiDashArrayString": "loiDashArrayString", + "topicReference": "topicReference", + "poiMarkerColor": "white", + "isPOI": false, + "loiColor": "loiColor", + "loiWidth": "loiWidth", + "aoiColor": "aoiColor" + } + */ + + //Date picker + $('#georesourceEditLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + + $scope.loadingData = false; + + $scope.georesourceMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "datasetName": "Name of georesource dataset", + "isPOI": "boolean parameter for point of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "isLOI": "boolean parameter for lines of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "isAOI": "boolean parameter for area of interest dataset - only one of isPOI, isLOI, isAOI can be true", + "poiSymbolBootstrap3Name": "glyphicon name of bootstrap 3 symbol to use for a POI resource", + "poiSymbolColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", + "loiDashArrayString": "dash array string value - e.g. 20 20", + "poiMarkerColor": "'white'|'red'|'orange'|'beige'|'green'|'blue'|'purple'|'pink'|'gray'|'black'", + "loiColor": "color for lines of interest dataset", + "loiWidth": "width for lines of interest dataset", + "aoiColor": "color for area of interest dataset" + }; + + $scope.georesourceMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.georesourceMetadataStructure); + + $scope.metadataImportSettings; + $scope.georesourceMetadataImportError; + $scope.georesourceMetadataImportErrorAlert; + + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + + $scope.roleManagementTableOptions = undefined; + + $scope.georesourceTopic_mainTopic = undefined; + $scope.georesourceTopic_subTopic = undefined; + $scope.georesourceTopic_subsubTopic = undefined; + $scope.georesourceTopic_subsubsubTopic = undefined; + + $scope.georesourceType = "poi"; + $scope.isPOI = true; + $scope.isLOI = false; + $scope.isAOI = false; + $scope.selectedPoiMarkerColor = kommonitorDataExchangeService.availablePoiMarkerColors[0]; + $scope.selectedPoiSymbolColor = kommonitorDataExchangeService.availablePoiMarkerColors[1]; + $scope.selectedLoiDashArrayObject = kommonitorDataExchangeService.availableLoiDashArrayObjects[0]; + $scope.loiColor = "#bf3d2c"; + $scope.loiWidth = 3; + $scope.aoiColor = "#bf3d2c"; + $scope.selectedPoiIconName = "home"; + + $scope.iconPickerOptions = { + align: 'center', // Only in div tag + arrowClass: 'btn-default', + arrowPrevIconClass: 'fas fa-angle-left', + arrowNextIconClass: 'fas fa-angle-right', + cols: 10, + footer: true, + header: true, + icon: 'glyphicon-' + $scope.selectedPoiIconName, + iconset: 'glyphicon', + labelHeader: '{0} von {1} Seiten', + labelFooter: '{0} - {1} von {2} Icons', + placement: 'bottom', // Only in button tag + rows: 6, + search: true, + searchText: 'Stichwortsuche (Bootstrap Glyphicons)', + selectedClass: 'btn-success', + unselectedClass: '' + }; + + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + + function refreshRoles() { + let allowedRoles = $scope.currentGeoresourceDataset ? $scope.currentGeoresourceDataset.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + } + + $('#poiSymbolEditPicker').iconpicker($scope.iconPickerOptions); + + $('#poiSymbolEditPicker').on('change', function(e) { + // split up due to current data management request structure where we expect only the last name of Bootstrap 3.3.7 glyphicon name + // i.e. "home" for "glyphicon-home" + $scope.selectedPoiIconName = e.icon.substring(e.icon.indexOf('-')+1); + }); + + $scope.loadingData = false; + + // initialize loiDashArray dropdown + setTimeout(function(){ + for(var i=0; i { + $scope.$digest(); + }, 250); + }; + + $scope.checkDatasetName = function(){ + $scope.datasetNameInvalid = false; + kommonitorDataExchangeService.availableGeoresources.forEach(function(georesource){ + if (georesource.datasetName === $scope.datasetName){ + $scope.datasetNameInvalid = true; + return; + } + }); + }; + + $scope.editGeoresourceMetadata = function(){ + + var patchBody = + { + "metadata": { + "note": $scope.metadata.note, + "literature": $scope.metadata.literature, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description, + "databasis": $scope.metadata.databasis, + "sridEPSG": 4326 + }, + "allowedRoles": [], + "datasetName": $scope.datasetName, + "isAOI": $scope.isAOI, + "isLOI": $scope.isLOI, + "isPOI": $scope.isPOI, + "topicReference": null + }; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + patchBody.allowedRoles.push(roleId); + } + + if($scope.isPOI){ + patchBody["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; + patchBody["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; + patchBody["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; + + patchBody["loiDashArrayString"] = null; + patchBody["loiColor"] = null; + patchBody["loiWidth"] = null; + + patchBody["aoiColor"] = null; + } + else if($scope.isLOI){ + patchBody["poiSymbolBootstrap3Name"] = null; + patchBody["poiSymbolColor"] = null; + patchBody["poiMarkerColor"] = null; + + patchBody["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; + patchBody["loiColor"] = $scope.loiColor; + patchBody["loiWidth"] = $scope.loiWidth; + + patchBody["aoiColor"] = null; + } + else if($scope.isAOI){ + patchBody["poiSymbolBootstrap3Name"] = null; + patchBody["poiSymbolColor"] = null; + patchBody["poiMarkerColor"] = null; + + patchBody["loiDashArrayString"] = null; + patchBody["loiColor"] = null; + patchBody["loiWidth"] = null; + + patchBody["aoiColor"] = $scope.aoiColor; + } + + // TOPIC REFERENCE + if($scope.georesourceTopic_subsubsubTopic){ + patchBody.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; + } + else if($scope.georesourceTopic_subsubTopic){ + patchBody.topicReference = $scope.georesourceTopic_subsubTopic.topicId; + } + else if($scope.georesourceTopic_subTopic){ + patchBody.topicReference = $scope.georesourceTopic_subTopic.topicId; + } + else if($scope.georesourceTopic_mainTopic){ + patchBody.topicReference = $scope.georesourceTopic_mainTopic.topicId; + } + else { + patchBody.topicReference = ""; + } + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + $scope.loadingData = true; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/georesources/" + $scope.currentGeoresourceDataset.georesourceId, + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $scope.successMessagePart = $scope.datasetName; + + $rootScope.$broadcast("refreshGeoresourceOverviewTable", "edit", $scope.currentGeoresourceDataset.georesourceId); + $("#georesourceEditMetadataSuccessAlert").show(); + $scope.loadingData = false; + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#georesourceEditMetadataErrorAlert").show(); + $scope.loadingData = false; + + // setTimeout(function() { + // $("#georesourceEditMetadataSuccessAlert").hide(); + // }, 3000); + }); + }; + + $scope.onImportGeoresourceEditMetadata = function(){ + + $scope.georesourceMetadataImportError = ""; + + $("#georesourceEditMetadataImportFile").files = []; + + // trigger file chooser + $("#georesourceEditMetadataImportFile").click(); + + }; + + $(document).on("change", "#georesourceEditMetadataImportFile" ,function(){ + + console.log("Importing Georesource metadata for Edit Georesource Form"); + + // get the file + var file = document.getElementById('georesourceEditMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + + $scope.parseMetadataFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMetadataFile(event); + } + catch(error){ + console.error("Uploaded Metadata File cannot be parsed."); + $scope.georesourceMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("georesourcesEditMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; + $("#georesourceEditMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMetadataFile = function(event){ + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + + if(! $scope.metadataImportSettings.metadata){ + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.georesourceMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("georesourcesEditMetadataPre").innerHTML = $scope.georesourceMetadataStructure_pretty; + $("#georesourceEditMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ + if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#georesourceEditLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + + $scope.datasetName = $scope.metadataImportSettings.datasetName; + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('georesourceEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + + // georesource specific properties + + $scope.isPOI = $scope.metadataImportSettings.isPOI; + $scope.isLOI = $scope.metadataImportSettings.isLOI; + $scope.isAOI = $scope.metadataImportSettings.isAOI; + if($scope.metadataImportSettings.isPOI){ + $scope.georesourceType = "poi"; + } + else if($scope.metadataImportSettings.isLOI){ + $scope.georesourceType = "loi"; + } + else{ + $scope.georesourceType = "aoi"; + } + kommonitorDataExchangeService.availablePoiMarkerColors.forEach(function(option){ + if(option.colorName === $scope.metadataImportSettings.poiMarkerColor){ + $scope.selectedPoiMarkerColor = option; + } + if(option.colorName === $scope.metadataImportSettings.poiSymbolColor){ + $scope.selectedPoiSymbolColor = option; + } + }); + kommonitorDataExchangeService.availableLoiDashArrayObjects.forEach(function(option){ + if(option.dashArrayValue === $scope.metadataImportSettings.loiDashArrayString){ + $scope.selectedLoiDashArrayObject = option; + $scope.onChangeLoiDashArray($scope.selectedLoiDashArrayObject); + } + }); + $scope.loiColor = $scope.metadataImportSettings.loiColor; + $scope.loiWidth = $scope.metadataImportSettings.loiWidth; + $scope.aoiColor = $scope.metadataImportSettings.aoiColor; + + $('#loiColorEditPicker').colorpicker('setValue', $scope.loiColor); + $('#aoiColorEditPicker').colorpicker('setValue', $scope.aoiColor); + + $scope.selectedPoiIconName = $scope.metadataImportSettings.poiSymbolBootstrap3Name; + + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); + + if(topicHierarchy && topicHierarchy[0]){ + $scope.georesourceTopic_mainTopic = topicHierarchy[0]; + } + if(topicHierarchy && topicHierarchy[1]){ + $scope.georesourceTopic_subTopic = topicHierarchy[1]; + } + if(topicHierarchy && topicHierarchy[2]){ + $scope.georesourceTopic_subsubTopic = topicHierarchy[2]; + } + if(topicHierarchy && topicHierarchy[3]){ + $scope.georesourceTopic_subsubsubTopic = topicHierarchy[3]; + } + + setTimeout(function(){ + $("#poiSymbolEditPicker").val("").iconpicker('setIcon', 'glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker i").css('glyphicon glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + // $("#poiSymbolPicker input").css('glyphicon-' + $scope.metadataImportSettings.poiSymbolBootstrap3Name); + }, 200); + + $scope.$digest(); + } + + $scope.onExportGeoresourceEditMetadataTemplate = function(){ + + var metadataJSON = JSON.stringify($scope.georesourceMetadataStructure); + + var fileName = "Georessource_Metadaten_Vorlage_Export.json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + $scope.onExportGeoresourceEditMetadata = function(){ + var metadataExport = $scope.georesourceMetadataStructure; + + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.datasetName = $scope.datasetName || ""; + + metadataExport.allowedRoles = []; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + + if($scope.metadata.updateInterval){ + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + + var name = $scope.datasetName; + + // georesource specific properties + metadataExport.isPOI = $scope.isPOI; + metadataExport.isLOI = $scope.isLOI; + metadataExport.isAOI = $scope.isAOI; + + if($scope.isPOI){ + metadataExport["poiSymbolBootstrap3Name"] = $scope.selectedPoiIconName; + metadataExport["poiSymbolColor"] = $scope.selectedPoiSymbolColor.colorName; + metadataExport["poiMarkerColor"] = $scope.selectedPoiMarkerColor.colorName; + + metadataExport["loiDashArrayString"] = ""; + metadataExport["loiColor"] = ""; + metadataExport["loiWidth"] = ""; + + metadataExport["aoiColor"] = ""; + } + else if($scope.isLOI){ + metadataExport["poiSymbolBootstrap3Name"] = ""; + metadataExport["poiSymbolColor"] = ""; + metadataExport["poiMarkerColor"] = ""; + + metadataExport["loiDashArrayString"] = $scope.selectedLoiDashArrayObject.dashArrayValue; + metadataExport["loiColor"] = $scope.loiColor; + metadataExport["loiWidth"] = $scope.loiWidth; + + metadataExport["aoiColor"] = ""; + } + else if($scope.isAOI){ + metadataExport["poiSymbolBootstrap3Name"] = ""; + metadataExport["poiSymbolColor"] = ""; + metadataExport["poiMarkerColor"] = ""; + + metadataExport["loiDashArrayString"] = ""; + metadataExport["loiColor"] = ""; + metadataExport["loiWidth"] = ""; + + metadataExport["aoiColor"] = $scope.aoiColor; + } + + if($scope.georesourceTopic_subsubsubTopic){ + metadataExport.topicReference = $scope.georesourceTopic_subsubsubTopic.topicId; + } + else if($scope.georesourceTopic_subsubTopic){ + metadataExport.topicReference = $scope.georesourceTopic_subsubTopic.topicId; + } + else if($scope.georesourceTopic_subTopic){ + metadataExport.topicReference = $scope.georesourceTopic_subTopic.topicId; + } + else if($scope.georesourceTopic_mainTopic){ + metadataExport.topicReference = $scope.georesourceTopic_mainTopic.topicId; + } + else { + metadataExport.topicReference = ""; + } + + + var metadataJSON = JSON.stringify(metadataExport); + + var fileName = "Georessource_Metadaten_Export"; + + if (name){ + fileName += "-" + name; + } + + fileName += ".json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + $scope.onChangeMarkerColor = function(markerColor){ + $scope.selectedPoiMarkerColor = markerColor; + }; + + $scope.onChangeSymbolColor = function(symbolColor){ + $scope.selectedPoiSymbolColor = symbolColor; + }; + + $scope.onChangeLoiDashArray = function(loiDashArrayObject){ + $scope.selectedLoiDashArrayObject = loiDashArrayObject; + $("#loiDashArrayEditDropdownButton").html(loiDashArrayObject.svgString); + }; + + $scope.hideSuccessAlert = function(){ + $("#georesourceEditMetadataSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#georesourceEditMetadataErrorAlert").hide(); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.js b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.js index fec182dd4..4d420482e 100644 --- a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.js +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('georesourceEditMetadataModal', ['excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=georesource-edit-metadata-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.js.map b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.js.map new file mode 100644 index 000000000..3773c3808 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"georesource-edit-metadata-modal.module.js","sourceRoot":"","sources":["georesource-edit-metadata-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,8BAA8B,EAAE,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.ts b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.ts new file mode 100644 index 000000000..fec182dd4 --- /dev/null +++ b/app/components/kommonitorAdmin/adminGeoresourcesManagement/georesourceEditMetadataModal/georesource-edit-metadata-modal.module.ts @@ -0,0 +1 @@ +angular.module('georesourceEditMetadataModal', ['excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.js index c2146c792..b887faad4 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.js @@ -1,184 +1,132 @@ +"use strict"; angular.module('adminIndicatorsManagement').component('adminIndicatorsManagement', { - templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', - function IndicatorsManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - - $scope.selectIndicatorEntriesInput = false; - - $scope.dataGrid; - - $scope.sortableConfig = { - onEnd: function (/**Event*/evt) { - var updatedIndicatorMetadataEntries = evt.models; - - // for those models send API request to persist new sort order - - var patchBody = []; - for (let index = 0; index < updatedIndicatorMetadataEntries.length; index++) { - const indicatorMetadata = updatedIndicatorMetadataEntries[index]; - - patchBody.push({ - "indicatorId": indicatorMetadata.indicatorId, - "displayOrder": index - }); - } - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/display-order", - method: "PATCH", - data: patchBody - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - - }, function errorCallback(error) { - // if(error.data){ - // $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - // } - // else{ - // $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - // } - - // $("#georesourceEditMetadataErrorAlert").show(); - - kommonitorDataExchangeService.displayMapApplicationError(error); - }); - - } - }; - - $scope.$on("initialMetadataLoadingCompleted", function (event) { - - - $timeout(function(){ - - $scope.initializeOrRefreshOverviewTable(); - }, 250); - - }); - - $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { - - $scope.loadingData = false; - - }); - - $scope.initializeOrRefreshOverviewTable = function(){ - $scope.loadingData = true; - - kommonitorDataGridHelperService.buildDataGrid_indicators(kommonitorDataExchangeService.availableIndicators); - - $scope.loadingData = false; - }; - - $scope.$on("refreshIndicatorOverviewTable", function (event, crudType, targetIndicatorId) { - $scope.loadingData = true; - $scope.refreshIndicatorOverviewTable(crudType, targetIndicatorId); - }); - - $scope.onChangeSelectIndicatorEntries = function(){ - if ($scope.selectIndicatorEntriesInput){ - $scope.availableIndicatorDatasets.forEach(function(dataset){ - dataset.isSelected = true; - - }); - } - else{ - $scope.availableIndicatorDatasets.forEach(function(dataset){ - dataset.isSelected = false; - }); - } - }; - - $scope.refreshIndicatorOverviewTable = function(crudType, targetIndicatorId){ - - if(! crudType || !targetIndicatorId){ - // refetch all metadata from spatial units to update table - kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { - - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); - - $scope.loadingData = false; - - }, function errorCallback(response) { - - $scope.loadingData = false; - $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); - }); - } - else if(crudType && targetIndicatorId){ - if(crudType == "add"){ - kommonitorCacheHelperService.fetchSingleIndicatorMetadata(targetIndicatorId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - kommonitorDataExchangeService.addSingleIndicatorMetadata(data); - - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); - - $scope.loadingData = false; - - }, function errorCallback(response) { - - $scope.loadingData = false; - $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); - }); - } - else if(crudType == "edit"){ - kommonitorCacheHelperService.fetchSingleIndicatorMetadata(targetIndicatorId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - kommonitorDataExchangeService.replaceSingleIndicatorMetadata(data); - - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); - - $scope.loadingData = false; - - }, function errorCallback(response) { - - $scope.loadingData = false; - $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); - }); - } - else if(crudType == "delete"){ - kommonitorDataExchangeService.deleteSingleIndicatorMetadata(targetIndicatorId); - - $scope.initializeOrRefreshOverviewTable(); - $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); - - $scope.loadingData = false; - } - } - - - - }; - - // $scope.onClickDeleteDatasets = function(){ - // $scope.loadingData = true; - - // var markedEntriesForDeletion = []; - // $scope.availableIndicatorDatasets.forEach(function(dataset){ - // if(dataset.isSelected){ - // markedEntriesForDeletion.push(dataset); - // } - // }); - - // // submit selected spatial units to modal controller - // $rootScope.$broadcast("onDeleteIndicators", markedEntriesForDeletion); - - // $scope.loadingData = false; - // }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function IndicatorsManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.selectIndicatorEntriesInput = false; + $scope.dataGrid; + $scope.sortableConfig = { + onEnd: function (/**Event*/ evt) { + var updatedIndicatorMetadataEntries = evt.models; + // for those models send API request to persist new sort order + var patchBody = []; + for (let index = 0; index < updatedIndicatorMetadataEntries.length; index++) { + const indicatorMetadata = updatedIndicatorMetadataEntries[index]; + patchBody.push({ + "indicatorId": indicatorMetadata.indicatorId, + "displayOrder": index + }); + } + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/display-order", + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + }, function errorCallback(error) { + // if(error.data){ + // $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + // } + // else{ + // $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + // } + // $("#georesourceEditMetadataErrorAlert").show(); + kommonitorDataExchangeService.displayMapApplicationError(error); + }); + } + }; + $scope.$on("initialMetadataLoadingCompleted", function (event) { + $timeout(function () { + $scope.initializeOrRefreshOverviewTable(); + }, 250); + }); + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + $scope.loadingData = false; + }); + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + kommonitorDataGridHelperService.buildDataGrid_indicators(kommonitorDataExchangeService.availableIndicators); + $scope.loadingData = false; + }; + $scope.$on("refreshIndicatorOverviewTable", function (event, crudType, targetIndicatorId) { + $scope.loadingData = true; + $scope.refreshIndicatorOverviewTable(crudType, targetIndicatorId); + }); + $scope.onChangeSelectIndicatorEntries = function () { + if ($scope.selectIndicatorEntriesInput) { + $scope.availableIndicatorDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableIndicatorDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + $scope.refreshIndicatorOverviewTable = function (crudType, targetIndicatorId) { + if (!crudType || !targetIndicatorId) { + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + }); + } + else if (crudType && targetIndicatorId) { + if (crudType == "add") { + kommonitorCacheHelperService.fetchSingleIndicatorMetadata(targetIndicatorId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + kommonitorDataExchangeService.addSingleIndicatorMetadata(data); + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + }); + } + else if (crudType == "edit") { + kommonitorCacheHelperService.fetchSingleIndicatorMetadata(targetIndicatorId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + kommonitorDataExchangeService.replaceSingleIndicatorMetadata(data); + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + }); + } + else if (crudType == "delete") { + kommonitorDataExchangeService.deleteSingleIndicatorMetadata(targetIndicatorId); + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + $scope.loadingData = false; + } + } + }; + // $scope.onClickDeleteDatasets = function(){ + // $scope.loadingData = true; + // var markedEntriesForDeletion = []; + // $scope.availableIndicatorDatasets.forEach(function(dataset){ + // if(dataset.isSelected){ + // markedEntriesForDeletion.push(dataset); + // } + // }); + // // submit selected spatial units to modal controller + // $rootScope.$broadcast("onDeleteIndicators", markedEntriesForDeletion); + // $scope.loadingData = false; + // }; + } + ] +}); +//# sourceMappingURL=admin-indicators-management.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.js.map new file mode 100644 index 000000000..56b59cc64 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-indicators-management.component.js","sourceRoot":"","sources":["admin-indicators-management.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.ts new file mode 100644 index 000000000..c2146c792 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.component.ts @@ -0,0 +1,184 @@ +angular.module('adminIndicatorsManagement').component('adminIndicatorsManagement', { + templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function IndicatorsManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + + $scope.selectIndicatorEntriesInput = false; + + $scope.dataGrid; + + $scope.sortableConfig = { + onEnd: function (/**Event*/evt) { + var updatedIndicatorMetadataEntries = evt.models; + + // for those models send API request to persist new sort order + + var patchBody = []; + for (let index = 0; index < updatedIndicatorMetadataEntries.length; index++) { + const indicatorMetadata = updatedIndicatorMetadataEntries[index]; + + patchBody.push({ + "indicatorId": indicatorMetadata.indicatorId, + "displayOrder": index + }); + } + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/display-order", + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + + }, function errorCallback(error) { + // if(error.data){ + // $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + // } + // else{ + // $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + // } + + // $("#georesourceEditMetadataErrorAlert").show(); + + kommonitorDataExchangeService.displayMapApplicationError(error); + }); + + } + }; + + $scope.$on("initialMetadataLoadingCompleted", function (event) { + + + $timeout(function(){ + + $scope.initializeOrRefreshOverviewTable(); + }, 250); + + }); + + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + + $scope.loadingData = false; + + }); + + $scope.initializeOrRefreshOverviewTable = function(){ + $scope.loadingData = true; + + kommonitorDataGridHelperService.buildDataGrid_indicators(kommonitorDataExchangeService.availableIndicators); + + $scope.loadingData = false; + }; + + $scope.$on("refreshIndicatorOverviewTable", function (event, crudType, targetIndicatorId) { + $scope.loadingData = true; + $scope.refreshIndicatorOverviewTable(crudType, targetIndicatorId); + }); + + $scope.onChangeSelectIndicatorEntries = function(){ + if ($scope.selectIndicatorEntriesInput){ + $scope.availableIndicatorDatasets.forEach(function(dataset){ + dataset.isSelected = true; + + }); + } + else{ + $scope.availableIndicatorDatasets.forEach(function(dataset){ + dataset.isSelected = false; + }); + } + }; + + $scope.refreshIndicatorOverviewTable = function(crudType, targetIndicatorId){ + + if(! crudType || !targetIndicatorId){ + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + + $scope.loadingData = false; + + }, function errorCallback(response) { + + $scope.loadingData = false; + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + }); + } + else if(crudType && targetIndicatorId){ + if(crudType == "add"){ + kommonitorCacheHelperService.fetchSingleIndicatorMetadata(targetIndicatorId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + kommonitorDataExchangeService.addSingleIndicatorMetadata(data); + + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + + $scope.loadingData = false; + + }, function errorCallback(response) { + + $scope.loadingData = false; + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + }); + } + else if(crudType == "edit"){ + kommonitorCacheHelperService.fetchSingleIndicatorMetadata(targetIndicatorId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + kommonitorDataExchangeService.replaceSingleIndicatorMetadata(data); + + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + + $scope.loadingData = false; + + }, function errorCallback(response) { + + $scope.loadingData = false; + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + }); + } + else if(crudType == "delete"){ + kommonitorDataExchangeService.deleteSingleIndicatorMetadata(targetIndicatorId); + + $scope.initializeOrRefreshOverviewTable(); + $rootScope.$broadcast("refreshIndicatorOverviewTableCompleted"); + + $scope.loadingData = false; + } + } + + + + }; + + // $scope.onClickDeleteDatasets = function(){ + // $scope.loadingData = true; + + // var markedEntriesForDeletion = []; + // $scope.availableIndicatorDatasets.forEach(function(dataset){ + // if(dataset.isSelected){ + // markedEntriesForDeletion.push(dataset); + // } + // }); + + // // submit selected spatial units to modal controller + // $rootScope.$broadcast("onDeleteIndicators", markedEntriesForDeletion); + + // $scope.loadingData = false; + // }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.js index 962cd033f..3194702ea 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminIndicatorsManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorDataGridHelper', 'ng-sortable']); +//# sourceMappingURL=admin-indicators-management.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.js.map new file mode 100644 index 000000000..7178cc5f5 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-indicators-management.module.js","sourceRoot":"","sources":["admin-indicators-management.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,CAAC,wBAAwB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,aAAa,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.ts new file mode 100644 index 000000000..962cd033f --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/admin-indicators-management.module.ts @@ -0,0 +1 @@ +angular.module('adminIndicatorsManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorDataGridHelper', 'ng-sortable']); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.js index 75b08e2fe..a643aa2f5 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.js @@ -1,1042 +1,855 @@ +"use strict"; angular.module('indicatorAddModal').component('indicatorAddModal', { - templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '$timeout', - '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', - function IndicatorAddModalAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, $scope, $rootScope, $http, $timeout, - __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - - /* POST BODY - { - "refrencesToOtherIndicators": [ - { - "referenceDescription": "referenceDescription", - "indicatorId": "indicatorId" - }, - { - "referenceDescription": "referenceDescription", - "indicatorId": "indicatorId" - } - ], - "metadata": { - "note": "note", - "literature": "literature", - "updateInterval": "ARBITRARY", - "sridEPSG": 0.8008281904610115, - "datasource": "datasource", - "contact": "contact", - "lastUpdate": "2000-01-23", - "description": "description", - "databasis": "databasis" - }, - "allowedRoles": [ - "allowedRoles", - "allowedRoles" - ], - "datasetName": "datasetName", - "abbreviation": "abbreviation", - "characteristicValue": "characteristicValue", - "tags": [ - "tags", - "tags" - ], - "creationType": "INSERTION", - "unit": "unit", - "topicReference": "topicReference", - "referencDateNote": "note", - "displayOrder": 0, - "refrencesToGeoresources": [ - { - "referenceDescription": "referenceDescription", - "georesourceId": "georesourceId" - }, - { - "referenceDescription": "referenceDescription", - "georesourceId": "georesourceId" - } - ], - "indicatorType": "STATUS_ABSOLUTE", - "interpretation": "interpretation", - "isHeadlineIndicator": false, - "processDescription": "processDescription", - "lowestSpatialUnitForComputation": "lowestSpatialUnitForComputation", - "defaultClassificationMapping": { - "colorBrewerSchemeName": "colorBrewerSchemeName", - "items": [ - { - "defaultCustomRating": "defaultCustomRating", - "defaultColorAsHex": "defaultColorAsHex" - }, - { - "defaultCustomRating": "defaultCustomRating", - "defaultColorAsHex": "defaultColorAsHex" - } - ] - } - } - */ - - //Date picker - $('#indicatorAddLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $scope.indicatorMetadataStructure = { - "metadata": { - "note": "an optional note", - "literature": "optional text about literature", - "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", - "sridEPSG": 4326, - "datasource": "text about data source", - "contact": "text about contact details", - "lastUpdate": "YYYY-MM-DD", - "description": "description about spatial unit dataset", - "databasis": "text about data basis", - }, - "allowedRoles": ['roleId'], - "refrencesToOtherIndicators": [ - { - "referenceDescription": "description about the reference", - "indicatorId": "ID of referenced indicator dataset" - } - ], - "refrencesToGeoresources": [ - { - "referenceDescription": "description about the reference", - "georesourceId": "ID of referenced georesource dataset" - } - ], - "datasetName": "Name of indicator dataset", - "abbreviation": "optional abbreviation of the indicator dataset", - "characteristicValue": "if the same datasetName is used for different indicators, the optional characteristicValue parameter may serve to distinguish between them (i.e. Habitants - male, Habitants - female, Habitants - diverse)", - "tags": [ - "optinal list of tags; each tag is a free text tag" - ], - "creationType": "INSERTION|COMPUTATION <-- enum parameter controls whether each timestamp must be updated manually (INSERTION) or if KomMonitor shall compute the indicator values for respective timestamps based on script file (COMPUTATION)", - "unit": "unit of the indicator", - "topicReference": "ID of the respective main/sub topic instance", - "indicatorType": "STATUS_ABSOLUTE|STATUS_RELATIVE|DYNAMIC_ABSOLUTE|DYNAMIC_RELATIVE|STATUS_STANDARDIZED|DYNAMIC_STANDARDIZED", - "interpretation": "interpretation hints for the user to better understand the indicator values", - "isHeadlineIndicator": "boolean parameter to indicate if indicator is a headline indicator", - "processDescription": "detailed description about the computation/creation of the indicator", - "referenceDateNote": "optional note for indicator reference date", - "displayOrder": 0, - "lowestSpatialUnitForComputation": "the name of the lowest possible spatial unit for which an indicator of creationType=COMPUTATION may be computed. All other superior spatial units will be aggregated automatically", - "defaultClassificationMapping": { - "colorBrewerSchemeName": "schema name of colorBrewer colorPalette to use for classification", - "items": [ - { - "defaultCustomRating": "a string to rate indicator values of this class", - "defaultColorAsHex": "color as hexadecimal value" - } - ] - } - }; - - $scope.indicatorMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.indicatorMetadataStructure); - $scope.indicatorMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure_indicator); - - - $scope.metadataImportSettings; - $scope.indicatorMetadataImportError; - $scope.indicatorAddMetadataImportErrorAlert; - - $scope.datasetName = undefined; - $scope.datasetNameInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = undefined; - $scope.metadata.literature = undefined; - $scope.metadata.updateInterval = undefined; - $scope.metadata.sridEPSG = undefined; - $scope.metadata.datasource = undefined; - $scope.metadata.databasis = undefined; - $scope.metadata.contact = undefined; - $scope.metadata.lastUpdate = undefined; - $scope.metadata.description = undefined; - - $scope.roleManagementTableOptions = undefined; - - $scope.$on("availableRolesUpdate", function (event) { - refreshRoles(); - }); - - // make sure that initial fetching of availableRoles has happened - $scope.$on("initialMetadataLoadingCompleted", function (event) { - refreshRoles(); - }); - - function refreshRoles() { - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); - } - - $scope.datasetName = undefined; - $scope.indicatorAbbreviation = undefined; - $scope.indicatorType = undefined; - $scope.indicatorCharacteristicValue = undefined; - $scope.isHeadlineIndicator = false; - $scope.indicatorUnit = undefined; - $scope.enableFreeTextUnit = false; - $scope.indicatorProcessDescription = undefined; - $scope.indicatorTagsString_withCommas = undefined; - $scope.indicatorInterpretation = undefined; - $scope.indicatorCreationType = undefined; - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; - $scope.enableLowestSpatialUnitSelect = false; - - $scope.indicatorReferenceDateNote = undefined; - $scope.displayOrder = 0; - - $scope.indicatorTopic_mainTopic = undefined; - $scope.indicatorTopic_subTopic = undefined; - $scope.indicatorTopic_subsubTopic = undefined; - $scope.indicatorTopic_subsubsubTopic = undefined; - - $scope.indicatorNameFilter = undefined; - $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; - $scope.tmpIndicatorReference_referenceDescription = undefined; - // tmp array to display indicatorReferences - $scope.indicatorReferences_adminView = []; - // array for API request (has less information per item) - $scope.indicatorReferences_apiRequest = []; - - $scope.georesourceNameFilter = undefined; - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; - $scope.tmpGeoresourceReference_referenceDescription = undefined; - // tmp array to display georesourceReferences - $scope.georesourceReferences_adminView = []; - // array for API request (has less information per item) - $scope.georesourceReferences_apiRequest = []; - - $scope.numClassesArray = [3,4,5,6,7,8]; - $scope.numClasses = $scope.numClassesArray[2]; - $scope.selectedColorBrewerPaletteEntry = undefined; - - $scope.postBody_indicators = undefined; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $scope.loadingData = false; - - $scope.colorbrewerSchemes = colorbrewer; - $scope.colorbreweSchemeName_dynamicIncrease = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; - $scope.colorbreweSchemeName_dynamicDecrease = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; - $scope.colorbrewerPalettes = []; - - - $scope.instantiateColorBrewerPalettes = function(){ - for (const key in colorbrewer) { - if (colorbrewer.hasOwnProperty(key)) { - const colorPalettes = colorbrewer[key]; - - var paletteEntry = { - "paletteName": key, - "paletteArrayObject": colorPalettes - }; - - $scope.colorbrewerPalettes.push(paletteEntry); - } - } - - // instantiate with palette 'Blues' - $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; - - }; - - $scope.instantiateColorBrewerPalettes(); - - $scope.resetIndicatorAddForm = function(){ - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $scope.datasetName = undefined; - $scope.datasetNameInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = undefined; - $scope.metadata.literature = undefined; - $scope.metadata.updateInterval = undefined; - $scope.metadata.sridEPSG = undefined; - $scope.metadata.datasource = undefined; - $scope.metadata.databasis = undefined; - $scope.metadata.contact = undefined; - $scope.metadata.lastUpdate = undefined; - $scope.metadata.description = undefined; - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); - - $scope.datasetName = undefined; - $scope.indicatorAbbreviation = undefined; - $scope.indicatorType = kommonitorDataExchangeService.indicatorTypeOptions[0]; - $scope.indicatorCharacteristicValue = undefined; - $scope.isHeadlineIndicator = false; - $scope.indicatorUnit = undefined; - $scope.enableFreeTextUnit = false; - $scope.indicatorProcessDescription = undefined; - $scope.indicatorTagsString_withCommas = undefined; - $scope.indicatorInterpretation = undefined; - $scope.indicatorCreationType = kommonitorDataExchangeService.indicatorCreationTypeOptions[0]; - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; - $scope.enableLowestSpatialUnitSelect = false; - - $scope.indicatorReferenceDateNote = undefined; - $scope.displayOrder = 0; - - $scope.indicatorTopic_mainTopic = undefined; - $scope.indicatorTopic_subTopic = undefined; - $scope.indicatorTopic_subsubTopic = undefined; - $scope.indicatorTopic_subsubsubTopic = undefined; - - $scope.indicatorNameFilter = undefined; - $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; - $scope.tmpIndicatorReference_referenceDescription = undefined; - // tmp array to display indicatorReferences - $scope.indicatorReferences_adminView = []; - // array for API request (has less information per item) - $scope.indicatorReferences_apiRequest = []; - - $scope.georesourceNameFilter = undefined; - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; - $scope.tmpGeoresourceReference_referenceDescription = undefined; - // tmp array to display georesourceReferences - $scope.georesourceReferences_adminView = []; - // array for API request (has less information per item) - $scope.georesourceReferences_apiRequest = []; - - $scope.numClassesArray = [3,4,5,6,7,8]; - $scope.numClasses = $scope.numClassesArray[2]; - $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; - - $scope.postBody_indicators = undefined; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickColorBrewerEntry = function(colorPaletteEntry){ - $scope.selectedColorBrewerPaletteEntry = colorPaletteEntry; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onAddOrUpdateIndicatorReference = function(){ - var tmpIndicatorReference_adminView = { - "referencedIndicatorName": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorName, - "referencedIndicatorId": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorId, - "referencedIndicatorAbbreviation": $scope.tmpIndicatorReference_selectedIndicatorMetadata.abbreviation, - "referencedIndicatorDescription": $scope.tmpIndicatorReference_referenceDescription - }; - - var processed = false; - - for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { - var indicatorReference_adminView = $scope.indicatorReferences_adminView[index]; - - if (indicatorReference_adminView.referencedIndicatorId === tmpIndicatorReference_adminView.referencedIndicatorId){ - // replace object - $scope.indicatorReferences_adminView[index] = tmpIndicatorReference_adminView; - processed = true; - break; - } - } - - if(! processed){ - // new entry - $scope.indicatorReferences_adminView.push(tmpIndicatorReference_adminView); - } - - $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; - $scope.tmpIndicatorReference_referenceDescription = undefined; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickEditIndicatorReference = function(indicatorReference_adminView){ - - $scope.tmpIndicatorReference_selectedIndicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference_adminView.referencedIndicatorId); - $scope.tmpIndicatorReference_referenceDescription = indicatorReference_adminView.referencedIndicatorDescription; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickDeleteIndicatorReference = function(indicatorReference_adminView){ - - for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { - - if ($scope.indicatorReferences_adminView[index].referencedIndicatorId === indicatorReference_adminView.referencedIndicatorId){ - // remove object - $scope.indicatorReferences_adminView.splice(index, 1); - break; - } - } - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onAddOrUpdateGeoresourceReference = function(){ - var tmpGeoresourceReference_adminView = { - "referencedGeoresourceName": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.datasetName, - "referencedGeoresourceId": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.georesourceId, - "referencedGeoresourceDescription": $scope.tmpGeoresourceReference_referenceDescription - }; - - var processed = false; - - for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { - var georesourceReference_adminView = $scope.georesourceReferences_adminView[index]; - - if (georesourceReference_adminView.referencedGeoresourceId === tmpGeoresourceReference_adminView.referencedGeoresourceId){ - // replace object - $scope.georesourceReferences_adminView[index] = tmpGeoresourceReference_adminView; - processed = true; - break; - } - } - - if(! processed){ - // new entry - $scope.georesourceReferences_adminView.push(tmpGeoresourceReference_adminView); - } - - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; - $scope.tmpGeoresourceReference_referenceDescription = undefined; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickEditGeoresourceReference = function(georesourceReference_adminView){ - - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference_adminView.referencedGeoresourceId); - $scope.tmpGeoresourceReference_referenceDescription = georesourceReference_adminView.referencedGeoresourceDescription; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickDeleteGeoresourceReference = function(georesourceReference_adminView){ - - for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { - - if ($scope.georesourceReferences_adminView[index].referencedGeoresourceId === georesourceReference_adminView.referencedGeoresourceId){ - // remove object - $scope.georesourceReferences_adminView.splice(index, 1); - break; - } - } - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onChangeCreationType = function(){ - if($scope.indicatorCreationType.apiName === "COMPUTATION"){ - $scope.enableLowestSpatialUnitSelect = true; - } - else{ - $scope.enableLowestSpatialUnitSelect = false; - } - - }; - - $scope.onChangeIndicatorUnit = function(){ - if ($scope.indicatorUnit.includes("Freitext")){ - $scope.enableFreeTextUnit = true; - } - else{ - $scope.enableFreeTextUnit = false; - } - }; - - $scope.checkDatasetName = function(){ - $scope.datasetNameInvalid = false; - kommonitorDataExchangeService.availableIndicators.forEach(function(indicator){ - if (indicator.indicatorName === $scope.datasetName){ - $scope.datasetNameInvalid = true; - return; - } - }); - }; - - $scope.buildPostBody_indicators = function(){ - var postBody = - { - "metadata": { - "note": $scope.metadata.note || null, - "literature": $scope.metadata.literature || null, - "updateInterval": $scope.metadata.updateInterval.apiName, - "sridEPSG": $scope.metadata.sridEPSG || 4326, - "datasource": $scope.metadata.datasource, - "contact": $scope.metadata.contact, - "lastUpdate": $scope.metadata.lastUpdate, - "description": $scope.metadata.description || null, - "databasis": $scope.metadata.databasis || null - }, - "refrencesToOtherIndicators": [], // filled directly after - "allowedRoles": [], - "datasetName": $scope.datasetName, - "abbreviation": $scope.indicatorAbbreviation || null, - "characteristicValue": $scope.indicatorCharacteristicValue || null, - "tags": [], // filled directly after - "creationType": $scope.indicatorCreationType.apiName, - "unit": $scope.indicatorUnit, - "topicReference": "", // filled directly after - "refrencesToGeoresources": [], // filled directly after - "indicatorType": $scope.indicatorType.apiName, - "interpretation": $scope.indicatorInterpretation || "", - "isHeadlineIndicator": $scope.isHeadlineIndicator || false, - "processDescription": $scope.indicatorProcessDescription || "", - "referenceDateNote": $scope.indicatorReferenceDateNote || "", - "displayOrder": $scope.displayOrder, - "lowestSpatialUnitForComputation": $scope.indicatorLowestSpatialUnitMetadataObjectForComputation? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : null, - "defaultClassificationMapping": { - "colorBrewerSchemeName": $scope.selectedColorBrewerPaletteEntry.paletteName, - "items": [ - { - "defaultColorAsHex": "#edf8e9", - "defaultCustomRating": "sehr niedrig" - }, - { - "defaultColorAsHex": "#bae4b3", - "defaultCustomRating": "niedrig" - }, - { - "defaultColorAsHex": "#74c476", - "defaultCustomRating": "mittel" - }, - { - "defaultColorAsHex": "#31a354", - "defaultCustomRating": "hoch" - }, - { - "defaultColorAsHex": "#006d2c", - "defaultCustomRating": "sehr hoch" - } - ] - } - }; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - postBody.allowedRoles.push(roleId); - } - - // TAGS - if($scope.indicatorTagsString_withCommas){ - var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); - for (const tagString of tags_splitted) { - postBody.tags.push(tagString.trim()); - } - } - - // TOPIC REFERENCE - if($scope.indicatorTopic_subsubsubTopic){ - postBody.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; - } - else if($scope.indicatorTopic_subsubTopic){ - postBody.topicReference = $scope.indicatorTopic_subsubTopic.topicId; - } - else if($scope.indicatorTopic_subTopic){ - postBody.topicReference = $scope.indicatorTopic_subTopic.topicId; - } - else if($scope.indicatorTopic_mainTopic){ - postBody.topicReference = $scope.indicatorTopic_mainTopic.topicId; - } - else { - postBody.topicReference = ""; - } - - - // REFERENCES - if($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0){ - postBody.refrencesToOtherIndicators = []; - - for (const indicRef of $scope.indicatorReferences_adminView) { - postBody.refrencesToOtherIndicators.push({ - "indicatorId": indicRef.referencedIndicatorId, - "referenceDescription": indicRef.referencedIndicatorDescription - }); - } - } - - if($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0){ - postBody.refrencesToGeoresources = []; - - for (const geoRef of $scope.georesourceReferences_adminView) { - postBody.refrencesToGeoresources.push({ - "georesourceId": geoRef.referencedGeoresourceId, - "referenceDescription": geoRef.referencedGeoresourceDescription - }); - } - } - - - return postBody; - }; - - $scope.addIndicator = async function(){ - - $timeout(function(){ - $scope.loadingData = true; - }); - - var postBody = $scope.buildPostBody_indicators(); - - return await $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators", - method: "POST", - data: postBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $rootScope.$broadcast("refreshIndicatorOverviewTable", "add", response.data.indicatorId); - - // refresh all admin dashboard diagrams due to modified metadata - $timeout(function(){ - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - }, 500); - - $scope.successMessagePart = $scope.datasetName; - $scope.importedFeatures = []; - - $("#indicatorAddSuccessAlert").show(); - - $scope.loadingData = false; - - }, function errorCallback(error) { - console.error("Error while adding computable indicatorMetadata service."); - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#indicatorAddErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }); - - }; - - $scope.onImportIndicatorAddMetadata = function(){ - - $scope.indicatorMetadataImportError = ""; - - $("#indicatorMetadataImportFile").files = []; - - // trigger file chooser - $("#indicatorMetadataImportFile").click(); - - }; - - $(document).on("change", "#indicatorMetadataImportFile" ,function(){ - - console.log("Importing Indicator metadata for Add Indicator Form"); - - // get the file - var file = document.getElementById('indicatorMetadataImportFile').files[0]; - $scope.parseMetadataFromFile(file); - }); - - $scope.parseMetadataFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMetadataFile(event); - } - catch(error){ - console.error(error); - console.error("Uploaded Metadata File cannot be parsed."); - $scope.indicatorMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; - document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; - $("#indicatorAddMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMetadataFile = function(event){ - // $scope.geoJsonString = event.target.result; - $scope.metadataImportSettings = JSON.parse(event.target.result); - - if(! $scope.metadataImportSettings.metadata){ - console.error("uploaded Metadata File cannot be parsed - wrong structure."); - $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; - $("#indicatorAddMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.metadata = {}; - $scope.metadata.note = $scope.metadataImportSettings.metadata.note; - $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; - kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ - if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ - $scope.metadata.updateInterval = option; - } - }); - $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; - $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; - $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; - $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; - // initialize date - $('#indicatorAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); - - $scope.metadata.description = $scope.metadataImportSettings.metadata.description; - $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; - - $scope.indicatorReferenceDateNote = $scope.metadataImportSettings.referenceDateNote; - $scope.displayOrder = $scope.metadataImportSettings.displayOrder || 0; - - $scope.datasetName = $scope.metadataImportSettings.datasetName; - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); - - - // indicator specific properties - - - $scope.indicatorAbbreviation = $scope.metadataImportSettings.abbreviation; - - for (const indicatorTypeOption of kommonitorDataExchangeService.indicatorTypeOptions) { - if(indicatorTypeOption.apiName === $scope.metadataImportSettings.indicatorType){ - $scope.indicatorType = indicatorTypeOption; - break; - } - } - - for (const indicatorCreationTypeOption of kommonitorDataExchangeService.indicatorCreationTypeOptions) { - if(indicatorCreationTypeOption.apiName === $scope.metadataImportSettings.creationType){ - $scope.indicatorCreationType = indicatorCreationTypeOption; - - if(indicatorCreationTypeOption.apiName === "COMPUTATION"){ - $scope.enableLowestSpatialUnitSelect = true; - } - else{ - $scope.enableLowestSpatialUnitSelect = false; - } - break; - } - } - - $scope.indicatorCharacteristicValue = $scope.metadataImportSettings.characteristicValue; - $scope.isHeadlineIndicator = $scope.metadataImportSettings.isHeadlineIndicator; - $scope.indicatorUnit = $scope.metadataImportSettings.unit; - if(kommonitorDataExchangeService.indicatorUnitOptions.includes($scope.metadataImportSettings.unit)){ - $scope.enableFreeTextUnit = false; - } - else{ - $scope.enableFreeTextUnit = true; - } - - $scope.indicatorProcessDescription = $scope.metadataImportSettings.processDescription; - - $scope.indicatorTagsString_withCommas = undefined; - if($scope.metadataImportSettings.tags && $scope.metadataImportSettings.tags.length > 0){ - $scope.indicatorTagsString_withCommas = ""; - for (let index = 0; index < $scope.metadataImportSettings.tags.length; index++) { - $scope.indicatorTagsString_withCommas += $scope.metadataImportSettings.tags[index]; - - if(index < $scope.metadataImportSettings.tags.length - 1){ - $scope.indicatorTagsString_withCommas += ","; - } - } - } - - $scope.indicatorInterpretation = $scope.metadataImportSettings.interpretation; - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; - - for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { - const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; - - if(spatialUnitMetadata.spatialUnitLevel === $scope.metadataImportSettings.lowestSpatialUnitForComputation){ - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; - break; - } - } - - var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); - - if(topicHierarchy && topicHierarchy[0]){ - $scope.indicatorTopic_mainTopic = topicHierarchy[0]; - } - if(topicHierarchy && topicHierarchy[1]){ - $scope.indicatorTopic_subTopic = topicHierarchy[1]; - } - if(topicHierarchy && topicHierarchy[2]){ - $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; - } - if(topicHierarchy && topicHierarchy[3]){ - $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; - } - - $scope.indicatorNameFilter = undefined; - $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; - $scope.tmpIndicatorReference_referenceDescription = undefined; - - // tmp array to display indicatorReferences - $scope.indicatorReferences_adminView = []; - // array for API request (has less information per item) - $scope.indicatorReferences_apiRequest = []; - if($scope.metadataImportSettings.refrencesToOtherIndicators && $scope.metadataImportSettings.refrencesToOtherIndicators.length > 0){ - for (const indicatorReference of $scope.metadataImportSettings.refrencesToOtherIndicators) { - var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.indicatorId); - var referenceEntry = { - "referencedIndicatorName": indicatorMetadata.indicatorName, - "referencedIndicatorId": indicatorMetadata.indicatorId, - "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, - "referencedIndicatorDescription": indicatorReference.referenceDescription - }; - $scope.indicatorReferences_adminView.push(referenceEntry); - } - - } - - $scope.georesourceNameFilter = undefined; - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; - $scope.tmpGeoresourceReference_referenceDescription = undefined; - // tmp array to display georesourceReferences - $scope.georesourceReferences_adminView = []; - // array for API request (has less information per item) - $scope.georesourceReferences_apiRequest = []; - - if($scope.metadataImportSettings.refrencesToGeoresources && $scope.metadataImportSettings.refrencesToGeoresources.length > 0){ - for (const georesourceReference of $scope.metadataImportSettings.refrencesToGeoresources) { - var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.georesourceId); - var geo_referenceEntry = { - "referencedGeoresourceName": georesourceMetadata.datasetName, - "referencedGeoresourceId": georesourceMetadata.georesourceId, - "referencedGeoresourceDescription": georesourceReference.referenceDescription - }; - $scope.georesourceReferences_adminView.push(geo_referenceEntry); - } - - } - - $scope.numClassesArray = [3,4,5,6,7,8]; - $scope.numClasses = $scope.numClassesArray[2]; - // instantiate with palette 'Blues' - $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; - - for (const colorbrewerPalette of $scope.colorbrewerPalettes) { - if (colorbrewerPalette.paletteName === $scope.metadataImportSettings.defaultClassificationMapping.colorBrewerSchemeName){ - $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; - break; - } - } - - $scope.$digest(); - }; - - $scope.onExportIndicatorAddMetadataTemplate = function(){ - - var metadataJSON = JSON.stringify($scope.indicatorMetadataStructure); - - var fileName = "Indikator_Metadaten_Vorlage_Export.json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - $scope.onExportIndicatorAddMetadata = function(){ - var metadataExport = $scope.indicatorMetadataStructure; - - metadataExport.metadata.note = $scope.metadata.note || ""; - metadataExport.metadata.literature = $scope.metadata.literature || ""; - metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; - metadataExport.metadata.datasource = $scope.metadata.datasource || ""; - metadataExport.metadata.contact = $scope.metadata.contact || ""; - metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; - metadataExport.metadata.description = $scope.metadata.description || ""; - metadataExport.metadata.databasis = $scope.metadata.databasis || ""; - metadataExport.datasetName = $scope.datasetName || ""; - - metadataExport.referenceDateNote = $scope.indicatorReferenceDateNote || ""; - metadataExport.displayOrder = $scope.displayOrder || 0; - - metadataExport.allowedRoles = []; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - metadataExport.allowedRoles.push(roleId); - } - - if($scope.metadata.updateInterval){ - metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; - } - - var name = $scope.datasetName; - - // indicator specific properties - - metadataExport.abbreviation = $scope.indicatorAbbreviation || ""; - metadataExport.indicatorType = $scope.indicatorType ? $scope.indicatorType.apiName : ""; - metadataExport.creationType = $scope.indicatorCreationType ? $scope.indicatorCreationType.apiName : ""; - - metadataExport.characteristicValue = $scope.indicatorCharacteristicValue || ""; - metadataExport.isHeadlineIndicator = $scope.isHeadlineIndicator || false; - metadataExport.unit = $scope.indicatorUnit || ""; - metadataExport.processDescription = $scope.indicatorProcessDescription || ""; - metadataExport.tags = []; - - if($scope.indicatorTagsString_withCommas){ - var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); - for (const tagString of tags_splitted) { - metadataExport.tags.push(tagString.trim()); - } - } - - metadataExport.interpretation = $scope.indicatorInterpretation || ""; - metadataExport.lowestSpatialUnitForComputation = $scope.indicatorLowestSpatialUnitMetadataObjectForComputation? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : ""; - - if($scope.indicatorTopic_subsubsubTopic){ - metadataExport.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; - } - else if($scope.indicatorTopic_subsubTopic){ - metadataExport.topicReference = $scope.indicatorTopic_subsubTopic.topicId; - } - else if($scope.indicatorTopic_subTopic){ - metadataExport.topicReference = $scope.indicatorTopic_subTopic.topicId; - } - else if($scope.indicatorTopic_mainTopic){ - metadataExport.topicReference = $scope.indicatorTopic_mainTopic.topicId; - } - else { - metadataExport.topicReference = ""; - } - - metadataExport.refrencesToOtherIndicators = []; - - if($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0){ - metadataExport.refrencesToOtherIndicators = []; - - for (const indicRef of $scope.indicatorReferences_adminView) { - metadataExport.refrencesToOtherIndicators.push({ - "indicatorId": indicRef.referencedIndicatorId, - "referenceDescription": indicRef.referencedIndicatorDescription - }); - } - } - - metadataExport.refrencesToGeoresources = []; - - if($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0){ - metadataExport.refrencesToGeoresources = []; - - for (const geoRef of $scope.georesourceReferences_adminView) { - metadataExport.refrencesToGeoresources.push({ - "georesourceId": geoRef.referencedGeoresourceId, - "referenceDescription": geoRef.referencedGeoresourceDescription - }); - } - } - - var defaultClassificationMapping = { - "colorBrewerSchemeName" : $scope.selectedColorBrewerPaletteEntry ? $scope.selectedColorBrewerPaletteEntry.paletteName : "Blues", - "items": [ - { - "defaultColorAsHex": "#edf8e9", - "defaultCustomRating": "sehr niedrig" - }, - { - "defaultColorAsHex": "#bae4b3", - "defaultCustomRating": "niedrig" - }, - { - "defaultColorAsHex": "#74c476", - "defaultCustomRating": "mittel" - }, - { - "defaultColorAsHex": "#31a354", - "defaultCustomRating": "hoch" - }, - { - "defaultColorAsHex": "#006d2c", - "defaultCustomRating": "sehr hoch" - } - ] - }; - - metadataExport.defaultClassificationMapping = defaultClassificationMapping; - - - var metadataJSON = JSON.stringify(metadataExport); - - var fileName = "Indikatoren_Metadaten_Export"; - - if (name){ - fileName += "-" + name; - } - - fileName += ".json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - $scope.hideSuccessAlert = function(){ - $("#indicatorAddSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#indicatorAddErrorAlert").hide(); - }; - - $scope.hideMetadataErrorAlert = function(){ - $("#indicatorAddMetadataImportErrorAlert").hide(); - }; - - kommonitorMultiStepFormHelperService.registerClickHandler(); - - } -]}); + templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '$timeout', + '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', + function IndicatorAddModalAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, $scope, $rootScope, $http, $timeout, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + /* POST BODY + { + "refrencesToOtherIndicators": [ + { + "referenceDescription": "referenceDescription", + "indicatorId": "indicatorId" + }, + { + "referenceDescription": "referenceDescription", + "indicatorId": "indicatorId" + } + ], + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "allowedRoles": [ + "allowedRoles", + "allowedRoles" + ], + "datasetName": "datasetName", + "abbreviation": "abbreviation", + "characteristicValue": "characteristicValue", + "tags": [ + "tags", + "tags" + ], + "creationType": "INSERTION", + "unit": "unit", + "topicReference": "topicReference", + "referencDateNote": "note", + "displayOrder": 0, + "refrencesToGeoresources": [ + { + "referenceDescription": "referenceDescription", + "georesourceId": "georesourceId" + }, + { + "referenceDescription": "referenceDescription", + "georesourceId": "georesourceId" + } + ], + "indicatorType": "STATUS_ABSOLUTE", + "interpretation": "interpretation", + "isHeadlineIndicator": false, + "processDescription": "processDescription", + "lowestSpatialUnitForComputation": "lowestSpatialUnitForComputation", + "defaultClassificationMapping": { + "colorBrewerSchemeName": "colorBrewerSchemeName", + "items": [ + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + }, + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + } + ] + } + } + */ + //Date picker + $('#indicatorAddLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + $scope.indicatorMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "refrencesToOtherIndicators": [ + { + "referenceDescription": "description about the reference", + "indicatorId": "ID of referenced indicator dataset" + } + ], + "refrencesToGeoresources": [ + { + "referenceDescription": "description about the reference", + "georesourceId": "ID of referenced georesource dataset" + } + ], + "datasetName": "Name of indicator dataset", + "abbreviation": "optional abbreviation of the indicator dataset", + "characteristicValue": "if the same datasetName is used for different indicators, the optional characteristicValue parameter may serve to distinguish between them (i.e. Habitants - male, Habitants - female, Habitants - diverse)", + "tags": [ + "optinal list of tags; each tag is a free text tag" + ], + "creationType": "INSERTION|COMPUTATION <-- enum parameter controls whether each timestamp must be updated manually (INSERTION) or if KomMonitor shall compute the indicator values for respective timestamps based on script file (COMPUTATION)", + "unit": "unit of the indicator", + "topicReference": "ID of the respective main/sub topic instance", + "indicatorType": "STATUS_ABSOLUTE|STATUS_RELATIVE|DYNAMIC_ABSOLUTE|DYNAMIC_RELATIVE|STATUS_STANDARDIZED|DYNAMIC_STANDARDIZED", + "interpretation": "interpretation hints for the user to better understand the indicator values", + "isHeadlineIndicator": "boolean parameter to indicate if indicator is a headline indicator", + "processDescription": "detailed description about the computation/creation of the indicator", + "referenceDateNote": "optional note for indicator reference date", + "displayOrder": 0, + "lowestSpatialUnitForComputation": "the name of the lowest possible spatial unit for which an indicator of creationType=COMPUTATION may be computed. All other superior spatial units will be aggregated automatically", + "defaultClassificationMapping": { + "colorBrewerSchemeName": "schema name of colorBrewer colorPalette to use for classification", + "items": [ + { + "defaultCustomRating": "a string to rate indicator values of this class", + "defaultColorAsHex": "color as hexadecimal value" + } + ] + } + }; + $scope.indicatorMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.indicatorMetadataStructure); + $scope.indicatorMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure_indicator); + $scope.metadataImportSettings; + $scope.indicatorMetadataImportError; + $scope.indicatorAddMetadataImportErrorAlert; + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + $scope.roleManagementTableOptions = undefined; + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + // make sure that initial fetching of availableRoles has happened + $scope.$on("initialMetadataLoadingCompleted", function (event) { + refreshRoles(); + }); + function refreshRoles() { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + $scope.datasetName = undefined; + $scope.indicatorAbbreviation = undefined; + $scope.indicatorType = undefined; + $scope.indicatorCharacteristicValue = undefined; + $scope.isHeadlineIndicator = false; + $scope.indicatorUnit = undefined; + $scope.enableFreeTextUnit = false; + $scope.indicatorProcessDescription = undefined; + $scope.indicatorTagsString_withCommas = undefined; + $scope.indicatorInterpretation = undefined; + $scope.indicatorCreationType = undefined; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; + $scope.enableLowestSpatialUnitSelect = false; + $scope.indicatorReferenceDateNote = undefined; + $scope.displayOrder = 0; + $scope.indicatorTopic_mainTopic = undefined; + $scope.indicatorTopic_subTopic = undefined; + $scope.indicatorTopic_subsubTopic = undefined; + $scope.indicatorTopic_subsubsubTopic = undefined; + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + $scope.numClassesArray = [3, 4, 5, 6, 7, 8]; + $scope.numClasses = $scope.numClassesArray[2]; + $scope.selectedColorBrewerPaletteEntry = undefined; + $scope.postBody_indicators = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.loadingData = false; + $scope.colorbrewerSchemes = colorbrewer; + $scope.colorbreweSchemeName_dynamicIncrease = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; + $scope.colorbreweSchemeName_dynamicDecrease = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; + $scope.colorbrewerPalettes = []; + $scope.instantiateColorBrewerPalettes = function () { + for (const key in colorbrewer) { + if (colorbrewer.hasOwnProperty(key)) { + const colorPalettes = colorbrewer[key]; + var paletteEntry = { + "paletteName": key, + "paletteArrayObject": colorPalettes + }; + $scope.colorbrewerPalettes.push(paletteEntry); + } + } + // instantiate with palette 'Blues' + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + }; + $scope.instantiateColorBrewerPalettes(); + $scope.resetIndicatorAddForm = function () { + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + $scope.datasetName = undefined; + $scope.indicatorAbbreviation = undefined; + $scope.indicatorType = kommonitorDataExchangeService.indicatorTypeOptions[0]; + $scope.indicatorCharacteristicValue = undefined; + $scope.isHeadlineIndicator = false; + $scope.indicatorUnit = undefined; + $scope.enableFreeTextUnit = false; + $scope.indicatorProcessDescription = undefined; + $scope.indicatorTagsString_withCommas = undefined; + $scope.indicatorInterpretation = undefined; + $scope.indicatorCreationType = kommonitorDataExchangeService.indicatorCreationTypeOptions[0]; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; + $scope.enableLowestSpatialUnitSelect = false; + $scope.indicatorReferenceDateNote = undefined; + $scope.displayOrder = 0; + $scope.indicatorTopic_mainTopic = undefined; + $scope.indicatorTopic_subTopic = undefined; + $scope.indicatorTopic_subsubTopic = undefined; + $scope.indicatorTopic_subsubsubTopic = undefined; + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + $scope.numClassesArray = [3, 4, 5, 6, 7, 8]; + $scope.numClasses = $scope.numClassesArray[2]; + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + $scope.postBody_indicators = undefined; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickColorBrewerEntry = function (colorPaletteEntry) { + $scope.selectedColorBrewerPaletteEntry = colorPaletteEntry; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onAddOrUpdateIndicatorReference = function () { + var tmpIndicatorReference_adminView = { + "referencedIndicatorName": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorName, + "referencedIndicatorId": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": $scope.tmpIndicatorReference_selectedIndicatorMetadata.abbreviation, + "referencedIndicatorDescription": $scope.tmpIndicatorReference_referenceDescription + }; + var processed = false; + for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { + var indicatorReference_adminView = $scope.indicatorReferences_adminView[index]; + if (indicatorReference_adminView.referencedIndicatorId === tmpIndicatorReference_adminView.referencedIndicatorId) { + // replace object + $scope.indicatorReferences_adminView[index] = tmpIndicatorReference_adminView; + processed = true; + break; + } + } + if (!processed) { + // new entry + $scope.indicatorReferences_adminView.push(tmpIndicatorReference_adminView); + } + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickEditIndicatorReference = function (indicatorReference_adminView) { + $scope.tmpIndicatorReference_selectedIndicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference_adminView.referencedIndicatorId); + $scope.tmpIndicatorReference_referenceDescription = indicatorReference_adminView.referencedIndicatorDescription; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickDeleteIndicatorReference = function (indicatorReference_adminView) { + for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { + if ($scope.indicatorReferences_adminView[index].referencedIndicatorId === indicatorReference_adminView.referencedIndicatorId) { + // remove object + $scope.indicatorReferences_adminView.splice(index, 1); + break; + } + } + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onAddOrUpdateGeoresourceReference = function () { + var tmpGeoresourceReference_adminView = { + "referencedGeoresourceName": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.datasetName, + "referencedGeoresourceId": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.georesourceId, + "referencedGeoresourceDescription": $scope.tmpGeoresourceReference_referenceDescription + }; + var processed = false; + for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { + var georesourceReference_adminView = $scope.georesourceReferences_adminView[index]; + if (georesourceReference_adminView.referencedGeoresourceId === tmpGeoresourceReference_adminView.referencedGeoresourceId) { + // replace object + $scope.georesourceReferences_adminView[index] = tmpGeoresourceReference_adminView; + processed = true; + break; + } + } + if (!processed) { + // new entry + $scope.georesourceReferences_adminView.push(tmpGeoresourceReference_adminView); + } + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickEditGeoresourceReference = function (georesourceReference_adminView) { + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference_adminView.referencedGeoresourceId); + $scope.tmpGeoresourceReference_referenceDescription = georesourceReference_adminView.referencedGeoresourceDescription; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickDeleteGeoresourceReference = function (georesourceReference_adminView) { + for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { + if ($scope.georesourceReferences_adminView[index].referencedGeoresourceId === georesourceReference_adminView.referencedGeoresourceId) { + // remove object + $scope.georesourceReferences_adminView.splice(index, 1); + break; + } + } + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onChangeCreationType = function () { + if ($scope.indicatorCreationType.apiName === "COMPUTATION") { + $scope.enableLowestSpatialUnitSelect = true; + } + else { + $scope.enableLowestSpatialUnitSelect = false; + } + }; + $scope.onChangeIndicatorUnit = function () { + if ($scope.indicatorUnit.includes("Freitext")) { + $scope.enableFreeTextUnit = true; + } + else { + $scope.enableFreeTextUnit = false; + } + }; + $scope.checkDatasetName = function () { + $scope.datasetNameInvalid = false; + kommonitorDataExchangeService.availableIndicators.forEach(function (indicator) { + if (indicator.indicatorName === $scope.datasetName) { + $scope.datasetNameInvalid = true; + return; + } + }); + }; + $scope.buildPostBody_indicators = function () { + var postBody = { + "metadata": { + "note": $scope.metadata.note || null, + "literature": $scope.metadata.literature || null, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG || 4326, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description || null, + "databasis": $scope.metadata.databasis || null + }, + "refrencesToOtherIndicators": [], + "allowedRoles": [], + "datasetName": $scope.datasetName, + "abbreviation": $scope.indicatorAbbreviation || null, + "characteristicValue": $scope.indicatorCharacteristicValue || null, + "tags": [], + "creationType": $scope.indicatorCreationType.apiName, + "unit": $scope.indicatorUnit, + "topicReference": "", + "refrencesToGeoresources": [], + "indicatorType": $scope.indicatorType.apiName, + "interpretation": $scope.indicatorInterpretation || "", + "isHeadlineIndicator": $scope.isHeadlineIndicator || false, + "processDescription": $scope.indicatorProcessDescription || "", + "referenceDateNote": $scope.indicatorReferenceDateNote || "", + "displayOrder": $scope.displayOrder, + "lowestSpatialUnitForComputation": $scope.indicatorLowestSpatialUnitMetadataObjectForComputation ? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : null, + "defaultClassificationMapping": { + "colorBrewerSchemeName": $scope.selectedColorBrewerPaletteEntry.paletteName, + "items": [ + { + "defaultColorAsHex": "#edf8e9", + "defaultCustomRating": "sehr niedrig" + }, + { + "defaultColorAsHex": "#bae4b3", + "defaultCustomRating": "niedrig" + }, + { + "defaultColorAsHex": "#74c476", + "defaultCustomRating": "mittel" + }, + { + "defaultColorAsHex": "#31a354", + "defaultCustomRating": "hoch" + }, + { + "defaultColorAsHex": "#006d2c", + "defaultCustomRating": "sehr hoch" + } + ] + } + }; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + postBody.allowedRoles.push(roleId); + } + // TAGS + if ($scope.indicatorTagsString_withCommas) { + var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); + for (const tagString of tags_splitted) { + postBody.tags.push(tagString.trim()); + } + } + // TOPIC REFERENCE + if ($scope.indicatorTopic_subsubsubTopic) { + postBody.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; + } + else if ($scope.indicatorTopic_subsubTopic) { + postBody.topicReference = $scope.indicatorTopic_subsubTopic.topicId; + } + else if ($scope.indicatorTopic_subTopic) { + postBody.topicReference = $scope.indicatorTopic_subTopic.topicId; + } + else if ($scope.indicatorTopic_mainTopic) { + postBody.topicReference = $scope.indicatorTopic_mainTopic.topicId; + } + else { + postBody.topicReference = ""; + } + // REFERENCES + if ($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0) { + postBody.refrencesToOtherIndicators = []; + for (const indicRef of $scope.indicatorReferences_adminView) { + postBody.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } + } + if ($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0) { + postBody.refrencesToGeoresources = []; + for (const geoRef of $scope.georesourceReferences_adminView) { + postBody.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + return postBody; + }; + $scope.addIndicator = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + var postBody = $scope.buildPostBody_indicators(); + return await $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $rootScope.$broadcast("refreshIndicatorOverviewTable", "add", response.data.indicatorId); + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function () { + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + $scope.successMessagePart = $scope.datasetName; + $scope.importedFeatures = []; + $("#indicatorAddSuccessAlert").show(); + $scope.loadingData = false; + }, function errorCallback(error) { + console.error("Error while adding computable indicatorMetadata service."); + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#indicatorAddErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + }); + }; + $scope.onImportIndicatorAddMetadata = function () { + $scope.indicatorMetadataImportError = ""; + $("#indicatorMetadataImportFile").files = []; + // trigger file chooser + $("#indicatorMetadataImportFile").click(); + }; + $(document).on("change", "#indicatorMetadataImportFile", function () { + console.log("Importing Indicator metadata for Add Indicator Form"); + // get the file + var file = document.getElementById('indicatorMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + $scope.parseMetadataFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMetadataFile(event); + } + catch (error) { + console.error(error); + console.error("Uploaded Metadata File cannot be parsed."); + $scope.indicatorMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorAddMetadataImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMetadataFile = function (event) { + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + if (!$scope.metadataImportSettings.metadata) { + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorAddMetadataImportErrorAlert").show(); + $scope.$digest(); + } + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function (option) { + if (option.apiName === $scope.metadataImportSettings.metadata.updateInterval) { + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#indicatorAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + $scope.indicatorReferenceDateNote = $scope.metadataImportSettings.referenceDateNote; + $scope.displayOrder = $scope.metadataImportSettings.displayOrder || 0; + $scope.datasetName = $scope.metadataImportSettings.datasetName; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + // indicator specific properties + $scope.indicatorAbbreviation = $scope.metadataImportSettings.abbreviation; + for (const indicatorTypeOption of kommonitorDataExchangeService.indicatorTypeOptions) { + if (indicatorTypeOption.apiName === $scope.metadataImportSettings.indicatorType) { + $scope.indicatorType = indicatorTypeOption; + break; + } + } + for (const indicatorCreationTypeOption of kommonitorDataExchangeService.indicatorCreationTypeOptions) { + if (indicatorCreationTypeOption.apiName === $scope.metadataImportSettings.creationType) { + $scope.indicatorCreationType = indicatorCreationTypeOption; + if (indicatorCreationTypeOption.apiName === "COMPUTATION") { + $scope.enableLowestSpatialUnitSelect = true; + } + else { + $scope.enableLowestSpatialUnitSelect = false; + } + break; + } + } + $scope.indicatorCharacteristicValue = $scope.metadataImportSettings.characteristicValue; + $scope.isHeadlineIndicator = $scope.metadataImportSettings.isHeadlineIndicator; + $scope.indicatorUnit = $scope.metadataImportSettings.unit; + if (kommonitorDataExchangeService.indicatorUnitOptions.includes($scope.metadataImportSettings.unit)) { + $scope.enableFreeTextUnit = false; + } + else { + $scope.enableFreeTextUnit = true; + } + $scope.indicatorProcessDescription = $scope.metadataImportSettings.processDescription; + $scope.indicatorTagsString_withCommas = undefined; + if ($scope.metadataImportSettings.tags && $scope.metadataImportSettings.tags.length > 0) { + $scope.indicatorTagsString_withCommas = ""; + for (let index = 0; index < $scope.metadataImportSettings.tags.length; index++) { + $scope.indicatorTagsString_withCommas += $scope.metadataImportSettings.tags[index]; + if (index < $scope.metadataImportSettings.tags.length - 1) { + $scope.indicatorTagsString_withCommas += ","; + } + } + } + $scope.indicatorInterpretation = $scope.metadataImportSettings.interpretation; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; + for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; + if (spatialUnitMetadata.spatialUnitLevel === $scope.metadataImportSettings.lowestSpatialUnitForComputation) { + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; + break; + } + } + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); + if (topicHierarchy && topicHierarchy[0]) { + $scope.indicatorTopic_mainTopic = topicHierarchy[0]; + } + if (topicHierarchy && topicHierarchy[1]) { + $scope.indicatorTopic_subTopic = topicHierarchy[1]; + } + if (topicHierarchy && topicHierarchy[2]) { + $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; + } + if (topicHierarchy && topicHierarchy[3]) { + $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; + } + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + if ($scope.metadataImportSettings.refrencesToOtherIndicators && $scope.metadataImportSettings.refrencesToOtherIndicators.length > 0) { + for (const indicatorReference of $scope.metadataImportSettings.refrencesToOtherIndicators) { + var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.indicatorId); + var referenceEntry = { + "referencedIndicatorName": indicatorMetadata.indicatorName, + "referencedIndicatorId": indicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, + "referencedIndicatorDescription": indicatorReference.referenceDescription + }; + $scope.indicatorReferences_adminView.push(referenceEntry); + } + } + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + if ($scope.metadataImportSettings.refrencesToGeoresources && $scope.metadataImportSettings.refrencesToGeoresources.length > 0) { + for (const georesourceReference of $scope.metadataImportSettings.refrencesToGeoresources) { + var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.georesourceId); + var geo_referenceEntry = { + "referencedGeoresourceName": georesourceMetadata.datasetName, + "referencedGeoresourceId": georesourceMetadata.georesourceId, + "referencedGeoresourceDescription": georesourceReference.referenceDescription + }; + $scope.georesourceReferences_adminView.push(geo_referenceEntry); + } + } + $scope.numClassesArray = [3, 4, 5, 6, 7, 8]; + $scope.numClasses = $scope.numClassesArray[2]; + // instantiate with palette 'Blues' + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + for (const colorbrewerPalette of $scope.colorbrewerPalettes) { + if (colorbrewerPalette.paletteName === $scope.metadataImportSettings.defaultClassificationMapping.colorBrewerSchemeName) { + $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; + break; + } + } + $scope.$digest(); + }; + $scope.onExportIndicatorAddMetadataTemplate = function () { + var metadataJSON = JSON.stringify($scope.indicatorMetadataStructure); + var fileName = "Indikator_Metadaten_Vorlage_Export.json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onExportIndicatorAddMetadata = function () { + var metadataExport = $scope.indicatorMetadataStructure; + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.datasetName = $scope.datasetName || ""; + metadataExport.referenceDateNote = $scope.indicatorReferenceDateNote || ""; + metadataExport.displayOrder = $scope.displayOrder || 0; + metadataExport.allowedRoles = []; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + if ($scope.metadata.updateInterval) { + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + var name = $scope.datasetName; + // indicator specific properties + metadataExport.abbreviation = $scope.indicatorAbbreviation || ""; + metadataExport.indicatorType = $scope.indicatorType ? $scope.indicatorType.apiName : ""; + metadataExport.creationType = $scope.indicatorCreationType ? $scope.indicatorCreationType.apiName : ""; + metadataExport.characteristicValue = $scope.indicatorCharacteristicValue || ""; + metadataExport.isHeadlineIndicator = $scope.isHeadlineIndicator || false; + metadataExport.unit = $scope.indicatorUnit || ""; + metadataExport.processDescription = $scope.indicatorProcessDescription || ""; + metadataExport.tags = []; + if ($scope.indicatorTagsString_withCommas) { + var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); + for (const tagString of tags_splitted) { + metadataExport.tags.push(tagString.trim()); + } + } + metadataExport.interpretation = $scope.indicatorInterpretation || ""; + metadataExport.lowestSpatialUnitForComputation = $scope.indicatorLowestSpatialUnitMetadataObjectForComputation ? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : ""; + if ($scope.indicatorTopic_subsubsubTopic) { + metadataExport.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; + } + else if ($scope.indicatorTopic_subsubTopic) { + metadataExport.topicReference = $scope.indicatorTopic_subsubTopic.topicId; + } + else if ($scope.indicatorTopic_subTopic) { + metadataExport.topicReference = $scope.indicatorTopic_subTopic.topicId; + } + else if ($scope.indicatorTopic_mainTopic) { + metadataExport.topicReference = $scope.indicatorTopic_mainTopic.topicId; + } + else { + metadataExport.topicReference = ""; + } + metadataExport.refrencesToOtherIndicators = []; + if ($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0) { + metadataExport.refrencesToOtherIndicators = []; + for (const indicRef of $scope.indicatorReferences_adminView) { + metadataExport.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } + } + metadataExport.refrencesToGeoresources = []; + if ($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0) { + metadataExport.refrencesToGeoresources = []; + for (const geoRef of $scope.georesourceReferences_adminView) { + metadataExport.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + var defaultClassificationMapping = { + "colorBrewerSchemeName": $scope.selectedColorBrewerPaletteEntry ? $scope.selectedColorBrewerPaletteEntry.paletteName : "Blues", + "items": [ + { + "defaultColorAsHex": "#edf8e9", + "defaultCustomRating": "sehr niedrig" + }, + { + "defaultColorAsHex": "#bae4b3", + "defaultCustomRating": "niedrig" + }, + { + "defaultColorAsHex": "#74c476", + "defaultCustomRating": "mittel" + }, + { + "defaultColorAsHex": "#31a354", + "defaultCustomRating": "hoch" + }, + { + "defaultColorAsHex": "#006d2c", + "defaultCustomRating": "sehr hoch" + } + ] + }; + metadataExport.defaultClassificationMapping = defaultClassificationMapping; + var metadataJSON = JSON.stringify(metadataExport); + var fileName = "Indikatoren_Metadaten_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.hideSuccessAlert = function () { + $("#indicatorAddSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#indicatorAddErrorAlert").hide(); + }; + $scope.hideMetadataErrorAlert = function () { + $("#indicatorAddMetadataImportErrorAlert").hide(); + }; + kommonitorMultiStepFormHelperService.registerClickHandler(); + } + ] +}); +//# sourceMappingURL=indicator-add-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.js.map new file mode 100644 index 000000000..d597fdb14 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-add-modal.component.js","sourceRoot":"","sources":["indicator-add-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.ts new file mode 100644 index 000000000..75b08e2fe --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.component.ts @@ -0,0 +1,1042 @@ +angular.module('indicatorAddModal').component('indicatorAddModal', { + templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', '$scope', '$rootScope', '$http', '$timeout', + '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', + function IndicatorAddModalAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, $scope, $rootScope, $http, $timeout, + __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + + /* POST BODY + { + "refrencesToOtherIndicators": [ + { + "referenceDescription": "referenceDescription", + "indicatorId": "indicatorId" + }, + { + "referenceDescription": "referenceDescription", + "indicatorId": "indicatorId" + } + ], + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "allowedRoles": [ + "allowedRoles", + "allowedRoles" + ], + "datasetName": "datasetName", + "abbreviation": "abbreviation", + "characteristicValue": "characteristicValue", + "tags": [ + "tags", + "tags" + ], + "creationType": "INSERTION", + "unit": "unit", + "topicReference": "topicReference", + "referencDateNote": "note", + "displayOrder": 0, + "refrencesToGeoresources": [ + { + "referenceDescription": "referenceDescription", + "georesourceId": "georesourceId" + }, + { + "referenceDescription": "referenceDescription", + "georesourceId": "georesourceId" + } + ], + "indicatorType": "STATUS_ABSOLUTE", + "interpretation": "interpretation", + "isHeadlineIndicator": false, + "processDescription": "processDescription", + "lowestSpatialUnitForComputation": "lowestSpatialUnitForComputation", + "defaultClassificationMapping": { + "colorBrewerSchemeName": "colorBrewerSchemeName", + "items": [ + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + }, + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + } + ] + } + } + */ + + //Date picker + $('#indicatorAddLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + + $scope.indicatorMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "refrencesToOtherIndicators": [ + { + "referenceDescription": "description about the reference", + "indicatorId": "ID of referenced indicator dataset" + } + ], + "refrencesToGeoresources": [ + { + "referenceDescription": "description about the reference", + "georesourceId": "ID of referenced georesource dataset" + } + ], + "datasetName": "Name of indicator dataset", + "abbreviation": "optional abbreviation of the indicator dataset", + "characteristicValue": "if the same datasetName is used for different indicators, the optional characteristicValue parameter may serve to distinguish between them (i.e. Habitants - male, Habitants - female, Habitants - diverse)", + "tags": [ + "optinal list of tags; each tag is a free text tag" + ], + "creationType": "INSERTION|COMPUTATION <-- enum parameter controls whether each timestamp must be updated manually (INSERTION) or if KomMonitor shall compute the indicator values for respective timestamps based on script file (COMPUTATION)", + "unit": "unit of the indicator", + "topicReference": "ID of the respective main/sub topic instance", + "indicatorType": "STATUS_ABSOLUTE|STATUS_RELATIVE|DYNAMIC_ABSOLUTE|DYNAMIC_RELATIVE|STATUS_STANDARDIZED|DYNAMIC_STANDARDIZED", + "interpretation": "interpretation hints for the user to better understand the indicator values", + "isHeadlineIndicator": "boolean parameter to indicate if indicator is a headline indicator", + "processDescription": "detailed description about the computation/creation of the indicator", + "referenceDateNote": "optional note for indicator reference date", + "displayOrder": 0, + "lowestSpatialUnitForComputation": "the name of the lowest possible spatial unit for which an indicator of creationType=COMPUTATION may be computed. All other superior spatial units will be aggregated automatically", + "defaultClassificationMapping": { + "colorBrewerSchemeName": "schema name of colorBrewer colorPalette to use for classification", + "items": [ + { + "defaultCustomRating": "a string to rate indicator values of this class", + "defaultColorAsHex": "color as hexadecimal value" + } + ] + } + }; + + $scope.indicatorMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.indicatorMetadataStructure); + $scope.indicatorMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure_indicator); + + + $scope.metadataImportSettings; + $scope.indicatorMetadataImportError; + $scope.indicatorAddMetadataImportErrorAlert; + + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + + $scope.roleManagementTableOptions = undefined; + + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + + // make sure that initial fetching of availableRoles has happened + $scope.$on("initialMetadataLoadingCompleted", function (event) { + refreshRoles(); + }); + + function refreshRoles() { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + + $scope.datasetName = undefined; + $scope.indicatorAbbreviation = undefined; + $scope.indicatorType = undefined; + $scope.indicatorCharacteristicValue = undefined; + $scope.isHeadlineIndicator = false; + $scope.indicatorUnit = undefined; + $scope.enableFreeTextUnit = false; + $scope.indicatorProcessDescription = undefined; + $scope.indicatorTagsString_withCommas = undefined; + $scope.indicatorInterpretation = undefined; + $scope.indicatorCreationType = undefined; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; + $scope.enableLowestSpatialUnitSelect = false; + + $scope.indicatorReferenceDateNote = undefined; + $scope.displayOrder = 0; + + $scope.indicatorTopic_mainTopic = undefined; + $scope.indicatorTopic_subTopic = undefined; + $scope.indicatorTopic_subsubTopic = undefined; + $scope.indicatorTopic_subsubsubTopic = undefined; + + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + + $scope.numClassesArray = [3,4,5,6,7,8]; + $scope.numClasses = $scope.numClassesArray[2]; + $scope.selectedColorBrewerPaletteEntry = undefined; + + $scope.postBody_indicators = undefined; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $scope.loadingData = false; + + $scope.colorbrewerSchemes = colorbrewer; + $scope.colorbreweSchemeName_dynamicIncrease = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; + $scope.colorbreweSchemeName_dynamicDecrease = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; + $scope.colorbrewerPalettes = []; + + + $scope.instantiateColorBrewerPalettes = function(){ + for (const key in colorbrewer) { + if (colorbrewer.hasOwnProperty(key)) { + const colorPalettes = colorbrewer[key]; + + var paletteEntry = { + "paletteName": key, + "paletteArrayObject": colorPalettes + }; + + $scope.colorbrewerPalettes.push(paletteEntry); + } + } + + // instantiate with palette 'Blues' + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + + }; + + $scope.instantiateColorBrewerPalettes(); + + $scope.resetIndicatorAddForm = function(){ + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + + $scope.datasetName = undefined; + $scope.indicatorAbbreviation = undefined; + $scope.indicatorType = kommonitorDataExchangeService.indicatorTypeOptions[0]; + $scope.indicatorCharacteristicValue = undefined; + $scope.isHeadlineIndicator = false; + $scope.indicatorUnit = undefined; + $scope.enableFreeTextUnit = false; + $scope.indicatorProcessDescription = undefined; + $scope.indicatorTagsString_withCommas = undefined; + $scope.indicatorInterpretation = undefined; + $scope.indicatorCreationType = kommonitorDataExchangeService.indicatorCreationTypeOptions[0]; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; + $scope.enableLowestSpatialUnitSelect = false; + + $scope.indicatorReferenceDateNote = undefined; + $scope.displayOrder = 0; + + $scope.indicatorTopic_mainTopic = undefined; + $scope.indicatorTopic_subTopic = undefined; + $scope.indicatorTopic_subsubTopic = undefined; + $scope.indicatorTopic_subsubsubTopic = undefined; + + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + + $scope.numClassesArray = [3,4,5,6,7,8]; + $scope.numClasses = $scope.numClassesArray[2]; + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + + $scope.postBody_indicators = undefined; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickColorBrewerEntry = function(colorPaletteEntry){ + $scope.selectedColorBrewerPaletteEntry = colorPaletteEntry; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onAddOrUpdateIndicatorReference = function(){ + var tmpIndicatorReference_adminView = { + "referencedIndicatorName": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorName, + "referencedIndicatorId": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": $scope.tmpIndicatorReference_selectedIndicatorMetadata.abbreviation, + "referencedIndicatorDescription": $scope.tmpIndicatorReference_referenceDescription + }; + + var processed = false; + + for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { + var indicatorReference_adminView = $scope.indicatorReferences_adminView[index]; + + if (indicatorReference_adminView.referencedIndicatorId === tmpIndicatorReference_adminView.referencedIndicatorId){ + // replace object + $scope.indicatorReferences_adminView[index] = tmpIndicatorReference_adminView; + processed = true; + break; + } + } + + if(! processed){ + // new entry + $scope.indicatorReferences_adminView.push(tmpIndicatorReference_adminView); + } + + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickEditIndicatorReference = function(indicatorReference_adminView){ + + $scope.tmpIndicatorReference_selectedIndicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference_adminView.referencedIndicatorId); + $scope.tmpIndicatorReference_referenceDescription = indicatorReference_adminView.referencedIndicatorDescription; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickDeleteIndicatorReference = function(indicatorReference_adminView){ + + for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { + + if ($scope.indicatorReferences_adminView[index].referencedIndicatorId === indicatorReference_adminView.referencedIndicatorId){ + // remove object + $scope.indicatorReferences_adminView.splice(index, 1); + break; + } + } + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onAddOrUpdateGeoresourceReference = function(){ + var tmpGeoresourceReference_adminView = { + "referencedGeoresourceName": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.datasetName, + "referencedGeoresourceId": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.georesourceId, + "referencedGeoresourceDescription": $scope.tmpGeoresourceReference_referenceDescription + }; + + var processed = false; + + for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { + var georesourceReference_adminView = $scope.georesourceReferences_adminView[index]; + + if (georesourceReference_adminView.referencedGeoresourceId === tmpGeoresourceReference_adminView.referencedGeoresourceId){ + // replace object + $scope.georesourceReferences_adminView[index] = tmpGeoresourceReference_adminView; + processed = true; + break; + } + } + + if(! processed){ + // new entry + $scope.georesourceReferences_adminView.push(tmpGeoresourceReference_adminView); + } + + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickEditGeoresourceReference = function(georesourceReference_adminView){ + + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference_adminView.referencedGeoresourceId); + $scope.tmpGeoresourceReference_referenceDescription = georesourceReference_adminView.referencedGeoresourceDescription; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickDeleteGeoresourceReference = function(georesourceReference_adminView){ + + for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { + + if ($scope.georesourceReferences_adminView[index].referencedGeoresourceId === georesourceReference_adminView.referencedGeoresourceId){ + // remove object + $scope.georesourceReferences_adminView.splice(index, 1); + break; + } + } + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onChangeCreationType = function(){ + if($scope.indicatorCreationType.apiName === "COMPUTATION"){ + $scope.enableLowestSpatialUnitSelect = true; + } + else{ + $scope.enableLowestSpatialUnitSelect = false; + } + + }; + + $scope.onChangeIndicatorUnit = function(){ + if ($scope.indicatorUnit.includes("Freitext")){ + $scope.enableFreeTextUnit = true; + } + else{ + $scope.enableFreeTextUnit = false; + } + }; + + $scope.checkDatasetName = function(){ + $scope.datasetNameInvalid = false; + kommonitorDataExchangeService.availableIndicators.forEach(function(indicator){ + if (indicator.indicatorName === $scope.datasetName){ + $scope.datasetNameInvalid = true; + return; + } + }); + }; + + $scope.buildPostBody_indicators = function(){ + var postBody = + { + "metadata": { + "note": $scope.metadata.note || null, + "literature": $scope.metadata.literature || null, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG || 4326, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description || null, + "databasis": $scope.metadata.databasis || null + }, + "refrencesToOtherIndicators": [], // filled directly after + "allowedRoles": [], + "datasetName": $scope.datasetName, + "abbreviation": $scope.indicatorAbbreviation || null, + "characteristicValue": $scope.indicatorCharacteristicValue || null, + "tags": [], // filled directly after + "creationType": $scope.indicatorCreationType.apiName, + "unit": $scope.indicatorUnit, + "topicReference": "", // filled directly after + "refrencesToGeoresources": [], // filled directly after + "indicatorType": $scope.indicatorType.apiName, + "interpretation": $scope.indicatorInterpretation || "", + "isHeadlineIndicator": $scope.isHeadlineIndicator || false, + "processDescription": $scope.indicatorProcessDescription || "", + "referenceDateNote": $scope.indicatorReferenceDateNote || "", + "displayOrder": $scope.displayOrder, + "lowestSpatialUnitForComputation": $scope.indicatorLowestSpatialUnitMetadataObjectForComputation? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : null, + "defaultClassificationMapping": { + "colorBrewerSchemeName": $scope.selectedColorBrewerPaletteEntry.paletteName, + "items": [ + { + "defaultColorAsHex": "#edf8e9", + "defaultCustomRating": "sehr niedrig" + }, + { + "defaultColorAsHex": "#bae4b3", + "defaultCustomRating": "niedrig" + }, + { + "defaultColorAsHex": "#74c476", + "defaultCustomRating": "mittel" + }, + { + "defaultColorAsHex": "#31a354", + "defaultCustomRating": "hoch" + }, + { + "defaultColorAsHex": "#006d2c", + "defaultCustomRating": "sehr hoch" + } + ] + } + }; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + postBody.allowedRoles.push(roleId); + } + + // TAGS + if($scope.indicatorTagsString_withCommas){ + var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); + for (const tagString of tags_splitted) { + postBody.tags.push(tagString.trim()); + } + } + + // TOPIC REFERENCE + if($scope.indicatorTopic_subsubsubTopic){ + postBody.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; + } + else if($scope.indicatorTopic_subsubTopic){ + postBody.topicReference = $scope.indicatorTopic_subsubTopic.topicId; + } + else if($scope.indicatorTopic_subTopic){ + postBody.topicReference = $scope.indicatorTopic_subTopic.topicId; + } + else if($scope.indicatorTopic_mainTopic){ + postBody.topicReference = $scope.indicatorTopic_mainTopic.topicId; + } + else { + postBody.topicReference = ""; + } + + + // REFERENCES + if($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0){ + postBody.refrencesToOtherIndicators = []; + + for (const indicRef of $scope.indicatorReferences_adminView) { + postBody.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } + } + + if($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0){ + postBody.refrencesToGeoresources = []; + + for (const geoRef of $scope.georesourceReferences_adminView) { + postBody.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + + + return postBody; + }; + + $scope.addIndicator = async function(){ + + $timeout(function(){ + $scope.loadingData = true; + }); + + var postBody = $scope.buildPostBody_indicators(); + + return await $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $rootScope.$broadcast("refreshIndicatorOverviewTable", "add", response.data.indicatorId); + + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function(){ + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + + $scope.successMessagePart = $scope.datasetName; + $scope.importedFeatures = []; + + $("#indicatorAddSuccessAlert").show(); + + $scope.loadingData = false; + + }, function errorCallback(error) { + console.error("Error while adding computable indicatorMetadata service."); + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#indicatorAddErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }); + + }; + + $scope.onImportIndicatorAddMetadata = function(){ + + $scope.indicatorMetadataImportError = ""; + + $("#indicatorMetadataImportFile").files = []; + + // trigger file chooser + $("#indicatorMetadataImportFile").click(); + + }; + + $(document).on("change", "#indicatorMetadataImportFile" ,function(){ + + console.log("Importing Indicator metadata for Add Indicator Form"); + + // get the file + var file = document.getElementById('indicatorMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + + $scope.parseMetadataFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMetadataFile(event); + } + catch(error){ + console.error(error); + console.error("Uploaded Metadata File cannot be parsed."); + $scope.indicatorMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorAddMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMetadataFile = function(event){ + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + + if(! $scope.metadataImportSettings.metadata){ + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorAddMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ + if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#indicatorAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + + $scope.indicatorReferenceDateNote = $scope.metadataImportSettings.referenceDateNote; + $scope.displayOrder = $scope.metadataImportSettings.displayOrder || 0; + + $scope.datasetName = $scope.metadataImportSettings.datasetName; + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + + + // indicator specific properties + + + $scope.indicatorAbbreviation = $scope.metadataImportSettings.abbreviation; + + for (const indicatorTypeOption of kommonitorDataExchangeService.indicatorTypeOptions) { + if(indicatorTypeOption.apiName === $scope.metadataImportSettings.indicatorType){ + $scope.indicatorType = indicatorTypeOption; + break; + } + } + + for (const indicatorCreationTypeOption of kommonitorDataExchangeService.indicatorCreationTypeOptions) { + if(indicatorCreationTypeOption.apiName === $scope.metadataImportSettings.creationType){ + $scope.indicatorCreationType = indicatorCreationTypeOption; + + if(indicatorCreationTypeOption.apiName === "COMPUTATION"){ + $scope.enableLowestSpatialUnitSelect = true; + } + else{ + $scope.enableLowestSpatialUnitSelect = false; + } + break; + } + } + + $scope.indicatorCharacteristicValue = $scope.metadataImportSettings.characteristicValue; + $scope.isHeadlineIndicator = $scope.metadataImportSettings.isHeadlineIndicator; + $scope.indicatorUnit = $scope.metadataImportSettings.unit; + if(kommonitorDataExchangeService.indicatorUnitOptions.includes($scope.metadataImportSettings.unit)){ + $scope.enableFreeTextUnit = false; + } + else{ + $scope.enableFreeTextUnit = true; + } + + $scope.indicatorProcessDescription = $scope.metadataImportSettings.processDescription; + + $scope.indicatorTagsString_withCommas = undefined; + if($scope.metadataImportSettings.tags && $scope.metadataImportSettings.tags.length > 0){ + $scope.indicatorTagsString_withCommas = ""; + for (let index = 0; index < $scope.metadataImportSettings.tags.length; index++) { + $scope.indicatorTagsString_withCommas += $scope.metadataImportSettings.tags[index]; + + if(index < $scope.metadataImportSettings.tags.length - 1){ + $scope.indicatorTagsString_withCommas += ","; + } + } + } + + $scope.indicatorInterpretation = $scope.metadataImportSettings.interpretation; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = kommonitorDataExchangeService.availableSpatialUnits[0]; + + for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; + + if(spatialUnitMetadata.spatialUnitLevel === $scope.metadataImportSettings.lowestSpatialUnitForComputation){ + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; + break; + } + } + + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); + + if(topicHierarchy && topicHierarchy[0]){ + $scope.indicatorTopic_mainTopic = topicHierarchy[0]; + } + if(topicHierarchy && topicHierarchy[1]){ + $scope.indicatorTopic_subTopic = topicHierarchy[1]; + } + if(topicHierarchy && topicHierarchy[2]){ + $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; + } + if(topicHierarchy && topicHierarchy[3]){ + $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; + } + + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + if($scope.metadataImportSettings.refrencesToOtherIndicators && $scope.metadataImportSettings.refrencesToOtherIndicators.length > 0){ + for (const indicatorReference of $scope.metadataImportSettings.refrencesToOtherIndicators) { + var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.indicatorId); + var referenceEntry = { + "referencedIndicatorName": indicatorMetadata.indicatorName, + "referencedIndicatorId": indicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, + "referencedIndicatorDescription": indicatorReference.referenceDescription + }; + $scope.indicatorReferences_adminView.push(referenceEntry); + } + + } + + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + + if($scope.metadataImportSettings.refrencesToGeoresources && $scope.metadataImportSettings.refrencesToGeoresources.length > 0){ + for (const georesourceReference of $scope.metadataImportSettings.refrencesToGeoresources) { + var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.georesourceId); + var geo_referenceEntry = { + "referencedGeoresourceName": georesourceMetadata.datasetName, + "referencedGeoresourceId": georesourceMetadata.georesourceId, + "referencedGeoresourceDescription": georesourceReference.referenceDescription + }; + $scope.georesourceReferences_adminView.push(geo_referenceEntry); + } + + } + + $scope.numClassesArray = [3,4,5,6,7,8]; + $scope.numClasses = $scope.numClassesArray[2]; + // instantiate with palette 'Blues' + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + + for (const colorbrewerPalette of $scope.colorbrewerPalettes) { + if (colorbrewerPalette.paletteName === $scope.metadataImportSettings.defaultClassificationMapping.colorBrewerSchemeName){ + $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; + break; + } + } + + $scope.$digest(); + }; + + $scope.onExportIndicatorAddMetadataTemplate = function(){ + + var metadataJSON = JSON.stringify($scope.indicatorMetadataStructure); + + var fileName = "Indikator_Metadaten_Vorlage_Export.json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + $scope.onExportIndicatorAddMetadata = function(){ + var metadataExport = $scope.indicatorMetadataStructure; + + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.datasetName = $scope.datasetName || ""; + + metadataExport.referenceDateNote = $scope.indicatorReferenceDateNote || ""; + metadataExport.displayOrder = $scope.displayOrder || 0; + + metadataExport.allowedRoles = []; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + + if($scope.metadata.updateInterval){ + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + + var name = $scope.datasetName; + + // indicator specific properties + + metadataExport.abbreviation = $scope.indicatorAbbreviation || ""; + metadataExport.indicatorType = $scope.indicatorType ? $scope.indicatorType.apiName : ""; + metadataExport.creationType = $scope.indicatorCreationType ? $scope.indicatorCreationType.apiName : ""; + + metadataExport.characteristicValue = $scope.indicatorCharacteristicValue || ""; + metadataExport.isHeadlineIndicator = $scope.isHeadlineIndicator || false; + metadataExport.unit = $scope.indicatorUnit || ""; + metadataExport.processDescription = $scope.indicatorProcessDescription || ""; + metadataExport.tags = []; + + if($scope.indicatorTagsString_withCommas){ + var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); + for (const tagString of tags_splitted) { + metadataExport.tags.push(tagString.trim()); + } + } + + metadataExport.interpretation = $scope.indicatorInterpretation || ""; + metadataExport.lowestSpatialUnitForComputation = $scope.indicatorLowestSpatialUnitMetadataObjectForComputation? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : ""; + + if($scope.indicatorTopic_subsubsubTopic){ + metadataExport.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; + } + else if($scope.indicatorTopic_subsubTopic){ + metadataExport.topicReference = $scope.indicatorTopic_subsubTopic.topicId; + } + else if($scope.indicatorTopic_subTopic){ + metadataExport.topicReference = $scope.indicatorTopic_subTopic.topicId; + } + else if($scope.indicatorTopic_mainTopic){ + metadataExport.topicReference = $scope.indicatorTopic_mainTopic.topicId; + } + else { + metadataExport.topicReference = ""; + } + + metadataExport.refrencesToOtherIndicators = []; + + if($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0){ + metadataExport.refrencesToOtherIndicators = []; + + for (const indicRef of $scope.indicatorReferences_adminView) { + metadataExport.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } + } + + metadataExport.refrencesToGeoresources = []; + + if($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0){ + metadataExport.refrencesToGeoresources = []; + + for (const geoRef of $scope.georesourceReferences_adminView) { + metadataExport.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + + var defaultClassificationMapping = { + "colorBrewerSchemeName" : $scope.selectedColorBrewerPaletteEntry ? $scope.selectedColorBrewerPaletteEntry.paletteName : "Blues", + "items": [ + { + "defaultColorAsHex": "#edf8e9", + "defaultCustomRating": "sehr niedrig" + }, + { + "defaultColorAsHex": "#bae4b3", + "defaultCustomRating": "niedrig" + }, + { + "defaultColorAsHex": "#74c476", + "defaultCustomRating": "mittel" + }, + { + "defaultColorAsHex": "#31a354", + "defaultCustomRating": "hoch" + }, + { + "defaultColorAsHex": "#006d2c", + "defaultCustomRating": "sehr hoch" + } + ] + }; + + metadataExport.defaultClassificationMapping = defaultClassificationMapping; + + + var metadataJSON = JSON.stringify(metadataExport); + + var fileName = "Indikatoren_Metadaten_Export"; + + if (name){ + fileName += "-" + name; + } + + fileName += ".json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + $scope.hideSuccessAlert = function(){ + $("#indicatorAddSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#indicatorAddErrorAlert").hide(); + }; + + $scope.hideMetadataErrorAlert = function(){ + $("#indicatorAddMetadataImportErrorAlert").hide(); + }; + + kommonitorMultiStepFormHelperService.registerClickHandler(); + + } +]}); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.js index 57ae8faf1..b835b6385 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.js @@ -1,2 +1,4 @@ -angular.module('indicatorAddModal', ['kommonitorDataExchange', 'kommonitorImporterHelper', 'adminTopicsManagement', +"use strict"; +angular.module('indicatorAddModal', ['kommonitorDataExchange', 'kommonitorImporterHelper', 'adminTopicsManagement', 'excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=indicator-add-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.js.map new file mode 100644 index 000000000..273fd498c --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-add-modal.module.js","sourceRoot":"","sources":["indicator-add-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,wBAAwB,EAAE,0BAA0B,EAAE,uBAAuB;IAC9G,mBAAmB,EAAE,+BAA+B,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.ts new file mode 100644 index 000000000..57ae8faf1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorAddModal/indicator-add-modal.module.ts @@ -0,0 +1,2 @@ +angular.module('indicatorAddModal', ['kommonitorDataExchange', 'kommonitorImporterHelper', 'adminTopicsManagement', + 'excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.js index 3b44ecc25..28be64b56 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.js @@ -1,279 +1,235 @@ +"use strict"; angular.module('indicatorBatchUpdateModal').component('indicatorBatchUpdateModal', { - templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', 'kommonitorBatchUpdateHelperService', '$scope', '$rootScope', '$http', '$timeout', '__env', - function IndicatorBatchUpdateModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, kommonitorBatchUpdateHelperService, $scope, $rootScope, $http, $timeout, __env) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - this.kommonitorBatchUpdateHelperServiceInstance = kommonitorBatchUpdateHelperService; - - $scope.isFirstStart = true; - $scope.lastUpdateResponseObj; - $scope.timeseriesMappingReference; // gets updated by a broadcast whenever $scope.timeseries mapping in indicatorEditTimeseriesMapping component changes - $scope.selected = { value: kommonitorDataExchangeService.availableIndicators[0] }; - $scope.keepMissingValues = true; - - /* - { - "converter": { - "encoding": "string", - "mimeType": "string", - "name": "string", - "parameters": [{ - "name": "string", - "value": "string" - }], - "schema": "string" - }, - "dataSource": { - "parameters": [{ - "name": "string", - "value": "string" - }], - "type": "FILE" // FILE|HTTP|INLINE - }, - "propertyMapping": { - timeseriesMappings: [ - { - "indicatorValueProperty": "string", - "timestamp": "date" // direct timestamp - }, { - "indicatorValueProperty": "string", - "timestampProperty": "string" // attribute column that contains timestamp(s) - }], - spatialReferenceKeyProperty: "", - keepMissingOrNullValueIndicator: true, - }, - targetSpatialUnitName: "" - } - */ - $scope.batchList = []; - $scope.timeseriesMappingModalOpenForIndex; // temporarily stores for which index of the batch list the timeseries mapping modal is open - $scope.defaultTimeseriesMappingSave = []; - - // on modal opened - $('#modal-batch-update-indicators').on('show.bs.modal', function () { - // this check is necessary to avoid running the initialize method on opening datepicker modals - if(event) { - if(event.target.id === "button-batch-update-indicators") { - $scope.initialize(); - } - } - }); - - - // initializes the modal - $scope.initialize = function() { - - if($scope.isFirstStart) { - kommonitorBatchUpdateHelperService.addNewRowToBatchList("indicator", $scope.batchList) - $scope.isFirstStart = false; - } - - $(document).on("change", ".indicatorMappingTableInputField", function(){ - // get index of changed field - var index = kommonitorBatchUpdateHelperService.getIndexFromId(this.id); - - // get file - var file = this.files[0]; - - // read content - var reader = new FileReader(); - reader.addEventListener('load', function(event) { - kommonitorBatchUpdateHelperService.onMappingTableSelected("indicator", event, index, file, $scope.batchList); - }); - reader.readAsText(file) - }); - - $(document).on("change", ".indicatorDataSourceFileInputField", function(){ - // get index of changed field - var index = kommonitorBatchUpdateHelperService.getIndexFromId(this.id); - - // get file - var file = this.files[0]; - - // read content - var reader = new FileReader(); - reader.addEventListener('load', function() { - kommonitorBatchUpdateHelperService.onDataSourceFileSelected(file, index, $scope.batchList); - }); - reader.readAsText(file) - }); - - $scope.$digest(); - }; - - $scope.loadIndicatorsBatchList = function() { - $("#indicatorsBatchListFile").files = []; - - // trigger file chooser - $("#indicatorsBatchListFile").trigger("click"); - }; - - $(document).on("change", "#indicatorsBatchListFile" ,function(){ - - // get the file - var file = document.getElementById('indicatorsBatchListFile').files[0]; - kommonitorBatchUpdateHelperService.parseBatchListFromFile("indicator", file, $scope.batchList) - }); - - $scope.$on('indicatorBatchListParsed', function(event, data) { - $timeout(function() { - - var newBatchList = data.newValue; - - // remove all rows - for (var i = 0; i < $scope.batchList.length; i++) - $scope.batchList[i].isSelected = true; - kommonitorBatchUpdateHelperService.deleteSelectedRowsFromBatchList($scope.batchList, $scope.allRowsSelected); - - for(let i=0; i 0) - $scope.$broadcast('loadTimeseriesMapping', { mapping: timeseriesMappingProp}); - else - $scope.$broadcast('resetTimeseriesMapping'); - } - - }); - - $('#indicator-edit-default-time-series-mapping-modal').on('show.bs.modal', function (event) { - if(event.target.id === "indicator-edit-default-time-series-mapping-modal") { - if($scope.defaultTimeseriesMappingSave.length >= 1) - $scope.$broadcast('loadTimeseriesMapping', { mapping: $scope.defaultTimeseriesMappingSave }); - else - $scope.$broadcast('resetTimeseriesMapping'); - } - }); - - // on timeseries mapping modal closed - $('#indicator-edit-time-series-mapping-modal').on('hidden.bs.modal', function (event) { - if(event.target.id === "indicator-edit-time-series-mapping-modal") { - // store timeseries mapping to mappingObj - let index = $scope.timeseriesMappingModalOpenForIndex; - // converting to json and back gets rid of the $$hashkey property - $scope.batchList[index].mappingObj.propertyMapping.timeseriesMappings = angular.fromJson(angular.toJson($scope.timeseriesMappingReference)); - $scope.timeseriesMappingModalOpenForIndex = undefined; - // then reset the modal - //$scope.$broadcast('resetTimeseriesMapping') - } - }); - - // on default timeseries mapping modal closed - $('#indicator-edit-default-time-series-mapping-modal').on('hidden.bs.modal', function (event) { - if(event.target.id === "indicator-edit-default-time-series-mapping-modal") { - // store timeseries mapping to mappingObj - $scope.defaultTimeseriesMappingSave = $scope.timeseriesMappingReference; - // then reset the modal - //$scope.$broadcast('resetTimeseriesMapping') - } - }); - - - $scope.$on("batchUpdateCompleted", function(event, data) { - if(data.resourceType === "indicator") { - $scope.lastUpdateResponseObj = data; - } - }); - - - $scope.reopenResultModal = function() { - if (typeof $scope.lastUpdateResponseObj !== 'undefined') { - $rootScope.$broadcast("reopenBatchUpdateResultModal", $scope.lastUpdateResponseObj); - } - } - - $rootScope.$on("timeseriesMappingChanged", function(event, data) { - $scope.timeseriesMappingReference = data.mapping; - }); - - - } -]}); \ No newline at end of file + templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', 'kommonitorBatchUpdateHelperService', '$scope', '$rootScope', '$http', '$timeout', '__env', + function IndicatorBatchUpdateModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, kommonitorBatchUpdateHelperService, $scope, $rootScope, $http, $timeout, __env) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorBatchUpdateHelperServiceInstance = kommonitorBatchUpdateHelperService; + $scope.isFirstStart = true; + $scope.lastUpdateResponseObj; + $scope.timeseriesMappingReference; // gets updated by a broadcast whenever $scope.timeseries mapping in indicatorEditTimeseriesMapping component changes + $scope.selected = { value: kommonitorDataExchangeService.availableIndicators[0] }; + $scope.keepMissingValues = true; + /* + { + "converter": { + "encoding": "string", + "mimeType": "string", + "name": "string", + "parameters": [{ + "name": "string", + "value": "string" + }], + "schema": "string" + }, + "dataSource": { + "parameters": [{ + "name": "string", + "value": "string" + }], + "type": "FILE" // FILE|HTTP|INLINE + }, + "propertyMapping": { + timeseriesMappings: [ + { + "indicatorValueProperty": "string", + "timestamp": "date" // direct timestamp + }, { + "indicatorValueProperty": "string", + "timestampProperty": "string" // attribute column that contains timestamp(s) + }], + spatialReferenceKeyProperty: "", + keepMissingOrNullValueIndicator: true, + }, + targetSpatialUnitName: "" + } + */ + $scope.batchList = []; + $scope.timeseriesMappingModalOpenForIndex; // temporarily stores for which index of the batch list the timeseries mapping modal is open + $scope.defaultTimeseriesMappingSave = []; + // on modal opened + $('#modal-batch-update-indicators').on('show.bs.modal', function () { + // this check is necessary to avoid running the initialize method on opening datepicker modals + if (event) { + if (event.target.id === "button-batch-update-indicators") { + $scope.initialize(); + } + } + }); + // initializes the modal + $scope.initialize = function () { + if ($scope.isFirstStart) { + kommonitorBatchUpdateHelperService.addNewRowToBatchList("indicator", $scope.batchList); + $scope.isFirstStart = false; + } + $(document).on("change", ".indicatorMappingTableInputField", function () { + // get index of changed field + var index = kommonitorBatchUpdateHelperService.getIndexFromId(this.id); + // get file + var file = this.files[0]; + // read content + var reader = new FileReader(); + reader.addEventListener('load', function (event) { + kommonitorBatchUpdateHelperService.onMappingTableSelected("indicator", event, index, file, $scope.batchList); + }); + reader.readAsText(file); + }); + $(document).on("change", ".indicatorDataSourceFileInputField", function () { + // get index of changed field + var index = kommonitorBatchUpdateHelperService.getIndexFromId(this.id); + // get file + var file = this.files[0]; + // read content + var reader = new FileReader(); + reader.addEventListener('load', function () { + kommonitorBatchUpdateHelperService.onDataSourceFileSelected(file, index, $scope.batchList); + }); + reader.readAsText(file); + }); + $scope.$digest(); + }; + $scope.loadIndicatorsBatchList = function () { + $("#indicatorsBatchListFile").files = []; + // trigger file chooser + $("#indicatorsBatchListFile").trigger("click"); + }; + $(document).on("change", "#indicatorsBatchListFile", function () { + // get the file + var file = document.getElementById('indicatorsBatchListFile').files[0]; + kommonitorBatchUpdateHelperService.parseBatchListFromFile("indicator", file, $scope.batchList); + }); + $scope.$on('indicatorBatchListParsed', function (event, data) { + $timeout(function () { + var newBatchList = data.newValue; + // remove all rows + for (var i = 0; i < $scope.batchList.length; i++) + $scope.batchList[i].isSelected = true; + kommonitorBatchUpdateHelperService.deleteSelectedRowsFromBatchList($scope.batchList, $scope.allRowsSelected); + for (let i = 0; i < newBatchList.length; i++) { + kommonitorBatchUpdateHelperService.addNewRowToBatchList("indicator", $scope.batchList); + var row = $scope.batchList[i]; + // isSelected + row.isSelected = newBatchList[i].isSelected; + // name + // The exported batchList does not contain all of the metadata. + // We have to use the indicatorId to select the corresponding select option in the "name" column. + var indicatorId = newBatchList[i].name; + var indicatorObj = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); + row.name = indicatorObj; + // mappingTableName + row.mappingTableName = newBatchList[i].mappingTableName; + // mappingObj + row.mappingObj = newBatchList[i].mappingObj; + // converter parameters to properties + if (row.mappingObj.converter) + row.mappingObj.converter = kommonitorBatchUpdateHelperService.converterParametersArrayToProperties(row.mappingObj.converter); + // dataSource parameters to properties + if (row.mappingObj.dataSource) + row.mappingObj.dataSource = kommonitorBatchUpdateHelperService.dataSourceParametersArrayToProperty(row.mappingObj.dataSource); + // set selectedConverter + if (newBatchList[i].mappingObj.converter.hasOwnProperty("name")) + row.selectedConverter = kommonitorBatchUpdateHelperService.getConverterObjectByName(newBatchList[i].mappingObj.converter.name); + // set selectedDatasourceType + if (newBatchList[i].mappingObj.dataSource.hasOwnProperty("type")) + row.selectedDatasourceType = kommonitorBatchUpdateHelperService.getDatasourceTypeObjectByType(newBatchList[i].mappingObj.dataSource.type); + // set selectedTargetSpatialUnit + if (newBatchList[i].mappingObj.hasOwnProperty("targetSpatialUnitName")) + row.selectedTargetSpatialUnit = kommonitorBatchUpdateHelperService.getSpatialUnitObjectByName(newBatchList[i].mappingObj.targetSpatialUnitName); + } + }); + kommonitorBatchUpdateHelperService.resizeNameColumnDropdowns(null); + }); + /* + // can be used to show only applicable spatial units for current indicator. + $scope.filterApplicableSpatialUnits = function(batchIndex) { + // avSpatialUnits is the list of available spatial units from the kommonitorDataExchangeService + return function (avSpatialUnit) { + // get spatial units for current indicator + let isValidSpatialUnit = false; + if($scope.batchList[batchIndex].name) { + let applicableSpatialUnits = $scope.batchList[batchIndex].name.applicableSpatialUnits; + for(let applicableSpatialUnit of applicableSpatialUnits) { + if(avSpatialUnit.spatialUnitLevel === applicableSpatialUnit.spatialUnitName) { + isValidSpatialUnit = true; + break; + } + } + } else { + return true // don't filter anything if no indicator has been selected yet + } + if(isValidSpatialUnit) + return true; + else + return false; + }; + }; + */ + $rootScope.$on("refreshIndicatorOverviewTableCompleted", function () { + kommonitorBatchUpdateHelperService.refreshNameColumn("indicator", $scope.batchList); + }); + $scope.onTimeseriesMappingBtnClicked = function ($event) { + $("#indicator-edit-time-series-mapping-modal").modal("show", $event.currentTarget); + }; + $scope.onDefaultTimeseriesMappingBtnClicked = function ($event) { + $("#indicator-edit-default-time-series-mapping-modal").modal("show", $event.currentTarget); + }; + $('#indicator-edit-time-series-mapping-modal').on('show.bs.modal', function (event) { + // get indicator for which timeseries mapping was opended + // use it to check the corresponding element in the batch list + if (event.target.id === "indicator-edit-time-series-mapping-modal") { + let index = kommonitorBatchUpdateHelperService.getIndexFromId(event.relatedTarget.id); + $scope.timeseriesMappingModalOpenForIndex = index; + let timeseriesMappingProp = $scope.batchList[index].mappingObj.propertyMapping.timeseriesMappings; + if (timeseriesMappingProp && timeseriesMappingProp.length > 0) + $scope.$broadcast('loadTimeseriesMapping', { mapping: timeseriesMappingProp }); + else + $scope.$broadcast('resetTimeseriesMapping'); + } + }); + $('#indicator-edit-default-time-series-mapping-modal').on('show.bs.modal', function (event) { + if (event.target.id === "indicator-edit-default-time-series-mapping-modal") { + if ($scope.defaultTimeseriesMappingSave.length >= 1) + $scope.$broadcast('loadTimeseriesMapping', { mapping: $scope.defaultTimeseriesMappingSave }); + else + $scope.$broadcast('resetTimeseriesMapping'); + } + }); + // on timeseries mapping modal closed + $('#indicator-edit-time-series-mapping-modal').on('hidden.bs.modal', function (event) { + if (event.target.id === "indicator-edit-time-series-mapping-modal") { + // store timeseries mapping to mappingObj + let index = $scope.timeseriesMappingModalOpenForIndex; + // converting to json and back gets rid of the $$hashkey property + $scope.batchList[index].mappingObj.propertyMapping.timeseriesMappings = angular.fromJson(angular.toJson($scope.timeseriesMappingReference)); + $scope.timeseriesMappingModalOpenForIndex = undefined; + // then reset the modal + //$scope.$broadcast('resetTimeseriesMapping') + } + }); + // on default timeseries mapping modal closed + $('#indicator-edit-default-time-series-mapping-modal').on('hidden.bs.modal', function (event) { + if (event.target.id === "indicator-edit-default-time-series-mapping-modal") { + // store timeseries mapping to mappingObj + $scope.defaultTimeseriesMappingSave = $scope.timeseriesMappingReference; + // then reset the modal + //$scope.$broadcast('resetTimeseriesMapping') + } + }); + $scope.$on("batchUpdateCompleted", function (event, data) { + if (data.resourceType === "indicator") { + $scope.lastUpdateResponseObj = data; + } + }); + $scope.reopenResultModal = function () { + if (typeof $scope.lastUpdateResponseObj !== 'undefined') { + $rootScope.$broadcast("reopenBatchUpdateResultModal", $scope.lastUpdateResponseObj); + } + }; + $rootScope.$on("timeseriesMappingChanged", function (event, data) { + $scope.timeseriesMappingReference = data.mapping; + }); + } + ] +}); +//# sourceMappingURL=indicator-batch-update-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.js.map new file mode 100644 index 000000000..d3a580d15 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-batch-update-modal.component.js","sourceRoot":"","sources":["indicator-batch-update-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.ts new file mode 100644 index 000000000..3b44ecc25 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.component.ts @@ -0,0 +1,279 @@ +angular.module('indicatorBatchUpdateModal').component('indicatorBatchUpdateModal', { + templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', 'kommonitorBatchUpdateHelperService', '$scope', '$rootScope', '$http', '$timeout', '__env', + function IndicatorBatchUpdateModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, kommonitorBatchUpdateHelperService, $scope, $rootScope, $http, $timeout, __env) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorBatchUpdateHelperServiceInstance = kommonitorBatchUpdateHelperService; + + $scope.isFirstStart = true; + $scope.lastUpdateResponseObj; + $scope.timeseriesMappingReference; // gets updated by a broadcast whenever $scope.timeseries mapping in indicatorEditTimeseriesMapping component changes + $scope.selected = { value: kommonitorDataExchangeService.availableIndicators[0] }; + $scope.keepMissingValues = true; + + /* + { + "converter": { + "encoding": "string", + "mimeType": "string", + "name": "string", + "parameters": [{ + "name": "string", + "value": "string" + }], + "schema": "string" + }, + "dataSource": { + "parameters": [{ + "name": "string", + "value": "string" + }], + "type": "FILE" // FILE|HTTP|INLINE + }, + "propertyMapping": { + timeseriesMappings: [ + { + "indicatorValueProperty": "string", + "timestamp": "date" // direct timestamp + }, { + "indicatorValueProperty": "string", + "timestampProperty": "string" // attribute column that contains timestamp(s) + }], + spatialReferenceKeyProperty: "", + keepMissingOrNullValueIndicator: true, + }, + targetSpatialUnitName: "" + } + */ + $scope.batchList = []; + $scope.timeseriesMappingModalOpenForIndex; // temporarily stores for which index of the batch list the timeseries mapping modal is open + $scope.defaultTimeseriesMappingSave = []; + + // on modal opened + $('#modal-batch-update-indicators').on('show.bs.modal', function () { + // this check is necessary to avoid running the initialize method on opening datepicker modals + if(event) { + if(event.target.id === "button-batch-update-indicators") { + $scope.initialize(); + } + } + }); + + + // initializes the modal + $scope.initialize = function() { + + if($scope.isFirstStart) { + kommonitorBatchUpdateHelperService.addNewRowToBatchList("indicator", $scope.batchList) + $scope.isFirstStart = false; + } + + $(document).on("change", ".indicatorMappingTableInputField", function(){ + // get index of changed field + var index = kommonitorBatchUpdateHelperService.getIndexFromId(this.id); + + // get file + var file = this.files[0]; + + // read content + var reader = new FileReader(); + reader.addEventListener('load', function(event) { + kommonitorBatchUpdateHelperService.onMappingTableSelected("indicator", event, index, file, $scope.batchList); + }); + reader.readAsText(file) + }); + + $(document).on("change", ".indicatorDataSourceFileInputField", function(){ + // get index of changed field + var index = kommonitorBatchUpdateHelperService.getIndexFromId(this.id); + + // get file + var file = this.files[0]; + + // read content + var reader = new FileReader(); + reader.addEventListener('load', function() { + kommonitorBatchUpdateHelperService.onDataSourceFileSelected(file, index, $scope.batchList); + }); + reader.readAsText(file) + }); + + $scope.$digest(); + }; + + $scope.loadIndicatorsBatchList = function() { + $("#indicatorsBatchListFile").files = []; + + // trigger file chooser + $("#indicatorsBatchListFile").trigger("click"); + }; + + $(document).on("change", "#indicatorsBatchListFile" ,function(){ + + // get the file + var file = document.getElementById('indicatorsBatchListFile').files[0]; + kommonitorBatchUpdateHelperService.parseBatchListFromFile("indicator", file, $scope.batchList) + }); + + $scope.$on('indicatorBatchListParsed', function(event, data) { + $timeout(function() { + + var newBatchList = data.newValue; + + // remove all rows + for (var i = 0; i < $scope.batchList.length; i++) + $scope.batchList[i].isSelected = true; + kommonitorBatchUpdateHelperService.deleteSelectedRowsFromBatchList($scope.batchList, $scope.allRowsSelected); + + for(let i=0; i 0) + $scope.$broadcast('loadTimeseriesMapping', { mapping: timeseriesMappingProp}); + else + $scope.$broadcast('resetTimeseriesMapping'); + } + + }); + + $('#indicator-edit-default-time-series-mapping-modal').on('show.bs.modal', function (event) { + if(event.target.id === "indicator-edit-default-time-series-mapping-modal") { + if($scope.defaultTimeseriesMappingSave.length >= 1) + $scope.$broadcast('loadTimeseriesMapping', { mapping: $scope.defaultTimeseriesMappingSave }); + else + $scope.$broadcast('resetTimeseriesMapping'); + } + }); + + // on timeseries mapping modal closed + $('#indicator-edit-time-series-mapping-modal').on('hidden.bs.modal', function (event) { + if(event.target.id === "indicator-edit-time-series-mapping-modal") { + // store timeseries mapping to mappingObj + let index = $scope.timeseriesMappingModalOpenForIndex; + // converting to json and back gets rid of the $$hashkey property + $scope.batchList[index].mappingObj.propertyMapping.timeseriesMappings = angular.fromJson(angular.toJson($scope.timeseriesMappingReference)); + $scope.timeseriesMappingModalOpenForIndex = undefined; + // then reset the modal + //$scope.$broadcast('resetTimeseriesMapping') + } + }); + + // on default timeseries mapping modal closed + $('#indicator-edit-default-time-series-mapping-modal').on('hidden.bs.modal', function (event) { + if(event.target.id === "indicator-edit-default-time-series-mapping-modal") { + // store timeseries mapping to mappingObj + $scope.defaultTimeseriesMappingSave = $scope.timeseriesMappingReference; + // then reset the modal + //$scope.$broadcast('resetTimeseriesMapping') + } + }); + + + $scope.$on("batchUpdateCompleted", function(event, data) { + if(data.resourceType === "indicator") { + $scope.lastUpdateResponseObj = data; + } + }); + + + $scope.reopenResultModal = function() { + if (typeof $scope.lastUpdateResponseObj !== 'undefined') { + $rootScope.$broadcast("reopenBatchUpdateResultModal", $scope.lastUpdateResponseObj); + } + } + + $rootScope.$on("timeseriesMappingChanged", function(event, data) { + $scope.timeseriesMappingReference = data.mapping; + }); + + + } +]}); \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.js index 32101fd36..bdbe46f54 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.js @@ -1,20 +1,20 @@ +"use strict"; angular.module('indicatorBatchUpdateModal', ['kommonitorImporterHelper', 'kommonitorBatchUpdateHelper', 'ngSanitize', 'ui.select']); - -angular.module('indicatorBatchUpdateModal').filter('filterIndicators', function() { - return function(indicators, props) { +angular.module('indicatorBatchUpdateModal').filter('filterIndicators', function () { + return function (indicators, props) { // props is an object // properties can be defined when calling the filter, e. g. { indicatorName } - var result = [] + var result = []; var searchTermLower; if (props.hasOwnProperty("indicatorName")) - searchTermLower = props.indicatorName.toLowerCase() + searchTermLower = props.indicatorName.toLowerCase(); else - console.error("Given prarameter 'props' does not have a property named 'indicatorName'.") - - angular.forEach(indicators, function(indicator) { - if(indicator.indicatorName.toLowerCase().includes( searchTermLower ) && indicator.userPermissions.includes("editor")) - result.push(indicator) - }) + console.error("Given prarameter 'props' does not have a property named 'indicatorName'."); + angular.forEach(indicators, function (indicator) { + if (indicator.indicatorName.toLowerCase().includes(searchTermLower) && indicator.userPermissions.includes("editor")) + result.push(indicator); + }); return result; - } -}) \ No newline at end of file + }; +}); +//# sourceMappingURL=indicator-batch-update-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.js.map new file mode 100644 index 000000000..8d1a7b219 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-batch-update-modal.module.js","sourceRoot":"","sources":["indicator-batch-update-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,CAAC,0BAA0B,EAAE,6BAA6B,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;AAEpI,OAAO,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,MAAM,CAAC,kBAAkB,EAAE;IACnE,OAAO,UAAS,UAAU,EAAE,KAAK;QAC7B,qBAAqB;QACrB,6EAA6E;QAC7E,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,eAAe,CAAC;QACpB,IAAI,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;YACrC,eAAe,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,CAAA;;YAEnD,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAA;QAE7F,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,UAAS,SAAS;YAC1C,IAAG,SAAS,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAE,eAAe,CAAE,IAAI,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAChH,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,CAAC;IAClB,CAAC,CAAA;AACL,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.ts new file mode 100644 index 000000000..32101fd36 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorBatchUpdateModal/indicator-batch-update-modal.module.ts @@ -0,0 +1,20 @@ +angular.module('indicatorBatchUpdateModal', ['kommonitorImporterHelper', 'kommonitorBatchUpdateHelper', 'ngSanitize', 'ui.select']); + +angular.module('indicatorBatchUpdateModal').filter('filterIndicators', function() { + return function(indicators, props) { + // props is an object + // properties can be defined when calling the filter, e. g. { indicatorName } + var result = [] + var searchTermLower; + if (props.hasOwnProperty("indicatorName")) + searchTermLower = props.indicatorName.toLowerCase() + else + console.error("Given prarameter 'props' does not have a property named 'indicatorName'.") + + angular.forEach(indicators, function(indicator) { + if(indicator.indicatorName.toLowerCase().includes( searchTermLower ) && indicator.userPermissions.includes("editor")) + result.push(indicator) + }) + return result; + } +}) \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.js index 4c5a862c1..b6a85cad7 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.js @@ -1,431 +1,341 @@ +"use strict"; angular.module('indicatorDeleteModal').component('indicatorDeleteModal', { - templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function IndicatorDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.indicatorDeleteTypes = [{ - "displayName": "Gesamter Datensatz", - "apiName": "indicatorDataset" - }, - { - "displayName": "Einzelne Zeitschnitte", - "apiName": "indicatorTimestamp" - }, - { - "displayName": "Einzelne Raumebenen", - "apiName": "indicatorSpatialUnit" - }]; - $scope.indicatorDeleteType = $scope.indicatorDeleteTypes[0]; - $scope.selectedIndicatorDataset = undefined; - $scope.currentApplicableDates = []; - $scope.selectIndicatorTimestampsInput = false; - $scope.currentApplicableSpatialUnits = []; - $scope.selectIndicatorSpatialUnitsInput = false; - - $scope.loadingData = false; - - $scope.successfullyDeletedDatasets = []; - $scope.successfullyDeletedTimestamps = []; - $scope.successfullyDeletedSpatialUnits = []; - $scope.failedDatasetsAndErrors = []; - $scope.failedTimestampsAndErrors = []; - $scope.failedSpatialUnitsAndErrors = []; - - $scope.affectedScripts = []; - $scope.affectedIndicatorReferences = []; - $scope.affectedGeoresourceReferences = []; - - $scope.onChangeSelectIndicatorTimestampEntries = function(){ - - if(!$scope.selectIndicatorTimestampsInput){ - $scope.selectIndicatorTimestampsInput = true; - } - else{ - $scope.selectIndicatorTimestampsInput = false; - } - - if ($scope.selectIndicatorTimestampsInput){ - $scope.currentApplicableDates.forEach(function(applicableDate){ - applicableDate.isSelected = true; - - }); - } - else{ - $scope.currentApplicableDates.forEach(function(applicableDate){ - applicableDate.isSelected = false; - }); - } - }; - - $scope.onChangeSelectIndicatorSpatialUnitsEntries = function(){ - - if(!$scope.selectIndicatorSpatialUnitsInput){ - $scope.selectIndicatorSpatialUnitsInput = true; - } - else{ - $scope.selectIndicatorSpatialUnitsInput = false; - } - - if ($scope.selectIndicatorSpatialUnitsInput){ - $scope.currentApplicableSpatialUnits.forEach(function(applicableSpatialUnit){ - applicableSpatialUnit.isSelected = true; - - }); - } - else{ - $scope.currentApplicableSpatialUnits.forEach(function(applicableSpatialUnit){ - applicableSpatialUnit.isSelected = false; - }); - } - }; - - $scope.onChangeSelectedIndicator = function(){ - if ($scope.selectedIndicatorDataset){ - - $scope.currentIndicatorId = $scope.selectedIndicatorDataset.indicatorId; - - $scope.successfullyDeletedDatasets = []; - $scope.successfullyDeletedTimestamps = []; - $scope.successfullyDeletedSpatialUnits = []; - $scope.failedDatasetsAndErrors = []; - $scope.failedTimestampsAndErrors = []; - $scope.failedSpatialUnitsAndErrors = []; - - $scope.currentApplicableDates = []; - for (const timestamp of $scope.selectedIndicatorDataset.applicableDates) { - $scope.currentApplicableDates.push({ - "timestamp": timestamp, - "isSelected": false - - }); - } - - $scope.currentApplicableSpatialUnits = []; - for (const spatialUnitMetadata of kommonitorDataExchangeService.availableSpatialUnits) { - if($scope.selectedIndicatorDataset.applicableSpatialUnits && $scope.selectedIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadata.spatialUnitLevel)) - - $scope.currentApplicableSpatialUnits.push({ - "spatialUnitMetadata": spatialUnitMetadata, - "isSelected": false - - }); - } - - $scope.affectedScripts = $scope.gatherAffectedScripts(); - $scope.affectedIndicatorReferences = $scope.gatherAffectedIndicatorReferences(); - $scope.affectedGeoresourceReferences = $scope.gatherAffectedGeoresourceReferences(); - - setTimeout(() => { - // initialize any adminLTE box widgets - $('.box').boxWidget(); - }, 500); - } - }; - - $scope.resetIndicatorsDeleteForm = function(){ - - $scope.selectedIndicatorDataset = undefined; - $scope.currentApplicableDates = []; - $scope.selectIndicatorTimestampsInput = false; - $scope.currentApplicableSpatialUnits = []; - $scope.selectIndicatorSpatialUnitsInput = false; - $scope.indicatorDeleteType = $scope.indicatorDeleteTypes[0]; - - $scope.successfullyDeletedDatasets = []; - $scope.successfullyDeletedTimestamps = []; - $scope.successfullyDeletedSpatialUnits = []; - $scope.failedDatasetsAndErrors = []; - $scope.failedTimestampsAndErrors = []; - $scope.failedSpatialUnitsAndErrors = []; - $scope.affectedScripts = []; - $scope.affectedIndicatorReferences = []; - $scope.affectedGeoresourceReferences = []; - $("#georesourcesDeleteSuccessAlert").hide(); - $("#georesourcesDeleteErrorAlert").hide(); - - - }; - - $scope.gatherAffectedScripts = function(){ - $scope.affectedScripts = []; - - kommonitorDataExchangeService.availableProcessScripts.forEach(function(script){ - var requiredIndicatorIds = script.requiredIndicatorIds; - - for(var i=0; i 0){ - // error handling - $("#indicatorsDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#indicatorsDeleteSuccessAlert").show(); - // } - - $scope.loadingData = false; - } - if($scope.successfullyDeletedTimestamps.length > 0){ - $("#indicatorsDeleteSuccessAlert").show(); - - // refresh overview table - $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorId); - - // refresh all admin dashboard diagrams due to modified metadata - $timeout(function(){ - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - }, 500); - - $scope.loadingData = false; - - // $scope.resetIndicatorsDeleteForm(); - } - - }; - - $scope.deleteSelectedIndicatorSpatialUnits = async function(){ - - // iterate over all appicableSpatialUnits - for (const applicableSpatialUnit of $scope.currentApplicableSpatialUnits) { - if(applicableSpatialUnit.isSelected){ - await $scope.getDeleteSpatialUnitPromise(applicableSpatialUnit); - } - } - - if($scope.failedSpatialUnitsAndErrors.length > 0){ - // error handling - $("#indicatorsDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#indicatorsDeleteSuccessAlert").show(); - // } - - $scope.loadingData = false; - } - if($scope.successfullyDeletedSpatialUnits.length > 0){ - $("#indicatorsDeleteSuccessAlert").show(); - - // fetch indicatorMetada again as a georesource was deleted - await kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - // refresh overview table - $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorId); - - // refresh all admin dashboard diagrams due to modified metadata - $timeout(function(){ - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - }, 500); - - $scope.loadingData = false; - - // $scope.resetIndicatorsDeleteForm(); - } - }; - - $scope.getDeleteTimestampPromise = function(applicableDate, spatialUnitId){ - - // timestamp looks like 2020-12-31 - var timestamp = applicableDate.timestamp; - - // [yyyy, mm, tt] - var timestampComps = timestamp.split("-"); - - return $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.selectedIndicatorDataset.indicatorId + "/" + spatialUnitId + "/" + timestampComps[0] + "/" + timestampComps[1] + "/" + timestampComps[2], - method: "DELETE" - }).then(function successCallback(response) { - if(! $scope.successfullyDeletedTimestamps.includes(applicableDate)){ - $scope.successfullyDeletedTimestamps.push(applicableDate); - } - - }, function errorCallback(error) { - if(error.data){ - $scope.failedTimestampsAndErrors.push([applicableDate, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); - } - else{ - $scope.failedTimestampsAndErrors.push([applicableDate, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); - } - }); - }; - - $scope.getDeleteSpatialUnitPromise = function(applicableSpatialUnit){ - - return $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.selectedIndicatorDataset.indicatorId + "/" + applicableSpatialUnit.spatialUnitMetadata.spatialUnitId, - method: "DELETE" - }).then(function successCallback(response) { - if(! $scope.successfullyDeletedSpatialUnits.includes(applicableSpatialUnit)){ - $scope.successfullyDeletedSpatialUnits.push(applicableSpatialUnit); - } - - }, function errorCallback(error) { - if(error.data){ - $scope.failedSpatialUnitsAndErrors.push([applicableSpatialUnit, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); - } - else{ - $scope.failedSpatialUnitsAndErrors.push([applicableSpatialUnit, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); - } - }); - }; - - $scope.hideSuccessAlert = function(){ - $("#indicatorsDeleteSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#indicatorsDeleteErrorAlert").hide(); - }; - - $scope.getIndicatorsWithPermission = function(){ - let indicators = kommonitorDataExchangeService.availableIndicators.filter(indicator => indicator.userPermissions.includes("creator")); - return indicators; - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function IndicatorDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.indicatorDeleteTypes = [{ + "displayName": "Gesamter Datensatz", + "apiName": "indicatorDataset" + }, + { + "displayName": "Einzelne Zeitschnitte", + "apiName": "indicatorTimestamp" + }, + { + "displayName": "Einzelne Raumebenen", + "apiName": "indicatorSpatialUnit" + }]; + $scope.indicatorDeleteType = $scope.indicatorDeleteTypes[0]; + $scope.selectedIndicatorDataset = undefined; + $scope.currentApplicableDates = []; + $scope.selectIndicatorTimestampsInput = false; + $scope.currentApplicableSpatialUnits = []; + $scope.selectIndicatorSpatialUnitsInput = false; + $scope.loadingData = false; + $scope.successfullyDeletedDatasets = []; + $scope.successfullyDeletedTimestamps = []; + $scope.successfullyDeletedSpatialUnits = []; + $scope.failedDatasetsAndErrors = []; + $scope.failedTimestampsAndErrors = []; + $scope.failedSpatialUnitsAndErrors = []; + $scope.affectedScripts = []; + $scope.affectedIndicatorReferences = []; + $scope.affectedGeoresourceReferences = []; + $scope.onChangeSelectIndicatorTimestampEntries = function () { + if (!$scope.selectIndicatorTimestampsInput) { + $scope.selectIndicatorTimestampsInput = true; + } + else { + $scope.selectIndicatorTimestampsInput = false; + } + if ($scope.selectIndicatorTimestampsInput) { + $scope.currentApplicableDates.forEach(function (applicableDate) { + applicableDate.isSelected = true; + }); + } + else { + $scope.currentApplicableDates.forEach(function (applicableDate) { + applicableDate.isSelected = false; + }); + } + }; + $scope.onChangeSelectIndicatorSpatialUnitsEntries = function () { + if (!$scope.selectIndicatorSpatialUnitsInput) { + $scope.selectIndicatorSpatialUnitsInput = true; + } + else { + $scope.selectIndicatorSpatialUnitsInput = false; + } + if ($scope.selectIndicatorSpatialUnitsInput) { + $scope.currentApplicableSpatialUnits.forEach(function (applicableSpatialUnit) { + applicableSpatialUnit.isSelected = true; + }); + } + else { + $scope.currentApplicableSpatialUnits.forEach(function (applicableSpatialUnit) { + applicableSpatialUnit.isSelected = false; + }); + } + }; + $scope.onChangeSelectedIndicator = function () { + if ($scope.selectedIndicatorDataset) { + $scope.currentIndicatorId = $scope.selectedIndicatorDataset.indicatorId; + $scope.successfullyDeletedDatasets = []; + $scope.successfullyDeletedTimestamps = []; + $scope.successfullyDeletedSpatialUnits = []; + $scope.failedDatasetsAndErrors = []; + $scope.failedTimestampsAndErrors = []; + $scope.failedSpatialUnitsAndErrors = []; + $scope.currentApplicableDates = []; + for (const timestamp of $scope.selectedIndicatorDataset.applicableDates) { + $scope.currentApplicableDates.push({ + "timestamp": timestamp, + "isSelected": false + }); + } + $scope.currentApplicableSpatialUnits = []; + for (const spatialUnitMetadata of kommonitorDataExchangeService.availableSpatialUnits) { + if ($scope.selectedIndicatorDataset.applicableSpatialUnits && $scope.selectedIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadata.spatialUnitLevel)) + $scope.currentApplicableSpatialUnits.push({ + "spatialUnitMetadata": spatialUnitMetadata, + "isSelected": false + }); + } + $scope.affectedScripts = $scope.gatherAffectedScripts(); + $scope.affectedIndicatorReferences = $scope.gatherAffectedIndicatorReferences(); + $scope.affectedGeoresourceReferences = $scope.gatherAffectedGeoresourceReferences(); + setTimeout(() => { + // initialize any adminLTE box widgets + $('.box').boxWidget(); + }, 500); + } + }; + $scope.resetIndicatorsDeleteForm = function () { + $scope.selectedIndicatorDataset = undefined; + $scope.currentApplicableDates = []; + $scope.selectIndicatorTimestampsInput = false; + $scope.currentApplicableSpatialUnits = []; + $scope.selectIndicatorSpatialUnitsInput = false; + $scope.indicatorDeleteType = $scope.indicatorDeleteTypes[0]; + $scope.successfullyDeletedDatasets = []; + $scope.successfullyDeletedTimestamps = []; + $scope.successfullyDeletedSpatialUnits = []; + $scope.failedDatasetsAndErrors = []; + $scope.failedTimestampsAndErrors = []; + $scope.failedSpatialUnitsAndErrors = []; + $scope.affectedScripts = []; + $scope.affectedIndicatorReferences = []; + $scope.affectedGeoresourceReferences = []; + $("#georesourcesDeleteSuccessAlert").hide(); + $("#georesourcesDeleteErrorAlert").hide(); + }; + $scope.gatherAffectedScripts = function () { + $scope.affectedScripts = []; + kommonitorDataExchangeService.availableProcessScripts.forEach(function (script) { + var requiredIndicatorIds = script.requiredIndicatorIds; + for (var i = 0; i < requiredIndicatorIds.length; i++) { + var indicatorId = requiredIndicatorIds[i]; + if (indicatorId === $scope.selectedIndicatorDataset.indicatorId) { + $scope.affectedScripts.push(script); + break; + } + } + }); + return $scope.affectedScripts; + }; + $scope.gatherAffectedGeoresourceReferences = function () { + $scope.affectedGeoresourceReferences = []; + var georesourceReferences = $scope.selectedIndicatorDataset.referencedGeoresources; + for (var i = 0; i < georesourceReferences.length; i++) { + var georesourceReference = georesourceReferences[i]; + $scope.affectedGeoresourceReferences.push({ + "indicatorMetadata": $scope.selectedIndicatorDataset, + "georesourceReference": georesourceReference + }); + } + return $scope.affectedGeoresourceReferences; + }; + $scope.gatherAffectedIndicatorReferences = function () { + $scope.affectedIndicatorReferences = []; + // first add all direct references from selected indicator + var indicatorReferences_selectedIndicator = $scope.selectedIndicatorDataset.referencedIndicators; + for (var i = 0; i < indicatorReferences_selectedIndicator.length; i++) { + var indicatorReference_selectedIndicator = indicatorReferences_selectedIndicator[i]; + $scope.affectedIndicatorReferences.push({ + "indicatorMetadata": $scope.selectedIndicatorDataset, + "indicatorReference": indicatorReference_selectedIndicator + }); + } + // then add all references, where selected indicator is the referencedIndicator + kommonitorDataExchangeService.availableIndicators.forEach(function (indicator) { + var indicatorReferences = indicator.referencedIndicators; + for (var i = 0; i < indicatorReferences.length; i++) { + var indicatorReference = indicatorReferences[i]; + if (indicatorReference.referencedIndicatorId === $scope.selectedIndicatorDataset.indicatorId) { + $scope.affectedIndicatorReferences.push({ + "indicatorMetadata": $scope.selectedIndicatorDataset, + "indicatorReference": indicatorReference + }); + } + } + }); + return $scope.affectedIndicatorReferences; + }; + $scope.deleteIndicatorData = function () { + $scope.loadingData = true; + $scope.successfullyDeletedDatasets = []; + $scope.successfullyDeletedTimestamps = []; + $scope.successfullyDeletedSpatialUnits = []; + $scope.failedDatasetsAndErrors = []; + $scope.failedTimestampsAndErrors = []; + $scope.failedSpatialUnitsAndErrors = []; + // depending on deleteType we must execute different DELETE requests + if ($scope.indicatorDeleteType.apiName === "indicatorDataset") { + // delete complete dataset + $scope.deleteWholeIndicatorDataset(); + } + else if ($scope.indicatorDeleteType.apiName === "indicatorTimestamp") { + // delete all selected timestamps from indicator + $scope.deleteSelectedIndicatorTimestamps(); + } + else if ($scope.indicatorDeleteType.apiName === "indicatorSpatialUnit") { + // delete all selected spatial units from indicator + $scope.deleteSelectedIndicatorSpatialUnits(); + } + }; + $scope.deleteWholeIndicatorDataset = function () { + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.selectedIndicatorDataset.indicatorId, + method: "DELETE" + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.successfullyDeletedDatasets.push($scope.selectedIndicatorDataset); + // fetch indicatorMetada again as a indicator was deleted + $rootScope.$broadcast("refreshIndicatorOverviewTable", "delete", $scope.currentIndicatorId); + $timeout(function () { + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + $("#indicatorsDeleteSuccessAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // $scope.resetIndicatorsDeleteForm(); + }, function errorCallback(error) { + if (error.data) { + $scope.failedDatasetsAndErrors.push([$scope.selectedIndicatorDataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedDatasetsAndErrors.push([$scope.selectedIndicatorDataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + $("#indicatorsDeleteErrorAlert").show(); + $scope.loadingData = false; + // setTimeout(function() { + // $("#indicatorEditMetadataSuccessAlert").hide(); + // }, 3000); + }); + }; + $scope.deleteSelectedIndicatorTimestamps = async function () { + // iterate over all appicableSpatialUnits and selected applicableDates + for (const applicableDate of $scope.currentApplicableDates) { + if (applicableDate.isSelected) { + for (const applicableSpatialUnit of $scope.currentApplicableSpatialUnits) { + await $scope.getDeleteTimestampPromise(applicableDate, applicableSpatialUnit.spatialUnitMetadata.spatialUnitId); + } + } + } + if ($scope.failedTimestampsAndErrors.length > 0) { + // error handling + $("#indicatorsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#indicatorsDeleteSuccessAlert").show(); + // } + $scope.loadingData = false; + } + if ($scope.successfullyDeletedTimestamps.length > 0) { + $("#indicatorsDeleteSuccessAlert").show(); + // refresh overview table + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorId); + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function () { + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + $scope.loadingData = false; + // $scope.resetIndicatorsDeleteForm(); + } + }; + $scope.deleteSelectedIndicatorSpatialUnits = async function () { + // iterate over all appicableSpatialUnits + for (const applicableSpatialUnit of $scope.currentApplicableSpatialUnits) { + if (applicableSpatialUnit.isSelected) { + await $scope.getDeleteSpatialUnitPromise(applicableSpatialUnit); + } + } + if ($scope.failedSpatialUnitsAndErrors.length > 0) { + // error handling + $("#indicatorsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#indicatorsDeleteSuccessAlert").show(); + // } + $scope.loadingData = false; + } + if ($scope.successfullyDeletedSpatialUnits.length > 0) { + $("#indicatorsDeleteSuccessAlert").show(); + // fetch indicatorMetada again as a georesource was deleted + await kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + // refresh overview table + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorId); + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function () { + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + $scope.loadingData = false; + // $scope.resetIndicatorsDeleteForm(); + } + }; + $scope.getDeleteTimestampPromise = function (applicableDate, spatialUnitId) { + // timestamp looks like 2020-12-31 + var timestamp = applicableDate.timestamp; + // [yyyy, mm, tt] + var timestampComps = timestamp.split("-"); + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.selectedIndicatorDataset.indicatorId + "/" + spatialUnitId + "/" + timestampComps[0] + "/" + timestampComps[1] + "/" + timestampComps[2], + method: "DELETE" + }).then(function successCallback(response) { + if (!$scope.successfullyDeletedTimestamps.includes(applicableDate)) { + $scope.successfullyDeletedTimestamps.push(applicableDate); + } + }, function errorCallback(error) { + if (error.data) { + $scope.failedTimestampsAndErrors.push([applicableDate, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedTimestampsAndErrors.push([applicableDate, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + $scope.getDeleteSpatialUnitPromise = function (applicableSpatialUnit) { + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.selectedIndicatorDataset.indicatorId + "/" + applicableSpatialUnit.spatialUnitMetadata.spatialUnitId, + method: "DELETE" + }).then(function successCallback(response) { + if (!$scope.successfullyDeletedSpatialUnits.includes(applicableSpatialUnit)) { + $scope.successfullyDeletedSpatialUnits.push(applicableSpatialUnit); + } + }, function errorCallback(error) { + if (error.data) { + $scope.failedSpatialUnitsAndErrors.push([applicableSpatialUnit, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedSpatialUnitsAndErrors.push([applicableSpatialUnit, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + $scope.hideSuccessAlert = function () { + $("#indicatorsDeleteSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#indicatorsDeleteErrorAlert").hide(); + }; + $scope.getIndicatorsWithPermission = function () { + let indicators = kommonitorDataExchangeService.availableIndicators.filter(indicator => indicator.userPermissions.includes("creator")); + return indicators; + }; + } + ] +}); +//# sourceMappingURL=indicator-delete-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.js.map new file mode 100644 index 000000000..829d45a94 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-delete-modal.component.js","sourceRoot":"","sources":["indicator-delete-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.ts new file mode 100644 index 000000000..4c5a862c1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.component.ts @@ -0,0 +1,431 @@ +angular.module('indicatorDeleteModal').component('indicatorDeleteModal', { + templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function IndicatorDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.indicatorDeleteTypes = [{ + "displayName": "Gesamter Datensatz", + "apiName": "indicatorDataset" + }, + { + "displayName": "Einzelne Zeitschnitte", + "apiName": "indicatorTimestamp" + }, + { + "displayName": "Einzelne Raumebenen", + "apiName": "indicatorSpatialUnit" + }]; + $scope.indicatorDeleteType = $scope.indicatorDeleteTypes[0]; + $scope.selectedIndicatorDataset = undefined; + $scope.currentApplicableDates = []; + $scope.selectIndicatorTimestampsInput = false; + $scope.currentApplicableSpatialUnits = []; + $scope.selectIndicatorSpatialUnitsInput = false; + + $scope.loadingData = false; + + $scope.successfullyDeletedDatasets = []; + $scope.successfullyDeletedTimestamps = []; + $scope.successfullyDeletedSpatialUnits = []; + $scope.failedDatasetsAndErrors = []; + $scope.failedTimestampsAndErrors = []; + $scope.failedSpatialUnitsAndErrors = []; + + $scope.affectedScripts = []; + $scope.affectedIndicatorReferences = []; + $scope.affectedGeoresourceReferences = []; + + $scope.onChangeSelectIndicatorTimestampEntries = function(){ + + if(!$scope.selectIndicatorTimestampsInput){ + $scope.selectIndicatorTimestampsInput = true; + } + else{ + $scope.selectIndicatorTimestampsInput = false; + } + + if ($scope.selectIndicatorTimestampsInput){ + $scope.currentApplicableDates.forEach(function(applicableDate){ + applicableDate.isSelected = true; + + }); + } + else{ + $scope.currentApplicableDates.forEach(function(applicableDate){ + applicableDate.isSelected = false; + }); + } + }; + + $scope.onChangeSelectIndicatorSpatialUnitsEntries = function(){ + + if(!$scope.selectIndicatorSpatialUnitsInput){ + $scope.selectIndicatorSpatialUnitsInput = true; + } + else{ + $scope.selectIndicatorSpatialUnitsInput = false; + } + + if ($scope.selectIndicatorSpatialUnitsInput){ + $scope.currentApplicableSpatialUnits.forEach(function(applicableSpatialUnit){ + applicableSpatialUnit.isSelected = true; + + }); + } + else{ + $scope.currentApplicableSpatialUnits.forEach(function(applicableSpatialUnit){ + applicableSpatialUnit.isSelected = false; + }); + } + }; + + $scope.onChangeSelectedIndicator = function(){ + if ($scope.selectedIndicatorDataset){ + + $scope.currentIndicatorId = $scope.selectedIndicatorDataset.indicatorId; + + $scope.successfullyDeletedDatasets = []; + $scope.successfullyDeletedTimestamps = []; + $scope.successfullyDeletedSpatialUnits = []; + $scope.failedDatasetsAndErrors = []; + $scope.failedTimestampsAndErrors = []; + $scope.failedSpatialUnitsAndErrors = []; + + $scope.currentApplicableDates = []; + for (const timestamp of $scope.selectedIndicatorDataset.applicableDates) { + $scope.currentApplicableDates.push({ + "timestamp": timestamp, + "isSelected": false + + }); + } + + $scope.currentApplicableSpatialUnits = []; + for (const spatialUnitMetadata of kommonitorDataExchangeService.availableSpatialUnits) { + if($scope.selectedIndicatorDataset.applicableSpatialUnits && $scope.selectedIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadata.spatialUnitLevel)) + + $scope.currentApplicableSpatialUnits.push({ + "spatialUnitMetadata": spatialUnitMetadata, + "isSelected": false + + }); + } + + $scope.affectedScripts = $scope.gatherAffectedScripts(); + $scope.affectedIndicatorReferences = $scope.gatherAffectedIndicatorReferences(); + $scope.affectedGeoresourceReferences = $scope.gatherAffectedGeoresourceReferences(); + + setTimeout(() => { + // initialize any adminLTE box widgets + $('.box').boxWidget(); + }, 500); + } + }; + + $scope.resetIndicatorsDeleteForm = function(){ + + $scope.selectedIndicatorDataset = undefined; + $scope.currentApplicableDates = []; + $scope.selectIndicatorTimestampsInput = false; + $scope.currentApplicableSpatialUnits = []; + $scope.selectIndicatorSpatialUnitsInput = false; + $scope.indicatorDeleteType = $scope.indicatorDeleteTypes[0]; + + $scope.successfullyDeletedDatasets = []; + $scope.successfullyDeletedTimestamps = []; + $scope.successfullyDeletedSpatialUnits = []; + $scope.failedDatasetsAndErrors = []; + $scope.failedTimestampsAndErrors = []; + $scope.failedSpatialUnitsAndErrors = []; + $scope.affectedScripts = []; + $scope.affectedIndicatorReferences = []; + $scope.affectedGeoresourceReferences = []; + $("#georesourcesDeleteSuccessAlert").hide(); + $("#georesourcesDeleteErrorAlert").hide(); + + + }; + + $scope.gatherAffectedScripts = function(){ + $scope.affectedScripts = []; + + kommonitorDataExchangeService.availableProcessScripts.forEach(function(script){ + var requiredIndicatorIds = script.requiredIndicatorIds; + + for(var i=0; i 0){ + // error handling + $("#indicatorsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#indicatorsDeleteSuccessAlert").show(); + // } + + $scope.loadingData = false; + } + if($scope.successfullyDeletedTimestamps.length > 0){ + $("#indicatorsDeleteSuccessAlert").show(); + + // refresh overview table + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorId); + + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function(){ + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + + $scope.loadingData = false; + + // $scope.resetIndicatorsDeleteForm(); + } + + }; + + $scope.deleteSelectedIndicatorSpatialUnits = async function(){ + + // iterate over all appicableSpatialUnits + for (const applicableSpatialUnit of $scope.currentApplicableSpatialUnits) { + if(applicableSpatialUnit.isSelected){ + await $scope.getDeleteSpatialUnitPromise(applicableSpatialUnit); + } + } + + if($scope.failedSpatialUnitsAndErrors.length > 0){ + // error handling + $("#indicatorsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#indicatorsDeleteSuccessAlert").show(); + // } + + $scope.loadingData = false; + } + if($scope.successfullyDeletedSpatialUnits.length > 0){ + $("#indicatorsDeleteSuccessAlert").show(); + + // fetch indicatorMetada again as a georesource was deleted + await kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + // refresh overview table + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorId); + + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function(){ + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + + $scope.loadingData = false; + + // $scope.resetIndicatorsDeleteForm(); + } + }; + + $scope.getDeleteTimestampPromise = function(applicableDate, spatialUnitId){ + + // timestamp looks like 2020-12-31 + var timestamp = applicableDate.timestamp; + + // [yyyy, mm, tt] + var timestampComps = timestamp.split("-"); + + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.selectedIndicatorDataset.indicatorId + "/" + spatialUnitId + "/" + timestampComps[0] + "/" + timestampComps[1] + "/" + timestampComps[2], + method: "DELETE" + }).then(function successCallback(response) { + if(! $scope.successfullyDeletedTimestamps.includes(applicableDate)){ + $scope.successfullyDeletedTimestamps.push(applicableDate); + } + + }, function errorCallback(error) { + if(error.data){ + $scope.failedTimestampsAndErrors.push([applicableDate, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else{ + $scope.failedTimestampsAndErrors.push([applicableDate, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + + $scope.getDeleteSpatialUnitPromise = function(applicableSpatialUnit){ + + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.selectedIndicatorDataset.indicatorId + "/" + applicableSpatialUnit.spatialUnitMetadata.spatialUnitId, + method: "DELETE" + }).then(function successCallback(response) { + if(! $scope.successfullyDeletedSpatialUnits.includes(applicableSpatialUnit)){ + $scope.successfullyDeletedSpatialUnits.push(applicableSpatialUnit); + } + + }, function errorCallback(error) { + if(error.data){ + $scope.failedSpatialUnitsAndErrors.push([applicableSpatialUnit, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else{ + $scope.failedSpatialUnitsAndErrors.push([applicableSpatialUnit, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + + $scope.hideSuccessAlert = function(){ + $("#indicatorsDeleteSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#indicatorsDeleteErrorAlert").hide(); + }; + + $scope.getIndicatorsWithPermission = function(){ + let indicators = kommonitorDataExchangeService.availableIndicators.filter(indicator => indicator.userPermissions.includes("creator")); + return indicators; + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.js index f88d6d4ed..eee06ea97 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('indicatorDeleteModal', []); +//# sourceMappingURL=indicator-delete-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.js.map new file mode 100644 index 000000000..c66a2dd2a --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-delete-modal.module.js","sourceRoot":"","sources":["indicator-delete-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.ts new file mode 100644 index 000000000..f88d6d4ed --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorDeleteModal/indicator-delete-modal.module.ts @@ -0,0 +1 @@ +angular.module('indicatorDeleteModal', []); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.js index 14c69d353..51f0c3abc 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.js @@ -1,718 +1,551 @@ +"use strict"; angular.module('indicatorEditFeaturesModal').component('indicatorEditFeaturesModal', { - templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorImporterHelperService', - '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', - function IndicatorEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, - kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; - - /* PUT BODY - { - "indicatorValues": [ - { - "spatialReferenceKey": "spatialReferenceKey", - "valueMapping": [ - { - "indicatorValue": 0.8008282, - "timestamp": "2000-01-23" - }, - { - "indicatorValue": 0.8008282, - "timestamp": "2000-01-23" - } - ] - }, - { - "spatialReferenceKey": "spatialReferenceKey", - "valueMapping": [ - { - "indicatorValue": 0.8008282, - "timestamp": "2000-01-23" - }, - { - "indicatorValue": 0.8008282, - "timestamp": "2000-01-23" - } - ] - } - ], - "applicableSpatialUnit": "applicableSpatialUnit", - "allowedRoles": [ - - ] - "defaultClassificationMapping": { - "colorBrewerSchemeName": "colorBrewerSchemeName", - "items": [ - { - "defaultCustomRating": "defaultCustomRating", - "defaultColorAsHex": "defaultColorAsHex" - }, - { - "defaultCustomRating": "defaultCustomRating", - "defaultColorAsHex": "defaultColorAsHex" - } - ] - } - } - */ - - - - $scope.roleManagementTableOptions = undefined; - - $scope.$on("availableRolesUpdate", function (event) { - refreshRoles(); - }); - - // make sure that initial fetching of availableRoles has happened - $scope.$on("initialMetadataLoadingCompleted", function (event) { - refreshRoles(); - }); - - function refreshRoles() { - let allowedRoles = $scope.targetApplicableSpatialUnit ? $scope.targetApplicableSpatialUnit.allowedRoles : []; - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); - } - - $scope.indicatorFeaturesJSON; - $scope.currentIndicatorDataset; - $scope.targetApplicableSpatialUnit; - $scope.remainingFeatureHeaders; - - $scope.indicatorMappingConfigImportError; - $scope.indicatorsEditFeaturesMappingConfigPre = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure_indicator); - - - $scope.overviewTableTargetSpatialUnitMetadata = undefined; - - $scope.spatialUnitRefKeyProperty = undefined; - $scope.targetSpatialUnitMetadata = undefined; - - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.mimeType = undefined; - $scope.datasourceType = undefined; - $scope.indicatorDataSourceIdProperty = undefined; - $scope.indicatorDataSourceNameProperty = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.putBody_indicators = undefined; - - $scope.keepMissingValues = true; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.importerErrors = undefined; - - $scope.loadingData = false; - - $scope.timeseriesMappingReference; // gets updated by a broadcast whenever $scope.timeseries mapping in indicatorEditTimeseriesMapping component changes - - $scope.$on("onEditIndicatorFeatures", function (event, indicatorDataset) { - kommonitorMultiStepFormHelperService.registerClickHandler(); - if($scope.currentIndicatorDataset && $scope.currentIndicatorDataset.indicatorId === indicatorDataset.indicatorId){ - return; - } - else{ - $scope.currentIndicatorDataset = indicatorDataset; - - // $scope.refreshIndicatorEditFeaturesOverviewTable(); - - $scope.resetIndicatorEditFeaturesForm(); - - kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", [], []); - - } - - }); - - // called if indicator was edited - then we must make sure that the view is refreshed - // i.e. if a new spatial unit was setup the first time via edit menu, then we must ensure that this new spatial unit is actually - // visible within features overview table dropdown - $rootScope.$on("refreshIndicatorOverviewTableCompleted", function() { - if($scope.currentIndicatorDataset){ - $scope.currentIndicatorDataset = kommonitorDataExchangeService.getIndicatorMetadataById($scope.currentIndicatorDataset.indicatorId); - - $scope.$digest(); - } - - }); - - $scope.filterOverviewTargetSpatialUnits = function(){ - return function( spatialUnitMetadata ) { - if($scope.currentIndicatorDataset){ - var isIncluded = $scope.currentIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadata.spatialUnitLevel); - return isIncluded; - } - }; - }; - - $scope.refreshIndicatorEditFeaturesOverviewTable = function(){ - - $scope.loadingData = true; - // fetch all indicator features - $http({ - url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId + "/without-geometry", - method: "GET", - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $scope.indicatorFeaturesJSON = response.data; - - var tmpRemainingHeaders = []; - - for (var property in $scope.indicatorFeaturesJSON[0]){ - // only show indicator date columns as editable fields - // since we fetch the database view (with joined spatial unit), any additional information from the spatial unit must be filtered out - if (property.includes(__env.indicatorDatePrefix)){ - tmpRemainingHeaders.push(property); - } - } - - //sort date headers - tmpRemainingHeaders.sort((a, b) => a.localeCompare(b)); - - $scope.remainingFeatureHeaders = tmpRemainingHeaders; - kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", tmpRemainingHeaders, $scope.indicatorFeaturesJSON, $scope.currentIndicatorDataset.indicatorId, kommonitorDataGridHelperService.resourceType_indicator, $scope.enableDeleteFeatures, $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId); - - - $scope.loadingData = false; - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#indicatorEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - }); - }; - - $scope.clearAllIndicatorFeatures = function(){ - $scope.loadingData = true; - // delete all indicator features for target spatial unit - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId, - method: "DELETE", - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $scope.indicatorFeaturesJSON = undefined; - $scope.remainingFeatureHeaders = undefined; - - $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); - // $scope.refreshIndicatorEditFeaturesOverviewTable(); - // force empty feature overview table on successful deletion of entries - kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", [], []); - - $scope.successMessagePart = $scope.currentIndicatorDataset.indicatorName; - - $("#indicatorEditFeaturesSuccessAlert").show(); - $scope.loadingData = false; - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#indicatorEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - }); - }; - - $scope.resetIndicatorEditFeaturesForm = function(){ - - // reset edit banners - kommonitorDataGridHelperService.featureTable_indicator_lastUpdate_timestamp_success = undefined; - kommonitorDataGridHelperService.featureTable_indicator_lastUpdate_timestamp_failure = undefined; - - $scope.indicatorFeaturesJSON = undefined; - $scope.remainingFeatureHeaders = undefined; - - $scope.overviewTableTargetSpatialUnitMetadata = undefined; - for (const spatialUnitMetadataEntry of kommonitorDataExchangeService.availableSpatialUnits) { - if($scope.currentIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadataEntry.spatialUnitLevel)){ - $scope.overviewTableTargetSpatialUnitMetadata = spatialUnitMetadataEntry; - break; - } - } - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); - - $scope.spatialUnitRefKeyProperty = undefined; - $scope.targetSpatialUnitMetadata = undefined; - $scope.targetApplicableSpatialUnit = undefined; - - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.mimeType = undefined; - $scope.datasourceType = undefined; - $scope.indicatorDataSourceIdProperty = undefined; - $scope.indicatorDataSourceNameProperty = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.putBody_indicators = undefined; - - $scope.keepMissingValues = true; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - $scope.indicatorDataSourceIdProperty = undefined; - $scope.indicatorDataSourceNameProperty = undefined; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.importerErrors = undefined; - - $rootScope.$broadcast('resetTimeseriesMapping') - - $("#indicatorEditFeaturesSuccessAlert").hide(); - $("#indicatorEditFeaturesErrorAlert").hide(); - - setTimeout(() => { - $scope.$digest(); - }, 250); - - }; - - $scope.onChangeSelectedSpatialUnit = function(targetSpatialUnitMetadata){ - - var applicableSpatialUnits = $scope.currentIndicatorDataset.applicableSpatialUnits; - - for (const applicableSpatialUnit of applicableSpatialUnits) { - if (applicableSpatialUnit.spatialUnitId === targetSpatialUnitMetadata.spatialUnitId){ - $scope.targetApplicableSpatialUnit = applicableSpatialUnit; - break; - } - } - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); - - }; - - $scope.onChangeConverter = function(){ - $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; - $scope.mimeType = $scope.converter.mimeTypes[0]; - }; - - $scope.onChangeMimeType = function(mimeType){ - $scope.mimeType = mimeType; - }; - - $scope.filterByKomMonitorProperties = function() { - return function( item ) { - - try{ - if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate"){ - return false; - } - return true; - } - catch(error){ - return false; - } - }; - }; - - - - - $scope.getFeatureId = function(jsonFeature){ - return jsonFeature[__env.FEATURE_ID_PROPERTY_NAME]; - }; - - $scope.getFeatureName = function(jsonFeature){ - return jsonFeature[__env.FEATURE_NAME_PROPERTY_NAME]; - }; - - - $scope.buildImporterObjects = async function(){ - $scope.converterDefinition = $scope.buildConverterDefinition(); - $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - - var scopeProperties = { - "targetSpatialUnitMetadata": { - "spatialUnitLevel": $scope.targetSpatialUnitMetadata.spatialUnitLevel, - }, - "currentIndicatorDataset": { - "defaultClassificationMapping": $scope.currentIndicatorDataset.defaultClassificationMapping - }, - "allowedRoles": roleIds - } - $scope.putBody_indicators = kommonitorImporterHelperService.buildPutBody_indicators(scopeProperties); - - if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_indicators){ - return false; - } - - return true; - }; - - $scope.buildConverterDefinition = function(){ - - return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_indicatorEditFeatures_", $scope.schema, $scope.mimeType); - }; - - $scope.buildDatasourceTypeDefinition = async function(){ - try { - return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_indicatorEditFeatures_', 'indicatorDataSourceInput_editFeatures'); - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#indicatorEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - return null; - } - }; - - $scope.buildPropertyMappingDefinition = function(){ - // arsion from is undefined currently - let timeseriesMappingForImporter = []; - timeseriesMappingForImporter = $scope.timeseriesMappingReference; - console.log("timeseriesMappingForImporter: ", timeseriesMappingForImporter); - return kommonitorImporterHelperService.buildPropertyMapping_indicatorResource($scope.spatialUnitRefKeyProperty, timeseriesMappingForImporter, $scope.keepMissingValues); - }; - - - - - $scope.editIndicatorFeatures = async function(){ - - $timeout(function(){ - $scope.loadingData = true; - }); - - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - /* - now collect data and build request for importer - */ - - /* - if any required importer data is missing --> cancel request and highlight required errors - */ - var allDataSpecified = await $scope.buildImporterObjects(); - - if (!allDataSpecified) { - - $("#spatialUnitEditFeaturesForm").validator("update"); - $("#spatialUnitEditFeaturesForm").validator("validate"); - return; - } - else { - - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - var updateIndicatorResponse_dryRun = undefined; - try { - updateIndicatorResponse_dryRun = await kommonitorImporterHelperService.updateIndicator($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentIndicatorDataset.indicatorId, $scope.putBody_indicators, true); - - // this callback will be called asynchronously - // when the response is available - - if(! kommonitorImporterHelperService.importerResponseContainsErrors(updateIndicatorResponse_dryRun)){ - // all good, really execute the request to import data against data management API - var updateIndicatorResponse = await kommonitorImporterHelperService.updateIndicator($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentIndicatorDataset.indicatorId, $scope.putBody_indicators, false); - - $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); - // $scope.refreshIndicatorEditFeaturesOverviewTable(); - - $scope.successMessagePart = $scope.currentIndicatorDataset.indicatorName; - $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateIndicatorResponse); - - $("#indicatorEditFeaturesSuccessAlert").show(); - $scope.loadingData = false; - } - else{ - // errors ocurred - // show them - $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateIndicatorResponse_dryRun); - - $("#indicatorEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - - } - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - if(updateIndicatorResponse_dryRun){ - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateIndicatorResponse_dryRun); - } - - $("#indicatorEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - } - }; - - $scope.onImportIndicatorEditFeaturesMappingConfig = function(){ - - $scope.indicatorMappingConfigImportError = ""; - - $("#indicatorMappingConfigEditFeaturesImportFile").files = []; - - // trigger file chooser - $("#indicatorMappingConfigEditFeaturesImportFile").click(); - - }; - - $(document).on("change", "#indicatorMappingConfigEditFeaturesImportFile" ,function(){ - - console.log("Importing Importer Mapping Config for EditFeatures Indicator Form"); - - // get the file - var file = document.getElementById('indicatorMappingConfigEditFeaturesImportFile').files[0]; - $scope.parseMappingConfigFromFile(file); - }); - - $scope.parseMappingConfigFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMappingConfigFile(event); - } - catch(error){ - console.error(error); - console.error("Uploaded MappingConfig File cannot be parsed."); - $scope.indicatorMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; - document.getElementById("indicatorsEditFeaturesMappingConfigPre").innerHTML = $scope.indicatorMappingConfigStructure_pretty; - $("#indicatorEditFeaturesMappingConfigImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMappingConfigFile = function(event){ - $scope.mappingConfigImportSettings = JSON.parse(event.target.result); - - if(! $scope.mappingConfigImportSettings.converter || ! $scope.mappingConfigImportSettings.dataSource || ! $scope.mappingConfigImportSettings.propertyMapping){ - console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); - $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("indicatorsEditFeaturesMappingConfigPre").innerHTML = $scope.indicatorMappingConfigStructure_pretty; - $("#indicatorEditFeaturesMappingConfigImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.converter = undefined; - for(var converter of kommonitorImporterHelperService.availableConverters){ - if (converter.name === $scope.mappingConfigImportSettings.converter.name){ - $scope.converter = converter; - break; - } - } - - $scope.schema = undefined; - if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema){ - for (var schema of $scope.converter.schemas) { - if (schema === $scope.mappingConfigImportSettings.converter.schema){ - $scope.schema = schema; - } - } - } - - $scope.mimeType = undefined; - if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType){ - for (var mimeType of $scope.converter.mimeTypes) { - if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType){ - $scope.mimeType = mimeType; - } - } - } - - $scope.datasourceType = undefined; - for(var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes){ - if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type){ - $scope.datasourceType = datasourceType; - break; - } - } - - $scope.$digest(); - - // converter parameters - if ($scope.converter){ - for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { - $("#converterParameter_indicatorEditFeatures_" + convParameter.name).val(convParameter.value); - } - } - - // datasourceTypes parameters - if ($scope.datasourceType){ - for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { - $("#datasourceTypeParameter_indicatorEditFeatures_" + dsParameter.name).val(dsParameter.value); - } - } - - // property Mapping - $scope.spatialUnitRefKeyProperty = $scope.mappingConfigImportSettings.propertyMapping.spatialReferenceKeyProperty; - - $scope.$broadcast('loadTimeseriesMapping', { mapping: $scope.mappingConfigImportSettings.propertyMapping.timeseriesMappings } ); - - if($scope.mappingConfigImportSettings.targetSpatialUnitName){ - for (const spatialUnitMetadata of kommonitorDataExchangeService.availableSpatialUnits) { - if(spatialUnitMetadata.spatialUnitLevel === $scope.mappingConfigImportSettings.targetSpatialUnitName){ - $scope.targetSpatialUnitMetadata = spatialUnitMetadata; - } - - } - } - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.mappingConfigImportSettings.allowedRoles); - - $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueIndicator; - - $scope.$digest(); - }; - - $scope.onExportIndicatorEditFeaturesMappingConfig = async function(){ - var converterDefinition = $scope.buildConverterDefinition(); - var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - - var mappingConfigExport = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - "targetSpatialUnitName": $scope.targetSpatialUnitMetadata.spatialUnitLevel, - "allowedRoles": [] - }; - - mappingConfigExport.allowedRoles = []; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - mappingConfigExport.allowedRoles.push(roleId); - } - - mappingConfigExport.periodOfValidity = $scope.periodOfValidity; - - var name = $scope.datasetName; - - var metadataJSON = JSON.stringify(mappingConfigExport); - - var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; - - if (name){ - fileName += "-" + name; - } - - fileName += ".json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - - $scope.hideSuccessAlert = function(){ - $("#indicatorEditFeaturesSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#indicatorEditFeaturesErrorAlert").hide(); - }; - - $scope.hideMappingConfigErrorAlert = function(){ - $("#indicatorEditFeaturesMappingConfigImportErrorAlert").hide(); - }; - - $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_indicator, function(event){ - $timeout(function(){ - - $scope.loadingData = true; - }); - }); - - $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_indicator, function(event){ - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - - $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_indicator, function(event){ - $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); - $scope.refreshIndicatorEditFeaturesOverviewTable(); - }); - - $scope.onChangeEnableDeleteFeatures = function(){ - if($scope.enableDeleteFeatures){ - $(".indicatorDeleteFeatureRecordBtn").attr("disabled", false); - } - else{ - $(".indicatorDeleteFeatureRecordBtn").attr("disabled", true); - } - } - - $rootScope.$on("timeseriesMappingChanged", function(event, data) { - $scope.timeseriesMappingReference = data.mapping; - }); - - } -]}); + templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorImporterHelperService', + '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + function IndicatorEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; + /* PUT BODY + { + "indicatorValues": [ + { + "spatialReferenceKey": "spatialReferenceKey", + "valueMapping": [ + { + "indicatorValue": 0.8008282, + "timestamp": "2000-01-23" + }, + { + "indicatorValue": 0.8008282, + "timestamp": "2000-01-23" + } + ] + }, + { + "spatialReferenceKey": "spatialReferenceKey", + "valueMapping": [ + { + "indicatorValue": 0.8008282, + "timestamp": "2000-01-23" + }, + { + "indicatorValue": 0.8008282, + "timestamp": "2000-01-23" + } + ] + } + ], + "applicableSpatialUnit": "applicableSpatialUnit", + "allowedRoles": [ + + ] + "defaultClassificationMapping": { + "colorBrewerSchemeName": "colorBrewerSchemeName", + "items": [ + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + }, + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + } + ] + } + } + */ + $scope.roleManagementTableOptions = undefined; + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + // make sure that initial fetching of availableRoles has happened + $scope.$on("initialMetadataLoadingCompleted", function (event) { + refreshRoles(); + }); + function refreshRoles() { + let allowedRoles = $scope.targetApplicableSpatialUnit ? $scope.targetApplicableSpatialUnit.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + } + $scope.indicatorFeaturesJSON; + $scope.currentIndicatorDataset; + $scope.targetApplicableSpatialUnit; + $scope.remainingFeatureHeaders; + $scope.indicatorMappingConfigImportError; + $scope.indicatorsEditFeaturesMappingConfigPre = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure_indicator); + $scope.overviewTableTargetSpatialUnitMetadata = undefined; + $scope.spatialUnitRefKeyProperty = undefined; + $scope.targetSpatialUnitMetadata = undefined; + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.indicatorDataSourceIdProperty = undefined; + $scope.indicatorDataSourceNameProperty = undefined; + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_indicators = undefined; + $scope.keepMissingValues = true; + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + $scope.loadingData = false; + $scope.timeseriesMappingReference; // gets updated by a broadcast whenever $scope.timeseries mapping in indicatorEditTimeseriesMapping component changes + $scope.$on("onEditIndicatorFeatures", function (event, indicatorDataset) { + kommonitorMultiStepFormHelperService.registerClickHandler(); + if ($scope.currentIndicatorDataset && $scope.currentIndicatorDataset.indicatorId === indicatorDataset.indicatorId) { + return; + } + else { + $scope.currentIndicatorDataset = indicatorDataset; + // $scope.refreshIndicatorEditFeaturesOverviewTable(); + $scope.resetIndicatorEditFeaturesForm(); + kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", [], []); + } + }); + // called if indicator was edited - then we must make sure that the view is refreshed + // i.e. if a new spatial unit was setup the first time via edit menu, then we must ensure that this new spatial unit is actually + // visible within features overview table dropdown + $rootScope.$on("refreshIndicatorOverviewTableCompleted", function () { + if ($scope.currentIndicatorDataset) { + $scope.currentIndicatorDataset = kommonitorDataExchangeService.getIndicatorMetadataById($scope.currentIndicatorDataset.indicatorId); + $scope.$digest(); + } + }); + $scope.filterOverviewTargetSpatialUnits = function () { + return function (spatialUnitMetadata) { + if ($scope.currentIndicatorDataset) { + var isIncluded = $scope.currentIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadata.spatialUnitLevel); + return isIncluded; + } + }; + }; + $scope.refreshIndicatorEditFeaturesOverviewTable = function () { + $scope.loadingData = true; + // fetch all indicator features + $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId + "/without-geometry", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $scope.indicatorFeaturesJSON = response.data; + var tmpRemainingHeaders = []; + for (var property in $scope.indicatorFeaturesJSON[0]) { + // only show indicator date columns as editable fields + // since we fetch the database view (with joined spatial unit), any additional information from the spatial unit must be filtered out + if (property.includes(__env.indicatorDatePrefix)) { + tmpRemainingHeaders.push(property); + } + } + //sort date headers + tmpRemainingHeaders.sort((a, b) => a.localeCompare(b)); + $scope.remainingFeatureHeaders = tmpRemainingHeaders; + kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", tmpRemainingHeaders, $scope.indicatorFeaturesJSON, $scope.currentIndicatorDataset.indicatorId, kommonitorDataGridHelperService.resourceType_indicator, $scope.enableDeleteFeatures, $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId); + $scope.loadingData = false; + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + }); + }; + $scope.clearAllIndicatorFeatures = function () { + $scope.loadingData = true; + // delete all indicator features for target spatial unit + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId, + method: "DELETE", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $scope.indicatorFeaturesJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + // $scope.refreshIndicatorEditFeaturesOverviewTable(); + // force empty feature overview table on successful deletion of entries + kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", [], []); + $scope.successMessagePart = $scope.currentIndicatorDataset.indicatorName; + $("#indicatorEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + }); + }; + $scope.resetIndicatorEditFeaturesForm = function () { + // reset edit banners + kommonitorDataGridHelperService.featureTable_indicator_lastUpdate_timestamp_success = undefined; + kommonitorDataGridHelperService.featureTable_indicator_lastUpdate_timestamp_failure = undefined; + $scope.indicatorFeaturesJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + $scope.overviewTableTargetSpatialUnitMetadata = undefined; + for (const spatialUnitMetadataEntry of kommonitorDataExchangeService.availableSpatialUnits) { + if ($scope.currentIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadataEntry.spatialUnitLevel)) { + $scope.overviewTableTargetSpatialUnitMetadata = spatialUnitMetadataEntry; + break; + } + } + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + $scope.spatialUnitRefKeyProperty = undefined; + $scope.targetSpatialUnitMetadata = undefined; + $scope.targetApplicableSpatialUnit = undefined; + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.indicatorDataSourceIdProperty = undefined; + $scope.indicatorDataSourceNameProperty = undefined; + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_indicators = undefined; + $scope.keepMissingValues = true; + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + $scope.indicatorDataSourceIdProperty = undefined; + $scope.indicatorDataSourceNameProperty = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + $rootScope.$broadcast('resetTimeseriesMapping'); + $("#indicatorEditFeaturesSuccessAlert").hide(); + $("#indicatorEditFeaturesErrorAlert").hide(); + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onChangeSelectedSpatialUnit = function (targetSpatialUnitMetadata) { + var applicableSpatialUnits = $scope.currentIndicatorDataset.applicableSpatialUnits; + for (const applicableSpatialUnit of applicableSpatialUnits) { + if (applicableSpatialUnit.spatialUnitId === targetSpatialUnitMetadata.spatialUnitId) { + $scope.targetApplicableSpatialUnit = applicableSpatialUnit; + break; + } + } + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); + }; + $scope.onChangeConverter = function () { + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + $scope.onChangeMimeType = function (mimeType) { + $scope.mimeType = mimeType; + }; + $scope.filterByKomMonitorProperties = function () { + return function (item) { + try { + if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate") { + return false; + } + return true; + } + catch (error) { + return false; + } + }; + }; + $scope.getFeatureId = function (jsonFeature) { + return jsonFeature[__env.FEATURE_ID_PROPERTY_NAME]; + }; + $scope.getFeatureName = function (jsonFeature) { + return jsonFeature[__env.FEATURE_NAME_PROPERTY_NAME]; + }; + $scope.buildImporterObjects = async function () { + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + var scopeProperties = { + "targetSpatialUnitMetadata": { + "spatialUnitLevel": $scope.targetSpatialUnitMetadata.spatialUnitLevel, + }, + "currentIndicatorDataset": { + "defaultClassificationMapping": $scope.currentIndicatorDataset.defaultClassificationMapping + }, + "allowedRoles": roleIds + }; + $scope.putBody_indicators = kommonitorImporterHelperService.buildPutBody_indicators(scopeProperties); + if (!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_indicators) { + return false; + } + return true; + }; + $scope.buildConverterDefinition = function () { + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_indicatorEditFeatures_", $scope.schema, $scope.mimeType); + }; + $scope.buildDatasourceTypeDefinition = async function () { + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_indicatorEditFeatures_', 'indicatorDataSourceInput_editFeatures'); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + return null; + } + }; + $scope.buildPropertyMappingDefinition = function () { + // arsion from is undefined currently + let timeseriesMappingForImporter = []; + timeseriesMappingForImporter = $scope.timeseriesMappingReference; + console.log("timeseriesMappingForImporter: ", timeseriesMappingForImporter); + return kommonitorImporterHelperService.buildPropertyMapping_indicatorResource($scope.spatialUnitRefKeyProperty, timeseriesMappingForImporter, $scope.keepMissingValues); + }; + $scope.editIndicatorFeatures = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + /* + now collect data and build request for importer + */ + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + if (!allDataSpecified) { + $("#spatialUnitEditFeaturesForm").validator("update"); + $("#spatialUnitEditFeaturesForm").validator("validate"); + return; + } + else { + // TODO verify input + // TODO Create and perform POST Request with loading screen + var updateIndicatorResponse_dryRun = undefined; + try { + updateIndicatorResponse_dryRun = await kommonitorImporterHelperService.updateIndicator($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentIndicatorDataset.indicatorId, $scope.putBody_indicators, true); + // this callback will be called asynchronously + // when the response is available + if (!kommonitorImporterHelperService.importerResponseContainsErrors(updateIndicatorResponse_dryRun)) { + // all good, really execute the request to import data against data management API + var updateIndicatorResponse = await kommonitorImporterHelperService.updateIndicator($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentIndicatorDataset.indicatorId, $scope.putBody_indicators, false); + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + // $scope.refreshIndicatorEditFeaturesOverviewTable(); + $scope.successMessagePart = $scope.currentIndicatorDataset.indicatorName; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateIndicatorResponse); + $("#indicatorEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + } + else { + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateIndicatorResponse_dryRun); + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if (updateIndicatorResponse_dryRun) { + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateIndicatorResponse_dryRun); + } + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + }; + $scope.onImportIndicatorEditFeaturesMappingConfig = function () { + $scope.indicatorMappingConfigImportError = ""; + $("#indicatorMappingConfigEditFeaturesImportFile").files = []; + // trigger file chooser + $("#indicatorMappingConfigEditFeaturesImportFile").click(); + }; + $(document).on("change", "#indicatorMappingConfigEditFeaturesImportFile", function () { + console.log("Importing Importer Mapping Config for EditFeatures Indicator Form"); + // get the file + var file = document.getElementById('indicatorMappingConfigEditFeaturesImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + $scope.parseMappingConfigFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMappingConfigFile(event); + } + catch (error) { + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.indicatorMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("indicatorsEditFeaturesMappingConfigPre").innerHTML = $scope.indicatorMappingConfigStructure_pretty; + $("#indicatorEditFeaturesMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMappingConfigFile = function (event) { + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + if (!$scope.mappingConfigImportSettings.converter || !$scope.mappingConfigImportSettings.dataSource || !$scope.mappingConfigImportSettings.propertyMapping) { + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("indicatorsEditFeaturesMappingConfigPre").innerHTML = $scope.indicatorMappingConfigStructure_pretty; + $("#indicatorEditFeaturesMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + $scope.converter = undefined; + for (var converter of kommonitorImporterHelperService.availableConverters) { + if (converter.name === $scope.mappingConfigImportSettings.converter.name) { + $scope.converter = converter; + break; + } + } + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema) { + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema) { + $scope.schema = schema; + } + } + } + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType) { + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType) { + $scope.mimeType = mimeType; + } + } + } + $scope.datasourceType = undefined; + for (var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes) { + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type) { + $scope.datasourceType = datasourceType; + break; + } + } + $scope.$digest(); + // converter parameters + if ($scope.converter) { + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_indicatorEditFeatures_" + convParameter.name).val(convParameter.value); + } + } + // datasourceTypes parameters + if ($scope.datasourceType) { + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_indicatorEditFeatures_" + dsParameter.name).val(dsParameter.value); + } + } + // property Mapping + $scope.spatialUnitRefKeyProperty = $scope.mappingConfigImportSettings.propertyMapping.spatialReferenceKeyProperty; + $scope.$broadcast('loadTimeseriesMapping', { mapping: $scope.mappingConfigImportSettings.propertyMapping.timeseriesMappings }); + if ($scope.mappingConfigImportSettings.targetSpatialUnitName) { + for (const spatialUnitMetadata of kommonitorDataExchangeService.availableSpatialUnits) { + if (spatialUnitMetadata.spatialUnitLevel === $scope.mappingConfigImportSettings.targetSpatialUnitName) { + $scope.targetSpatialUnitMetadata = spatialUnitMetadata; + } + } + } + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.mappingConfigImportSettings.allowedRoles); + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueIndicator; + $scope.$digest(); + }; + $scope.onExportIndicatorEditFeaturesMappingConfig = async function () { + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + "targetSpatialUnitName": $scope.targetSpatialUnitMetadata.spatialUnitLevel, + "allowedRoles": [] + }; + mappingConfigExport.allowedRoles = []; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + mappingConfigExport.allowedRoles.push(roleId); + } + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + var name = $scope.datasetName; + var metadataJSON = JSON.stringify(mappingConfigExport); + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.hideSuccessAlert = function () { + $("#indicatorEditFeaturesSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#indicatorEditFeaturesErrorAlert").hide(); + }; + $scope.hideMappingConfigErrorAlert = function () { + $("#indicatorEditFeaturesMappingConfigImportErrorAlert").hide(); + }; + $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_indicator, function (event) { + $timeout(function () { + $scope.loadingData = true; + }); + }); + $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_indicator, function (event) { + $timeout(function () { + $scope.loadingData = false; + }); + }); + $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_indicator, function (event) { + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + $scope.refreshIndicatorEditFeaturesOverviewTable(); + }); + $scope.onChangeEnableDeleteFeatures = function () { + if ($scope.enableDeleteFeatures) { + $(".indicatorDeleteFeatureRecordBtn").attr("disabled", false); + } + else { + $(".indicatorDeleteFeatureRecordBtn").attr("disabled", true); + } + }; + $rootScope.$on("timeseriesMappingChanged", function (event, data) { + $scope.timeseriesMappingReference = data.mapping; + }); + } + ] +}); +//# sourceMappingURL=indicator-edit-features-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.js.map new file mode 100644 index 000000000..8a9110bae --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-edit-features-modal.component.js","sourceRoot":"","sources":["indicator-edit-features-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.ts new file mode 100644 index 000000000..14c69d353 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.component.ts @@ -0,0 +1,718 @@ +angular.module('indicatorEditFeaturesModal').component('indicatorEditFeaturesModal', { + templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorImporterHelperService', + '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + function IndicatorEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, + kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; + + /* PUT BODY + { + "indicatorValues": [ + { + "spatialReferenceKey": "spatialReferenceKey", + "valueMapping": [ + { + "indicatorValue": 0.8008282, + "timestamp": "2000-01-23" + }, + { + "indicatorValue": 0.8008282, + "timestamp": "2000-01-23" + } + ] + }, + { + "spatialReferenceKey": "spatialReferenceKey", + "valueMapping": [ + { + "indicatorValue": 0.8008282, + "timestamp": "2000-01-23" + }, + { + "indicatorValue": 0.8008282, + "timestamp": "2000-01-23" + } + ] + } + ], + "applicableSpatialUnit": "applicableSpatialUnit", + "allowedRoles": [ + + ] + "defaultClassificationMapping": { + "colorBrewerSchemeName": "colorBrewerSchemeName", + "items": [ + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + }, + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + } + ] + } + } + */ + + + + $scope.roleManagementTableOptions = undefined; + + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + + // make sure that initial fetching of availableRoles has happened + $scope.$on("initialMetadataLoadingCompleted", function (event) { + refreshRoles(); + }); + + function refreshRoles() { + let allowedRoles = $scope.targetApplicableSpatialUnit ? $scope.targetApplicableSpatialUnit.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + } + + $scope.indicatorFeaturesJSON; + $scope.currentIndicatorDataset; + $scope.targetApplicableSpatialUnit; + $scope.remainingFeatureHeaders; + + $scope.indicatorMappingConfigImportError; + $scope.indicatorsEditFeaturesMappingConfigPre = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure_indicator); + + + $scope.overviewTableTargetSpatialUnitMetadata = undefined; + + $scope.spatialUnitRefKeyProperty = undefined; + $scope.targetSpatialUnitMetadata = undefined; + + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.indicatorDataSourceIdProperty = undefined; + $scope.indicatorDataSourceNameProperty = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_indicators = undefined; + + $scope.keepMissingValues = true; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + + $scope.loadingData = false; + + $scope.timeseriesMappingReference; // gets updated by a broadcast whenever $scope.timeseries mapping in indicatorEditTimeseriesMapping component changes + + $scope.$on("onEditIndicatorFeatures", function (event, indicatorDataset) { + kommonitorMultiStepFormHelperService.registerClickHandler(); + if($scope.currentIndicatorDataset && $scope.currentIndicatorDataset.indicatorId === indicatorDataset.indicatorId){ + return; + } + else{ + $scope.currentIndicatorDataset = indicatorDataset; + + // $scope.refreshIndicatorEditFeaturesOverviewTable(); + + $scope.resetIndicatorEditFeaturesForm(); + + kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", [], []); + + } + + }); + + // called if indicator was edited - then we must make sure that the view is refreshed + // i.e. if a new spatial unit was setup the first time via edit menu, then we must ensure that this new spatial unit is actually + // visible within features overview table dropdown + $rootScope.$on("refreshIndicatorOverviewTableCompleted", function() { + if($scope.currentIndicatorDataset){ + $scope.currentIndicatorDataset = kommonitorDataExchangeService.getIndicatorMetadataById($scope.currentIndicatorDataset.indicatorId); + + $scope.$digest(); + } + + }); + + $scope.filterOverviewTargetSpatialUnits = function(){ + return function( spatialUnitMetadata ) { + if($scope.currentIndicatorDataset){ + var isIncluded = $scope.currentIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadata.spatialUnitLevel); + return isIncluded; + } + }; + }; + + $scope.refreshIndicatorEditFeaturesOverviewTable = function(){ + + $scope.loadingData = true; + // fetch all indicator features + $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId + "/without-geometry", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + $scope.indicatorFeaturesJSON = response.data; + + var tmpRemainingHeaders = []; + + for (var property in $scope.indicatorFeaturesJSON[0]){ + // only show indicator date columns as editable fields + // since we fetch the database view (with joined spatial unit), any additional information from the spatial unit must be filtered out + if (property.includes(__env.indicatorDatePrefix)){ + tmpRemainingHeaders.push(property); + } + } + + //sort date headers + tmpRemainingHeaders.sort((a, b) => a.localeCompare(b)); + + $scope.remainingFeatureHeaders = tmpRemainingHeaders; + kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", tmpRemainingHeaders, $scope.indicatorFeaturesJSON, $scope.currentIndicatorDataset.indicatorId, kommonitorDataGridHelperService.resourceType_indicator, $scope.enableDeleteFeatures, $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId); + + + $scope.loadingData = false; + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + }); + }; + + $scope.clearAllIndicatorFeatures = function(){ + $scope.loadingData = true; + // delete all indicator features for target spatial unit + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.overviewTableTargetSpatialUnitMetadata.spatialUnitId, + method: "DELETE", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + $scope.indicatorFeaturesJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + // $scope.refreshIndicatorEditFeaturesOverviewTable(); + // force empty feature overview table on successful deletion of entries + kommonitorDataGridHelperService.buildDataGrid_featureTable_indicatorResource("indicatorFeatureTable", [], []); + + $scope.successMessagePart = $scope.currentIndicatorDataset.indicatorName; + + $("#indicatorEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + }); + }; + + $scope.resetIndicatorEditFeaturesForm = function(){ + + // reset edit banners + kommonitorDataGridHelperService.featureTable_indicator_lastUpdate_timestamp_success = undefined; + kommonitorDataGridHelperService.featureTable_indicator_lastUpdate_timestamp_failure = undefined; + + $scope.indicatorFeaturesJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + + $scope.overviewTableTargetSpatialUnitMetadata = undefined; + for (const spatialUnitMetadataEntry of kommonitorDataExchangeService.availableSpatialUnits) { + if($scope.currentIndicatorDataset.applicableSpatialUnits.some(o => o.spatialUnitName === spatialUnitMetadataEntry.spatialUnitLevel)){ + $scope.overviewTableTargetSpatialUnitMetadata = spatialUnitMetadataEntry; + break; + } + } + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + + $scope.spatialUnitRefKeyProperty = undefined; + $scope.targetSpatialUnitMetadata = undefined; + $scope.targetApplicableSpatialUnit = undefined; + + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.indicatorDataSourceIdProperty = undefined; + $scope.indicatorDataSourceNameProperty = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_indicators = undefined; + + $scope.keepMissingValues = true; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + $scope.indicatorDataSourceIdProperty = undefined; + $scope.indicatorDataSourceNameProperty = undefined; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + + $rootScope.$broadcast('resetTimeseriesMapping') + + $("#indicatorEditFeaturesSuccessAlert").hide(); + $("#indicatorEditFeaturesErrorAlert").hide(); + + setTimeout(() => { + $scope.$digest(); + }, 250); + + }; + + $scope.onChangeSelectedSpatialUnit = function(targetSpatialUnitMetadata){ + + var applicableSpatialUnits = $scope.currentIndicatorDataset.applicableSpatialUnits; + + for (const applicableSpatialUnit of applicableSpatialUnits) { + if (applicableSpatialUnit.spatialUnitId === targetSpatialUnitMetadata.spatialUnitId){ + $scope.targetApplicableSpatialUnit = applicableSpatialUnit; + break; + } + } + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); + + }; + + $scope.onChangeConverter = function(){ + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + + $scope.onChangeMimeType = function(mimeType){ + $scope.mimeType = mimeType; + }; + + $scope.filterByKomMonitorProperties = function() { + return function( item ) { + + try{ + if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate"){ + return false; + } + return true; + } + catch(error){ + return false; + } + }; + }; + + + + + $scope.getFeatureId = function(jsonFeature){ + return jsonFeature[__env.FEATURE_ID_PROPERTY_NAME]; + }; + + $scope.getFeatureName = function(jsonFeature){ + return jsonFeature[__env.FEATURE_NAME_PROPERTY_NAME]; + }; + + + $scope.buildImporterObjects = async function(){ + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + + var scopeProperties = { + "targetSpatialUnitMetadata": { + "spatialUnitLevel": $scope.targetSpatialUnitMetadata.spatialUnitLevel, + }, + "currentIndicatorDataset": { + "defaultClassificationMapping": $scope.currentIndicatorDataset.defaultClassificationMapping + }, + "allowedRoles": roleIds + } + $scope.putBody_indicators = kommonitorImporterHelperService.buildPutBody_indicators(scopeProperties); + + if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_indicators){ + return false; + } + + return true; + }; + + $scope.buildConverterDefinition = function(){ + + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_indicatorEditFeatures_", $scope.schema, $scope.mimeType); + }; + + $scope.buildDatasourceTypeDefinition = async function(){ + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_indicatorEditFeatures_', 'indicatorDataSourceInput_editFeatures'); + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + return null; + } + }; + + $scope.buildPropertyMappingDefinition = function(){ + // arsion from is undefined currently + let timeseriesMappingForImporter = []; + timeseriesMappingForImporter = $scope.timeseriesMappingReference; + console.log("timeseriesMappingForImporter: ", timeseriesMappingForImporter); + return kommonitorImporterHelperService.buildPropertyMapping_indicatorResource($scope.spatialUnitRefKeyProperty, timeseriesMappingForImporter, $scope.keepMissingValues); + }; + + + + + $scope.editIndicatorFeatures = async function(){ + + $timeout(function(){ + $scope.loadingData = true; + }); + + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + /* + now collect data and build request for importer + */ + + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + + if (!allDataSpecified) { + + $("#spatialUnitEditFeaturesForm").validator("update"); + $("#spatialUnitEditFeaturesForm").validator("validate"); + return; + } + else { + + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + var updateIndicatorResponse_dryRun = undefined; + try { + updateIndicatorResponse_dryRun = await kommonitorImporterHelperService.updateIndicator($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentIndicatorDataset.indicatorId, $scope.putBody_indicators, true); + + // this callback will be called asynchronously + // when the response is available + + if(! kommonitorImporterHelperService.importerResponseContainsErrors(updateIndicatorResponse_dryRun)){ + // all good, really execute the request to import data against data management API + var updateIndicatorResponse = await kommonitorImporterHelperService.updateIndicator($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentIndicatorDataset.indicatorId, $scope.putBody_indicators, false); + + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + // $scope.refreshIndicatorEditFeaturesOverviewTable(); + + $scope.successMessagePart = $scope.currentIndicatorDataset.indicatorName; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateIndicatorResponse); + + $("#indicatorEditFeaturesSuccessAlert").show(); + $scope.loadingData = false; + } + else{ + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateIndicatorResponse_dryRun); + + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + + } + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if(updateIndicatorResponse_dryRun){ + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateIndicatorResponse_dryRun); + } + + $("#indicatorEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + }; + + $scope.onImportIndicatorEditFeaturesMappingConfig = function(){ + + $scope.indicatorMappingConfigImportError = ""; + + $("#indicatorMappingConfigEditFeaturesImportFile").files = []; + + // trigger file chooser + $("#indicatorMappingConfigEditFeaturesImportFile").click(); + + }; + + $(document).on("change", "#indicatorMappingConfigEditFeaturesImportFile" ,function(){ + + console.log("Importing Importer Mapping Config for EditFeatures Indicator Form"); + + // get the file + var file = document.getElementById('indicatorMappingConfigEditFeaturesImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + + $scope.parseMappingConfigFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMappingConfigFile(event); + } + catch(error){ + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.indicatorMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("indicatorsEditFeaturesMappingConfigPre").innerHTML = $scope.indicatorMappingConfigStructure_pretty; + $("#indicatorEditFeaturesMappingConfigImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMappingConfigFile = function(event){ + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + + if(! $scope.mappingConfigImportSettings.converter || ! $scope.mappingConfigImportSettings.dataSource || ! $scope.mappingConfigImportSettings.propertyMapping){ + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("indicatorsEditFeaturesMappingConfigPre").innerHTML = $scope.indicatorMappingConfigStructure_pretty; + $("#indicatorEditFeaturesMappingConfigImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.converter = undefined; + for(var converter of kommonitorImporterHelperService.availableConverters){ + if (converter.name === $scope.mappingConfigImportSettings.converter.name){ + $scope.converter = converter; + break; + } + } + + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema){ + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema){ + $scope.schema = schema; + } + } + } + + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType){ + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType){ + $scope.mimeType = mimeType; + } + } + } + + $scope.datasourceType = undefined; + for(var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes){ + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type){ + $scope.datasourceType = datasourceType; + break; + } + } + + $scope.$digest(); + + // converter parameters + if ($scope.converter){ + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_indicatorEditFeatures_" + convParameter.name).val(convParameter.value); + } + } + + // datasourceTypes parameters + if ($scope.datasourceType){ + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_indicatorEditFeatures_" + dsParameter.name).val(dsParameter.value); + } + } + + // property Mapping + $scope.spatialUnitRefKeyProperty = $scope.mappingConfigImportSettings.propertyMapping.spatialReferenceKeyProperty; + + $scope.$broadcast('loadTimeseriesMapping', { mapping: $scope.mappingConfigImportSettings.propertyMapping.timeseriesMappings } ); + + if($scope.mappingConfigImportSettings.targetSpatialUnitName){ + for (const spatialUnitMetadata of kommonitorDataExchangeService.availableSpatialUnits) { + if(spatialUnitMetadata.spatialUnitLevel === $scope.mappingConfigImportSettings.targetSpatialUnitName){ + $scope.targetSpatialUnitMetadata = spatialUnitMetadata; + } + + } + } + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditFeaturesRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.mappingConfigImportSettings.allowedRoles); + + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueIndicator; + + $scope.$digest(); + }; + + $scope.onExportIndicatorEditFeaturesMappingConfig = async function(){ + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + "targetSpatialUnitName": $scope.targetSpatialUnitMetadata.spatialUnitLevel, + "allowedRoles": [] + }; + + mappingConfigExport.allowedRoles = []; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + mappingConfigExport.allowedRoles.push(roleId); + } + + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + + var name = $scope.datasetName; + + var metadataJSON = JSON.stringify(mappingConfigExport); + + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + + if (name){ + fileName += "-" + name; + } + + fileName += ".json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + + $scope.hideSuccessAlert = function(){ + $("#indicatorEditFeaturesSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#indicatorEditFeaturesErrorAlert").hide(); + }; + + $scope.hideMappingConfigErrorAlert = function(){ + $("#indicatorEditFeaturesMappingConfigImportErrorAlert").hide(); + }; + + $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_indicator, function(event){ + $timeout(function(){ + + $scope.loadingData = true; + }); + }); + + $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_indicator, function(event){ + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + + $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_indicator, function(event){ + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + $scope.refreshIndicatorEditFeaturesOverviewTable(); + }); + + $scope.onChangeEnableDeleteFeatures = function(){ + if($scope.enableDeleteFeatures){ + $(".indicatorDeleteFeatureRecordBtn").attr("disabled", false); + } + else{ + $(".indicatorDeleteFeatureRecordBtn").attr("disabled", true); + } + } + + $rootScope.$on("timeseriesMappingChanged", function(event, data) { + $scope.timeseriesMappingReference = data.mapping; + }); + + } +]}); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.js index ce358b463..3cf1b85fb 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('indicatorEditFeaturesModal', ['kommonitorDataGridHelper', 'kommonitorImporterHelper', 'kommonitorMultiStepFormHelper']); +//# sourceMappingURL=indicator-edit-features-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.js.map new file mode 100644 index 000000000..ef0a3f0cf --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-edit-features-modal.module.js","sourceRoot":"","sources":["indicator-edit-features-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC,0BAA0B,EAAE,0BAA0B,EAAE,+BAA+B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.ts new file mode 100644 index 000000000..ce358b463 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditFeaturesModal/indicator-edit-features-modal.module.ts @@ -0,0 +1 @@ +angular.module('indicatorEditFeaturesModal', ['kommonitorDataGridHelper', 'kommonitorImporterHelper', 'kommonitorMultiStepFormHelper']); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.js index b1fbe6c8d..0d6f477c0 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.js @@ -1,129 +1,95 @@ +"use strict"; angular.module('indicatorEditIndicatorSpatialUnitRolesModal').component('indicatorEditIndicatorSpatialUnitRolesModal', { - templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.template.html", - controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', - function IndicatorEditIndicatorSpatialUnitRolesModalController(kommonitorDataExchangeService, $scope, $rootScope, - $http, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.currentIndicatorDataset; - - $scope.roleManagementTableOptions = undefined; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - - $scope.$on("onEditIndicatorSpatialUnitRoles", function (event, indicatorDataset) { - - $scope.currentIndicatorDataset = indicatorDataset; - - $scope.resetIndicatorEditIndicatorSpatialUnitRolesForm(); - kommonitorMultiStepFormHelperService.registerClickHandler(); - - }); - - $scope.$on("availableRolesUpdate", function (event) { - let allowedRoles = $scope.targetApplicableSpatialUnit ? $scope.targetApplicableSpatialUnit.allowedRoles : []; - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); - }); - - $scope.resetIndicatorEditIndicatorSpatialUnitRolesForm = function () { - - $scope.targetApplicableSpatialUnit = $scope.currentIndicatorDataset.applicableSpatialUnits[0]; - - if ($scope.targetApplicableSpatialUnit && $scope.targetApplicableSpatialUnit.allowedRoles) { - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); - } - else { - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); - } - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").hide(); - $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").hide(); - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.buildPatchBody_indicatorSpatialUnitRoles = function () { - var patchBody = - { - "allowedRoles": [] - } - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - patchBody.allowedRoles.push(roleId); - } - - return patchBody; - }; - - $scope.editIndicatorSpatialUnitRoles = function () { - - var patchBody = $scope.buildPatchBody_indicatorSpatialUnitRoles(); - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - $scope.loadingData = true; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.targetApplicableSpatialUnit.spatialUnitId, - method: "PATCH", - data: patchBody - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); - $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").show(); - $scope.loadingData = false; - - }, function errorCallback(error) { - if (error.data) { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").show(); - $scope.loadingData = false; - - // setTimeout(function() { - // $("#indicatorEditMetadataSuccessAlert").hide(); - // }, 3000); - }); - }; - - $scope.onChangeSelectedSpatialUnit = function (targetApplicableSpatialUnit) { - - if ($scope.targetApplicableSpatialUnit && $scope.targetApplicableSpatialUnit.allowedRoles) { - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); - } - else { - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); - } - - }; - - $scope.hideSuccessAlert = function () { - $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function () { - $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").hide(); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', + function IndicatorEditIndicatorSpatialUnitRolesModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.currentIndicatorDataset; + $scope.roleManagementTableOptions = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.$on("onEditIndicatorSpatialUnitRoles", function (event, indicatorDataset) { + $scope.currentIndicatorDataset = indicatorDataset; + $scope.resetIndicatorEditIndicatorSpatialUnitRolesForm(); + kommonitorMultiStepFormHelperService.registerClickHandler(); + }); + $scope.$on("availableRolesUpdate", function (event) { + let allowedRoles = $scope.targetApplicableSpatialUnit ? $scope.targetApplicableSpatialUnit.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + }); + $scope.resetIndicatorEditIndicatorSpatialUnitRolesForm = function () { + $scope.targetApplicableSpatialUnit = $scope.currentIndicatorDataset.applicableSpatialUnits[0]; + if ($scope.targetApplicableSpatialUnit && $scope.targetApplicableSpatialUnit.allowedRoles) { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); + } + else { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").hide(); + $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").hide(); + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.buildPatchBody_indicatorSpatialUnitRoles = function () { + var patchBody = { + "allowedRoles": [] + }; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + patchBody.allowedRoles.push(roleId); + } + return patchBody; + }; + $scope.editIndicatorSpatialUnitRoles = function () { + var patchBody = $scope.buildPatchBody_indicatorSpatialUnitRoles(); + // TODO verify input + // TODO Create and perform POST Request with loading screen + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.targetApplicableSpatialUnit.spatialUnitId, + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").show(); + $scope.loadingData = false; + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").show(); + $scope.loadingData = false; + // setTimeout(function() { + // $("#indicatorEditMetadataSuccessAlert").hide(); + // }, 3000); + }); + }; + $scope.onChangeSelectedSpatialUnit = function (targetApplicableSpatialUnit) { + if ($scope.targetApplicableSpatialUnit && $scope.targetApplicableSpatialUnit.allowedRoles) { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); + } + else { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + }; + $scope.hideSuccessAlert = function () { + $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").hide(); + }; + } + ] }); +//# sourceMappingURL=indicator-edit-indicator-spatial-unit-roles-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.js.map new file mode 100644 index 000000000..7f577e837 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-edit-indicator-spatial-unit-roles-modal.component.js","sourceRoot":"","sources":["indicator-edit-indicator-spatial-unit-roles-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.ts new file mode 100644 index 000000000..b1fbe6c8d --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.component.ts @@ -0,0 +1,129 @@ +angular.module('indicatorEditIndicatorSpatialUnitRolesModal').component('indicatorEditIndicatorSpatialUnitRolesModal', { + templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', + function IndicatorEditIndicatorSpatialUnitRolesModalController(kommonitorDataExchangeService, $scope, $rootScope, + $http, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.currentIndicatorDataset; + + $scope.roleManagementTableOptions = undefined; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + + $scope.$on("onEditIndicatorSpatialUnitRoles", function (event, indicatorDataset) { + + $scope.currentIndicatorDataset = indicatorDataset; + + $scope.resetIndicatorEditIndicatorSpatialUnitRolesForm(); + kommonitorMultiStepFormHelperService.registerClickHandler(); + + }); + + $scope.$on("availableRolesUpdate", function (event) { + let allowedRoles = $scope.targetApplicableSpatialUnit ? $scope.targetApplicableSpatialUnit.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + }); + + $scope.resetIndicatorEditIndicatorSpatialUnitRolesForm = function () { + + $scope.targetApplicableSpatialUnit = $scope.currentIndicatorDataset.applicableSpatialUnits[0]; + + if ($scope.targetApplicableSpatialUnit && $scope.targetApplicableSpatialUnit.allowedRoles) { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); + } + else { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").hide(); + $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").hide(); + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.buildPatchBody_indicatorSpatialUnitRoles = function () { + var patchBody = + { + "allowedRoles": [] + } + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + patchBody.allowedRoles.push(roleId); + } + + return patchBody; + }; + + $scope.editIndicatorSpatialUnitRoles = function () { + + var patchBody = $scope.buildPatchBody_indicatorSpatialUnitRoles(); + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + $scope.loadingData = true; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId + "/" + $scope.targetApplicableSpatialUnit.spatialUnitId, + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").show(); + $scope.loadingData = false; + + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").show(); + $scope.loadingData = false; + + // setTimeout(function() { + // $("#indicatorEditMetadataSuccessAlert").hide(); + // }, 3000); + }); + }; + + $scope.onChangeSelectedSpatialUnit = function (targetApplicableSpatialUnit) { + + if ($scope.targetApplicableSpatialUnit && $scope.targetApplicableSpatialUnit.allowedRoles) { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.targetApplicableSpatialUnit.allowedRoles); + } + else { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditIndicatorSpatialUnitsRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + + }; + + $scope.hideSuccessAlert = function () { + $("#indicatorEditIndicatorSpatialUnitRolesSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function () { + $("#indicatorEditIndicatorSpatialUnitRolesErrorAlert").hide(); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.js index 952c9bd93..b165678dd 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('indicatorEditIndicatorSpatialUnitRolesModal', ['kommonitorDataExchange', 'excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=indicator-edit-indicator-spatial-unit-roles-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.js.map new file mode 100644 index 000000000..a26157923 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-edit-indicator-spatial-unit-roles-modal.module.js","sourceRoot":"","sources":["indicator-edit-indicator-spatial-unit-roles-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,6CAA6C,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.ts new file mode 100644 index 000000000..952c9bd93 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditIndicatorSpatialUnitRolesModal/indicator-edit-indicator-spatial-unit-roles-modal.module.ts @@ -0,0 +1 @@ +angular.module('indicatorEditIndicatorSpatialUnitRolesModal', ['kommonitorDataExchange', 'excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.js index 3ee53c046..2c3cad41d 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.js @@ -1,1133 +1,929 @@ +"use strict"; angular.module('indicatorEditMetadataModal').component('indicatorEditMetadataModal', { - templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', - 'kommonitorDataGridHelperService', - function IndicatorEditMetadataModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout, - kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.currentIndicatorDataset; - - /* POST BODY - { - - "refrencesToOtherIndicators": [ - { - "referenceDescription": "referenceDescription", - "indicatorId": "indicatorId" - }, - { - "referenceDescription": "referenceDescription", - "indicatorId": "indicatorId" - } - ], - "metadata": { - "note": "note", - "literature": "literature", - "updateInterval": "ARBITRARY", - "sridEPSG": 0.8008281904610115, - "datasource": "datasource", - "contact": "contact", - "lastUpdate": "2000-01-23", - "description": "description", - "databasis": "databasis" - }, - "allowedRoles": [ - "allowedRoles", - "allowedRoles" - ], - "datasetName": "datasetName", - "applicableSpatialUnit": "applicableSpatialUnit", - "abbreviation": "abbreviation", - "characteristicValue": "characteristicValue", - "tags": [ - "tags", - "tags" - ], - "creationType": "INSERTION", - "unit": "unit", - "topicReference": "topicReference", - "referenceDateNote": "optional note for indicator reference date", - "displayOrder": 0, - "refrencesToGeoresources": [ - { - "referenceDescription": "referenceDescription", - "georesourceId": "georesourceId" - }, - { - "referenceDescription": "referenceDescription", - "georesourceId": "georesourceId" - } - ], - "indicatorType": "STATUS_ABSOLUTE", - "interpretation": "interpretation", - "isHeadlineIndicator": false, - "processDescription": "processDescription", - "lowestSpatialUnitForComputation": "lowestSpatialUnitForComputation", - "defaultClassificationMapping": { - "colorBrewerSchemeName": "colorBrewerSchemeName", - "items": [ - { - "defaultCustomRating": "defaultCustomRating", - "defaultColorAsHex": "defaultColorAsHex" - }, - { - "defaultCustomRating": "defaultCustomRating", - "defaultColorAsHex": "defaultColorAsHex" - } - ] - } - } - */ - - //Date picker - $('#indicatorEditLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $scope.indicatorMetadataStructure = { - "metadata": { - "note": "an optional note", - "literature": "optional text about literature", - "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", - "sridEPSG": 4326, - "datasource": "text about data source", - "contact": "text about contact details", - "lastUpdate": "YYYY-MM-DD", - "description": "description about spatial unit dataset", - "databasis": "text about data basis", - }, - "allowedRoles": ['roleId'], - "refrencesToOtherIndicators": [ - { - "referenceDescription": "description about the reference", - "indicatorId": "ID of referenced indicator dataset" - } - ], - "refrencesToGeoresources": [ - { - "referenceDescription": "description about the reference", - "georesourceId": "ID of referenced georesource dataset" - } - ], - "datasetName": "Name of indicator dataset", - "abbreviation": "optional abbreviation of the indicator dataset", - "characteristicValue": "if the same datasetName is used for different indicators, the optional characteristicValue parameter may serve to distinguish between them (i.e. Habitants - male, Habitants - female, Habitants - diverse)", - "tags": [ - "optinal list of tags; each tag is a free text tag" - ], - "creationType": "INSERTION|COMPUTATION <-- enum parameter controls whether each timestamp must be updated manually (INSERTION) or if KomMonitor shall compute the indicator values for respective timestamps based on script file (COMPUTATION)", - "unit": "unit of the indicator", - "topicReference": "ID of the respective main/sub topic instance", - "indicatorType": "STATUS_ABSOLUTE|STATUS_RELATIVE|DYNAMIC_ABSOLUTE|DYNAMIC_RELATIVE|STATUS_STANDARDIZED|DYNAMIC_STANDARDIZED", - "interpretation": "interpretation hints for the user to better understand the indicator values", - "isHeadlineIndicator": "boolean parameter to indicate if indicator is a headline indicator", - "processDescription": "detailed description about the computation/creation of the indicator", - "lowestSpatialUnitForComputation": "the name of the lowest possible spatial unit for which an indicator of creationType=COMPUTATION may be computed. All other superior spatial units will be aggregated automatically", - "referenceDateNote": "optional note for indicator reference date", - "displayOrder": 0, - "defaultClassificationMapping": { - "colorBrewerSchemeName": "schema name of colorBrewer colorPalette to use for classification", - "items": [ - { - "defaultCustomRating": "a string to rate indicator values of this class", - "defaultColorAsHex": "color as hexadecimal value" - } - ] - } - }; - - $scope.indicatorMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.indicatorMetadataStructure); - - $scope.metadataImportSettings; - $scope.indicatorMetadataImportError; - $scope.indicatorAddMetadataImportErrorAlert; - - $scope.datasetName = undefined; - $scope.datasetNameInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = undefined; - $scope.metadata.literature = undefined; - $scope.metadata.updateInterval = undefined; - $scope.metadata.sridEPSG = undefined; - $scope.metadata.datasource = undefined; - $scope.metadata.databasis = undefined; - $scope.metadata.contact = undefined; - $scope.metadata.lastUpdate = undefined; - $scope.metadata.description = undefined; - - $scope.roleManagementTableOptions = undefined; - - - $scope.datasetName = undefined; - $scope.indicatorAbbreviation = undefined; - $scope.indicatorType = undefined; - $scope.indicatorCharacteristicValue = undefined; - $scope.isHeadlineIndicator = false; - $scope.indicatorUnit = undefined; - $scope.enableFreeTextUnit = false; - $scope.indicatorProcessDescription = undefined; - $scope.indicatorTagsString_withCommas = undefined; - $scope.indicatorInterpretation = undefined; - $scope.indicatorCreationType = undefined; - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; - $scope.enableLowestSpatialUnitSelect = false; - - $scope.indicatorReferenceDateNote = undefined; - $scope.displayOrder = 0; - - $scope.indicatorTopic_mainTopic = undefined; - $scope.indicatorTopic_subTopic = undefined; - $scope.indicatorTopic_subsubTopic = undefined; - $scope.indicatorTopic_subsubsubTopic = undefined; - - $scope.indicatorNameFilter = undefined; - $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; - $scope.tmpIndicatorReference_referenceDescription = undefined; - // tmp array to display indicatorReferences - $scope.indicatorReferences_adminView = []; - // array for API request (has less information per item) - $scope.indicatorReferences_apiRequest = []; - - $scope.georesourceNameFilter = undefined; - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; - $scope.tmpGeoresourceReference_referenceDescription = undefined; - // tmp array to display georesourceReferences - $scope.georesourceReferences_adminView = []; - // array for API request (has less information per item) - $scope.georesourceReferences_apiRequest = []; - - $scope.numClassesArray = [3,4,5,6,7,8]; - $scope.numClasses = $scope.numClassesArray[2]; - $scope.selectedColorBrewerPaletteEntry = undefined; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $scope.colorbrewerSchemes = colorbrewer; - $scope.colorbreweSchemeName_dynamicIncrease = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; - $scope.colorbreweSchemeName_dynamicDecrease = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; - $scope.colorbrewerPalettes = []; - - - $scope.instantiateColorBrewerPalettes = function(){ - for (const key in colorbrewer) { - if (colorbrewer.hasOwnProperty(key)) { - const colorPalettes = colorbrewer[key]; - - var paletteEntry = { - "paletteName": key, - "paletteArrayObject": colorPalettes - }; - - $scope.colorbrewerPalettes.push(paletteEntry); - } - } - - // instantiate with palette 'Blues' - $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; - - }; - - $scope.instantiateColorBrewerPalettes(); - - $scope.$on("onEditIndicatorMetadata", function (event, indicatorDataset) { - - $scope.currentIndicatorDataset = indicatorDataset; - - $scope.resetIndicatorEditMetadataForm(); - kommonitorMultiStepFormHelperService.registerClickHandler(); - - }); - - $scope.$on("availableRolesUpdate", function (event) { - let allowedRoles = $scope.currentIndicatorDataset ? $scope.currentIndicatorDataset.allowedRoles : []; - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); - }); - - $scope.resetIndicatorEditMetadataForm = function(){ - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $scope.datasetName = $scope.currentIndicatorDataset.indicatorName; - $scope.datasetNameInvalid = false; - - $scope.indicatorReferenceDateNote = $scope.currentIndicatorDataset.referenceDateNote; - $scope.displayOrder = $scope.currentIndicatorDataset.displayOrder; - - $scope.metadata = {}; - $scope.metadata.note = $scope.currentIndicatorDataset.metadata.note; - $scope.metadata.literature = $scope.currentIndicatorDataset.metadata.literature; - $scope.metadata.sridEPSG = 4326; - $scope.metadata.datasource = $scope.currentIndicatorDataset.metadata.datasource; - $scope.metadata.databasis = $scope.currentIndicatorDataset.metadata.databasis; - $scope.metadata.contact = $scope.currentIndicatorDataset.metadata.contact; - $scope.metadata.description = $scope.currentIndicatorDataset.metadata.description; - - $scope.metadata.lastUpdate = $scope.currentIndicatorDataset.metadata.lastUpdate; - // $('#indicatorEditLastUpdateDatepicker').data({date: $scope.currentIndicatorDataset.metadata.lastUpdate}); - $('#indicatorEditLastUpdateDatepicker').datepicker('setDate', $scope.currentIndicatorDataset.metadata.lastUpdate); - - kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ - if(option.apiName === $scope.currentIndicatorDataset.metadata.updateInterval){ - $scope.metadata.updateInterval = option; - } - }); - - let allowedRoles = $scope.currentIndicatorDataset ? $scope.currentIndicatorDataset.allowedRoles : []; - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); - - $scope.indicatorAbbreviation = $scope.currentIndicatorDataset.abbreviation; - - kommonitorDataExchangeService.indicatorTypeOptions.forEach(function(option){ - if(option.apiName === $scope.currentIndicatorDataset.indicatorType){ - $scope.indicatorType = option; - } - }); - - $scope.indicatorCharacteristicValue = $scope.currentIndicatorDataset.characteristicValue; - $scope.isHeadlineIndicator = $scope.currentIndicatorDataset.isHeadlineIndicator; - $scope.indicatorUnit = $scope.currentIndicatorDataset.unit; - - $scope.enableFreeTextUnit = true; - kommonitorDataExchangeService.indicatorUnitOptions.forEach(function(option){ - if(option === $scope.currentIndicatorDataset.unit){ - // if the unit is in list of known units then disable freeText - $scope.enableFreeTextUnit = false; - } - }); - - $scope.indicatorProcessDescription = $scope.currentIndicatorDataset.processDescription; - $scope.indicatorTagsString_withCommas = ""; - - for (let index = 0; index < $scope.currentIndicatorDataset.tags.length; index++) { - $scope.indicatorTagsString_withCommas += $scope.currentIndicatorDataset.tags[index]; - - if(index < $scope.currentIndicatorDataset.tags.length - 1){ - $scope.indicatorTagsString_withCommas += ","; - } - } - - if (! $scope.currentIndicatorDataset.tags || $scope.currentIndicatorDataset.tags.length === 0){ - $scope.indicatorTagsString_withCommas = undefined; - } - - $scope.indicatorInterpretation = $scope.currentIndicatorDataset.interpretation; - - kommonitorDataExchangeService.indicatorCreationTypeOptions.forEach(function(option){ - if(option.apiName === $scope.currentIndicatorDataset.creationType){ - $scope.indicatorCreationType = option; - } - }); - - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; - - for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { - const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; - - if(spatialUnitMetadata.spatialUnitLevel === $scope.currentIndicatorDataset.lowestSpatialUnitForComputation){ - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; - break; - } - } - - if($scope.indicatorCreationType.apiName === "COMPUTATION"){ - $scope.enableLowestSpatialUnitSelect = true; - } - else{ - $scope.enableLowestSpatialUnitSelect = false; - } - - var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.currentIndicatorDataset.topicReference); - - if(topicHierarchy && topicHierarchy[0]){ - $scope.indicatorTopic_mainTopic = topicHierarchy[0]; - } - if(topicHierarchy && topicHierarchy[1]){ - $scope.indicatorTopic_subTopic = topicHierarchy[1]; - } - if(topicHierarchy && topicHierarchy[2]){ - $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; - } - if(topicHierarchy && topicHierarchy[3]){ - $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; - } - - $scope.indicatorNameFilter = undefined; - $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; - $scope.tmpIndicatorReference_referenceDescription = undefined; - - // tmp array to display indicatorReferences - $scope.indicatorReferences_adminView = []; - // array for API request (has less information per item) - $scope.indicatorReferences_apiRequest = []; - if($scope.currentIndicatorDataset.referencedIndicators && $scope.currentIndicatorDataset.referencedIndicators.length > 0){ - for (const indicatorReference of $scope.currentIndicatorDataset.referencedIndicators) { - var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.referencedIndicatorId); - var referenceEntry = { - "referencedIndicatorName": indicatorMetadata.indicatorName, - "referencedIndicatorId": indicatorMetadata.indicatorId, - "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, - "referencedIndicatorDescription": indicatorReference.referencedIndicatorDescription - }; - $scope.indicatorReferences_adminView.push(referenceEntry); - } - - } - - $scope.georesourceNameFilter = undefined; - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; - $scope.tmpGeoresourceReference_referenceDescription = undefined; - // tmp array to display georesourceReferences - $scope.georesourceReferences_adminView = []; - // array for API request (has less information per item) - $scope.georesourceReferences_apiRequest = []; - - if($scope.currentIndicatorDataset.referencedGeoresources && $scope.currentIndicatorDataset.referencedGeoresources.length > 0){ - for (const georesourceReference of $scope.currentIndicatorDataset.referencedGeoresources) { - var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.referencedGeoresourceId); - var geo_referenceEntry = { - "referencedGeoresourceName": georesourceMetadata.datasetName, - "referencedGeoresourceId": georesourceMetadata.georesourceId, - "referencedGeoresourceDescription": georesourceReference.referencedGeoresourceDescription - }; - $scope.georesourceReferences_adminView.push(geo_referenceEntry); - } - - } - - $scope.numClassesArray = [3,4,5,6,7,8]; - $scope.numClasses = $scope.numClassesArray[2]; - - // instantiate with palette 'Blues' - $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; - - for (const colorbrewerPalette of $scope.colorbrewerPalettes) { - if (colorbrewerPalette.paletteName === $scope.currentIndicatorDataset.defaultClassificationMapping.colorBrewerSchemeName){ - $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; - break; - } - } - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $("#indicatorEditMetadataSuccessAlert").hide(); - $("#indicatorEditMetadataErrorAlert").hide(); - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickColorBrewerEntry = function(colorPaletteEntry){ - $scope.selectedColorBrewerPaletteEntry = colorPaletteEntry; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onAddOrUpdateIndicatorReference = function(){ - var tmpIndicatorReference_adminView = { - "referencedIndicatorName": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorName, - "referencedIndicatorId": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorId, - "referencedIndicatorAbbreviation": $scope.tmpIndicatorReference_selectedIndicatorMetadata.abbreviation, - "referencedIndicatorDescription": $scope.tmpIndicatorReference_referenceDescription - }; - - var processed = false; - - for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { - var indicatorReference_adminView = $scope.indicatorReferences_adminView[index]; - - if (indicatorReference_adminView.referencedIndicatorId === tmpIndicatorReference_adminView.referencedIndicatorId){ - // replace object - $scope.indicatorReferences_adminView[index] = tmpIndicatorReference_adminView; - processed = true; - break; - } - } - - if(! processed){ - // new entry - $scope.indicatorReferences_adminView.push(tmpIndicatorReference_adminView); - } - - $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; - $scope.tmpIndicatorReference_referenceDescription = undefined; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickEditIndicatorReference = function(indicatorReference_adminView){ - - $scope.tmpIndicatorReference_selectedIndicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference_adminView.referencedIndicatorId); - $scope.tmpIndicatorReference_referenceDescription = indicatorReference_adminView.referencedIndicatorDescription; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickDeleteIndicatorReference = function(indicatorReference_adminView){ - - for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { - - if ($scope.indicatorReferences_adminView[index].referencedIndicatorId === indicatorReference_adminView.referencedIndicatorId){ - // remove object - $scope.indicatorReferences_adminView.splice(index, 1); - break; - } - } - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onAddOrUpdateGeoresourceReference = function(){ - var tmpGeoresourceReference_adminView = { - "referencedGeoresourceName": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.datasetName, - "referencedGeoresourceId": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.georesourceId, - "referencedGeoresourceDescription": $scope.tmpGeoresourceReference_referenceDescription - }; - - var processed = false; - - for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { - var georesourceReference_adminView = $scope.georesourceReferences_adminView[index]; - - if (georesourceReference_adminView.referencedGeoresourceId === tmpGeoresourceReference_adminView.referencedGeoresourceId){ - // replace object - $scope.georesourceReferences_adminView[index] = tmpGeoresourceReference_adminView; - processed = true; - break; - } - } - - if(! processed){ - // new entry - $scope.georesourceReferences_adminView.push(tmpGeoresourceReference_adminView); - } - - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; - $scope.tmpGeoresourceReference_referenceDescription = undefined; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickEditGeoresourceReference = function(georesourceReference_adminView){ - - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference_adminView.referencedGeoresourceId); - $scope.tmpGeoresourceReference_referenceDescription = georesourceReference_adminView.referencedGeoresourceDescription; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickDeleteGeoresourceReference = function(georesourceReference_adminView){ - - for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { - - if ($scope.georesourceReferences_adminView[index].referencedGeoresourceId === georesourceReference_adminView.referencedGeoresourceId){ - // remove object - $scope.georesourceReferences_adminView.splice(index, 1); - break; - } - } - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onChangeCreationType = function(){ - if($scope.indicatorCreationType.apiName === "COMPUTATION"){ - $scope.enableLowestSpatialUnitSelect = true; - } - else{ - $scope.enableLowestSpatialUnitSelect = false; - } - - }; - - $scope.onChangeIndicatorUnit = function(){ - if ($scope.indicatorUnit.includes("Freitext")){ - $scope.enableFreeTextUnit = true; - } - else{ - $scope.enableFreeTextUnit = false; - } - }; - - $scope.checkDatasetName = function(){ - $scope.datasetNameInvalid = false; - kommonitorDataExchangeService.availableIndicators.forEach(function(indicator){ - if (indicator.indicatorName === $scope.datasetName){ - $scope.datasetNameInvalid = true; - return; - } - }); - }; - - $scope.buildPatchBody_indicators = function(){ - var patchBody = - { - "metadata": { - "note": $scope.metadata.note || null, - "literature": $scope.metadata.literature || null, - "updateInterval": $scope.metadata.updateInterval.apiName, - "sridEPSG": $scope.metadata.sridEPSG || 4326, - "datasource": $scope.metadata.datasource, - "contact": $scope.metadata.contact, - "lastUpdate": $scope.metadata.lastUpdate, - "description": $scope.metadata.description || null, - "databasis": $scope.metadata.databasis || null - }, - "refrencesToOtherIndicators": [], // filled directly after - "allowedRoles": [], - "datasetName": $scope.datasetName, - "abbreviation": $scope.indicatorAbbreviation || null, - "characteristicValue": $scope.indicatorCharacteristicValue || null, - "tags": [], // filled directly after - "creationType": $scope.indicatorCreationType.apiName, - "unit": $scope.indicatorUnit, - "topicReference": "", // filled directly after - "refrencesToGeoresources": [], // filled directly after - "indicatorType": $scope.indicatorType.apiName, - "interpretation": $scope.indicatorInterpretation || "", - "isHeadlineIndicator": $scope.isHeadlineIndicator || false, - "processDescription": $scope.indicatorProcessDescription || "", - "referenceDateNote": $scope.indicatorReferenceDateNote || "", - "displayOrder": $scope.displayOrder, - "lowestSpatialUnitForComputation": $scope.indicatorLowestSpatialUnitMetadataObjectForComputation? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : null, - "defaultClassificationMapping": { - "colorBrewerSchemeName": $scope.selectedColorBrewerPaletteEntry.paletteName, - "items": [ - { - "defaultColorAsHex": "#edf8e9", - "defaultCustomRating": "sehr niedrig" - }, - { - "defaultColorAsHex": "#bae4b3", - "defaultCustomRating": "niedrig" - }, - { - "defaultColorAsHex": "#74c476", - "defaultCustomRating": "mittel" - }, - { - "defaultColorAsHex": "#31a354", - "defaultCustomRating": "hoch" - }, - { - "defaultColorAsHex": "#006d2c", - "defaultCustomRating": "sehr hoch" - } - ] - } - }; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - patchBody.allowedRoles.push(roleId); - } - - // TAGS - if($scope.indicatorTagsString_withCommas){ - var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); - for (const tagString of tags_splitted) { - patchBody.tags.push(tagString.trim()); - } - } - - // TOPIC REFERENCE - if($scope.indicatorTopic_subsubsubTopic){ - patchBody.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; - } - else if($scope.indicatorTopic_subsubTopic){ - patchBody.topicReference = $scope.indicatorTopic_subsubTopic.topicId; - } - else if($scope.indicatorTopic_subTopic){ - patchBody.topicReference = $scope.indicatorTopic_subTopic.topicId; - } - else if($scope.indicatorTopic_mainTopic){ - patchBody.topicReference = $scope.indicatorTopic_mainTopic.topicId; - } - else { - patchBody.topicReference = ""; - } - - - // REFERENCES - if($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0){ - patchBody.refrencesToOtherIndicators = []; - - for (const indicRef of $scope.indicatorReferences_adminView) { - patchBody.refrencesToOtherIndicators.push({ - "indicatorId": indicRef.referencedIndicatorId, - "referenceDescription": indicRef.referencedIndicatorDescription - }); - } - } - - if($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0){ - patchBody.refrencesToGeoresources = []; - - for (const geoRef of $scope.georesourceReferences_adminView) { - patchBody.refrencesToGeoresources.push({ - "georesourceId": geoRef.referencedGeoresourceId, - "referenceDescription": geoRef.referencedGeoresourceDescription - }); - } - } - - - return patchBody; - }; - - $scope.editIndicatorMetadata = function(){ - - var patchBody = $scope.buildPatchBody_indicators(); - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - $scope.loadingData = true; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId, - method: "PATCH", - data: patchBody - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.successMessagePart = $scope.datasetName; - - $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); - $("#indicatorEditMetadataSuccessAlert").show(); - $scope.loadingData = false; - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#indicatorEditMetadataErrorAlert").show(); - $scope.loadingData = false; - - // setTimeout(function() { - // $("#indicatorEditMetadataSuccessAlert").hide(); - // }, 3000); - }); - }; - - $scope.onImportIndicatorEditMetadata = function(){ - - $scope.indicatorMetadataImportError = ""; - - $("#indicatorEditMetadataImportFile").files = []; - - // trigger file chooser - $("#indicatorEditMetadataImportFile").click(); - - }; - - $(document).on("change", "#indicatorEditMetadataImportFile" ,function(){ - - console.log("Importing Indicator metadata for Edit Indicator Form"); - - // get the file - var file = document.getElementById('indicatorEditMetadataImportFile').files[0]; - $scope.parseMetadataFromFile(file); - }); - - $scope.parseMetadataFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMetadataFile(event); - } - catch(error){ - console.error("Uploaded Metadata File cannot be parsed."); - $scope.indicatorMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; - document.getElementById("indicatorsEditMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; - $("#indicatorEditMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMetadataFile = function(event){ - // $scope.geoJsonString = event.target.result; - $scope.metadataImportSettings = JSON.parse(event.target.result); - - if(! $scope.metadataImportSettings.metadata){ - console.error("uploaded Metadata File cannot be parsed - wrong structure."); - $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; - $("#indicatorAddMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.metadata = {}; - $scope.metadata.note = $scope.metadataImportSettings.metadata.note; - $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; - kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ - if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ - $scope.metadata.updateInterval = option; - } - }); - $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; - $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; - $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; - $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; - // initialize date - $('#indicatorAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); - - $scope.metadata.description = $scope.metadataImportSettings.metadata.description; - $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; - - $scope.datasetName = $scope.metadataImportSettings.datasetName; - - $scope.indicatorReferenceDateNote = $scope.metadataImportSettings.referenceDateNote; - $scope.displayOrder = $scope.metadataImportSettings.displayOrder; - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); - - // indicator specific properties - - $scope.indicatorAbbreviation = $scope.metadataImportSettings.abbreviation; - - for (const indicatorTypeOption of kommonitorDataExchangeService.indicatorTypeOptions) { - if(indicatorTypeOption.apiName === $scope.metadataImportSettings.indicatorType){ - $scope.indicatorType = indicatorTypeOption; - break; - } - } - - for (const indicatorCreationTypeOption of kommonitorDataExchangeService.indicatorCreationTypeOptions) { - if(indicatorCreationTypeOption.apiName === $scope.metadataImportSettings.creationType){ - $scope.indicatorCreationType = indicatorCreationTypeOption; - - if(indicatorCreationTypeOption.apiName === "COMPUTATION"){ - $scope.enableLowestSpatialUnitSelect = true; - } - else{ - $scope.enableLowestSpatialUnitSelect = false; - } - break; - } - } - - $scope.indicatorCharacteristicValue = $scope.metadataImportSettings.characteristicValue; - $scope.isHeadlineIndicator = $scope.metadataImportSettings.isHeadlineIndicator; - $scope.indicatorUnit = $scope.metadataImportSettings.unit; - if(kommonitorDataExchangeService.indicatorUnitOptions.includes($scope.metadataImportSettings.unit)){ - $scope.enableFreeTextUnit = false; - } - else{ - $scope.enableFreeTextUnit = true; - } - - $scope.indicatorProcessDescription = $scope.metadataImportSettings.processDescription; - - $scope.indicatorTagsString_withCommas = undefined; - if($scope.metadataImportSettings.tags && $scope.metadataImportSettings.tags.length > 0){ - $scope.indicatorTagsString_withCommas = ""; - for (let index = 0; index < $scope.metadataImportSettings.tags.length; index++) { - $scope.indicatorTagsString_withCommas += $scope.metadataImportSettings.tags[index]; - - if(index < $scope.metadataImportSettings.tags.length - 1){ - $scope.indicatorTagsString_withCommas += ","; - } - } - } - - $scope.indicatorInterpretation = $scope.metadataImportSettings.interpretation; - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; - - for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { - const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; - - if(spatialUnitMetadata.spatialUnitLevel === $scope.metadataImportSettings.lowestSpatialUnitForComputation){ - $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; - break; - } - } - - var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); - - if(topicHierarchy && topicHierarchy[0]){ - $scope.indicatorTopic_mainTopic = topicHierarchy[0]; - } - if(topicHierarchy && topicHierarchy[1]){ - $scope.indicatorTopic_subTopic = topicHierarchy[1]; - } - if(topicHierarchy && topicHierarchy[2]){ - $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; - } - if(topicHierarchy && topicHierarchy[3]){ - $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; - } - - $scope.indicatorNameFilter = undefined; - $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; - $scope.tmpIndicatorReference_referenceDescription = undefined; - - // tmp array to display indicatorReferences - $scope.indicatorReferences_adminView = []; - // array for API request (has less information per item) - $scope.indicatorReferences_apiRequest = []; - if($scope.metadataImportSettings.refrencesToOtherIndicators && $scope.metadataImportSettings.refrencesToOtherIndicators.length > 0){ - for (const indicatorReference of $scope.metadataImportSettings.refrencesToOtherIndicators) { - var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.indicatorId); - var referenceEntry = { - "referencedIndicatorName": indicatorMetadata.indicatorName, - "referencedIndicatorId": indicatorMetadata.indicatorId, - "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, - "referencedIndicatorDescription": indicatorReference.referenceDescription - }; - $scope.indicatorReferences_adminView.push(referenceEntry); - } - - } - - $scope.georesourceNameFilter = undefined; - $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; - $scope.tmpGeoresourceReference_referenceDescription = undefined; - // tmp array to display georesourceReferences - $scope.georesourceReferences_adminView = []; - // array for API request (has less information per item) - $scope.georesourceReferences_apiRequest = []; - - if($scope.metadataImportSettings.refrencesToGeoresources && $scope.metadataImportSettings.refrencesToGeoresources.length > 0){ - for (const georesourceReference of $scope.metadataImportSettings.refrencesToGeoresources) { - var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.georesourceId); - var geo_referenceEntry = { - "referencedGeoresourceName": georesourceMetadata.datasetName, - "referencedGeoresourceId": georesourceMetadata.georesourceId, - "referencedGeoresourceDescription": georesourceReference.referenceDescription - }; - $scope.georesourceReferences_adminView.push(geo_referenceEntry); - } - - } - - $scope.numClassesArray = [3,4,5,6,7,8]; - $scope.numClasses = $scope.numClassesArray[2]; - $scope.selectedColorBrewerPaletteEntry = undefined; - - for (const colorbrewerPalette of $scope.colorbrewerPalettes) { - if (colorbrewerPalette.paletteName === $scope.metadataImportSettings.defaultClassificationMapping.colorBrewerSchemeName){ - $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; - break; - } - } - - $scope.spatialUnitRefKeyProperty = undefined; - $scope.targetSpatialUnitMetadata = undefined; - $scope.$digest(); - }; - - $scope.onExportIndicatorEditMetadataTemplate = function(){ - - var metadataJSON = JSON.stringify($scope.indicatorMetadataStructure); - - var fileName = "Indikator_Metadaten_Vorlage_Export.json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - $scope.onExportIndicatorEditMetadata = function(){ - var metadataExport = $scope.indicatorMetadataStructure; - - metadataExport.metadata.note = $scope.metadata.note || ""; - metadataExport.metadata.literature = $scope.metadata.literature || ""; - metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; - metadataExport.metadata.datasource = $scope.metadata.datasource || ""; - metadataExport.metadata.contact = $scope.metadata.contact || ""; - metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; - metadataExport.metadata.description = $scope.metadata.description || ""; - metadataExport.metadata.databasis = $scope.metadata.databasis || ""; - metadataExport.datasetName = $scope.datasetName || ""; - - metadataExport.referenceDateNote = $scope.indicatorReferenceDateNote; - metadataExport.displayOrder = $scope.displayOrder; - - metadataExport.allowedRoles = []; - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - metadataExport.allowedRoles.push(roleId); - } - - if($scope.metadata.updateInterval){ - metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; - } - - var name = $scope.datasetName; - - // indicator specific properties - - metadataExport.abbreviation = $scope.indicatorAbbreviation || ""; - metadataExport.indicatorType = $scope.indicatorType ? $scope.indicatorType.apiName : ""; - metadataExport.creationType = $scope.indicatorCreationType ? $scope.indicatorCreationType.apiName : ""; - - metadataExport.characteristicValue = $scope.indicatorCharacteristicValue || ""; - metadataExport.isHeadlineIndicator = $scope.isHeadlineIndicator || false; - metadataExport.unit = $scope.indicatorUnit || ""; - metadataExport.processDescription = $scope.indicatorProcessDescription || ""; - metadataExport.tags = []; - - if($scope.indicatorTagsString_withCommas){ - var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); - for (const tagString of tags_splitted) { - metadataExport.tags.push(tagString.trim()); - } - } - - metadataExport.interpretation = $scope.indicatorInterpretation || ""; - metadataExport.lowestSpatialUnitForComputation = $scope.indicatorLowestSpatialUnitMetadataObjectForComputation? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : ""; - - if($scope.indicatorTopic_subsubsubTopic){ - metadataExport.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; - } - else if($scope.indicatorTopic_subsubTopic){ - metadataExport.topicReference = $scope.indicatorTopic_subsubTopic.topicId; - } - else if($scope.indicatorTopic_subTopic){ - metadataExport.topicReference = $scope.indicatorTopic_subTopic.topicId; - } - else if($scope.indicatorTopic_mainTopic){ - metadataExport.topicReference = $scope.indicatorTopic_mainTopic.topicId; - } - else { - metadataExport.topicReference = ""; - } - - metadataExport.refrencesToOtherIndicators = []; - - if($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0){ - metadataExport.refrencesToOtherIndicators = []; - - for (const indicRef of $scope.indicatorReferences_adminView) { - metadataExport.refrencesToOtherIndicators.push({ - "indicatorId": indicRef.referencedIndicatorId, - "referenceDescription": indicRef.referencedIndicatorDescription - }); - } - } - - metadataExport.refrencesToGeoresources = []; - - if($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0){ - metadataExport.refrencesToGeoresources = []; - - for (const geoRef of $scope.georesourceReferences_adminView) { - metadataExport.refrencesToGeoresources.push({ - "georesourceId": geoRef.referencedGeoresourceId, - "referenceDescription": geoRef.referencedGeoresourceDescription - }); - } - } - - var defaultClassificationMapping = { - "colorBrewerSchemeName" : $scope.selectedColorBrewerPaletteEntry ? $scope.selectedColorBrewerPaletteEntry.paletteName : "Blues", - "items": [ - { - "defaultColorAsHex": "#edf8e9", - "defaultCustomRating": "sehr niedrig" - }, - { - "defaultColorAsHex": "#bae4b3", - "defaultCustomRating": "niedrig" - }, - { - "defaultColorAsHex": "#74c476", - "defaultCustomRating": "mittel" - }, - { - "defaultColorAsHex": "#31a354", - "defaultCustomRating": "hoch" - }, - { - "defaultColorAsHex": "#006d2c", - "defaultCustomRating": "sehr hoch" - } - ] - }; - - metadataExport.defaultClassificationMapping = defaultClassificationMapping; - - - var metadataJSON = JSON.stringify(metadataExport); - - var fileName = "Indikatoren_Metadaten_Export"; - - if (name){ - fileName += "-" + name; - } - - fileName += ".json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - $scope.hideSuccessAlert = function(){ - $("#indicatorEditMetadataSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#indicatorEditMetadataErrorAlert").hide(); - }; - - $scope.hideMetadataErrorAlert = function(){ - $("#indicatorEditMetadataImportErrorAlert").hide(); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + 'kommonitorDataGridHelperService', + function IndicatorEditMetadataModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.currentIndicatorDataset; + /* POST BODY + { + + "refrencesToOtherIndicators": [ + { + "referenceDescription": "referenceDescription", + "indicatorId": "indicatorId" + }, + { + "referenceDescription": "referenceDescription", + "indicatorId": "indicatorId" + } + ], + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "allowedRoles": [ + "allowedRoles", + "allowedRoles" + ], + "datasetName": "datasetName", + "applicableSpatialUnit": "applicableSpatialUnit", + "abbreviation": "abbreviation", + "characteristicValue": "characteristicValue", + "tags": [ + "tags", + "tags" + ], + "creationType": "INSERTION", + "unit": "unit", + "topicReference": "topicReference", + "referenceDateNote": "optional note for indicator reference date", + "displayOrder": 0, + "refrencesToGeoresources": [ + { + "referenceDescription": "referenceDescription", + "georesourceId": "georesourceId" + }, + { + "referenceDescription": "referenceDescription", + "georesourceId": "georesourceId" + } + ], + "indicatorType": "STATUS_ABSOLUTE", + "interpretation": "interpretation", + "isHeadlineIndicator": false, + "processDescription": "processDescription", + "lowestSpatialUnitForComputation": "lowestSpatialUnitForComputation", + "defaultClassificationMapping": { + "colorBrewerSchemeName": "colorBrewerSchemeName", + "items": [ + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + }, + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + } + ] + } + } + */ + //Date picker + $('#indicatorEditLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + $scope.indicatorMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "refrencesToOtherIndicators": [ + { + "referenceDescription": "description about the reference", + "indicatorId": "ID of referenced indicator dataset" + } + ], + "refrencesToGeoresources": [ + { + "referenceDescription": "description about the reference", + "georesourceId": "ID of referenced georesource dataset" + } + ], + "datasetName": "Name of indicator dataset", + "abbreviation": "optional abbreviation of the indicator dataset", + "characteristicValue": "if the same datasetName is used for different indicators, the optional characteristicValue parameter may serve to distinguish between them (i.e. Habitants - male, Habitants - female, Habitants - diverse)", + "tags": [ + "optinal list of tags; each tag is a free text tag" + ], + "creationType": "INSERTION|COMPUTATION <-- enum parameter controls whether each timestamp must be updated manually (INSERTION) or if KomMonitor shall compute the indicator values for respective timestamps based on script file (COMPUTATION)", + "unit": "unit of the indicator", + "topicReference": "ID of the respective main/sub topic instance", + "indicatorType": "STATUS_ABSOLUTE|STATUS_RELATIVE|DYNAMIC_ABSOLUTE|DYNAMIC_RELATIVE|STATUS_STANDARDIZED|DYNAMIC_STANDARDIZED", + "interpretation": "interpretation hints for the user to better understand the indicator values", + "isHeadlineIndicator": "boolean parameter to indicate if indicator is a headline indicator", + "processDescription": "detailed description about the computation/creation of the indicator", + "lowestSpatialUnitForComputation": "the name of the lowest possible spatial unit for which an indicator of creationType=COMPUTATION may be computed. All other superior spatial units will be aggregated automatically", + "referenceDateNote": "optional note for indicator reference date", + "displayOrder": 0, + "defaultClassificationMapping": { + "colorBrewerSchemeName": "schema name of colorBrewer colorPalette to use for classification", + "items": [ + { + "defaultCustomRating": "a string to rate indicator values of this class", + "defaultColorAsHex": "color as hexadecimal value" + } + ] + } + }; + $scope.indicatorMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.indicatorMetadataStructure); + $scope.metadataImportSettings; + $scope.indicatorMetadataImportError; + $scope.indicatorAddMetadataImportErrorAlert; + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + $scope.roleManagementTableOptions = undefined; + $scope.datasetName = undefined; + $scope.indicatorAbbreviation = undefined; + $scope.indicatorType = undefined; + $scope.indicatorCharacteristicValue = undefined; + $scope.isHeadlineIndicator = false; + $scope.indicatorUnit = undefined; + $scope.enableFreeTextUnit = false; + $scope.indicatorProcessDescription = undefined; + $scope.indicatorTagsString_withCommas = undefined; + $scope.indicatorInterpretation = undefined; + $scope.indicatorCreationType = undefined; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; + $scope.enableLowestSpatialUnitSelect = false; + $scope.indicatorReferenceDateNote = undefined; + $scope.displayOrder = 0; + $scope.indicatorTopic_mainTopic = undefined; + $scope.indicatorTopic_subTopic = undefined; + $scope.indicatorTopic_subsubTopic = undefined; + $scope.indicatorTopic_subsubsubTopic = undefined; + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + $scope.numClassesArray = [3, 4, 5, 6, 7, 8]; + $scope.numClasses = $scope.numClassesArray[2]; + $scope.selectedColorBrewerPaletteEntry = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.colorbrewerSchemes = colorbrewer; + $scope.colorbreweSchemeName_dynamicIncrease = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; + $scope.colorbreweSchemeName_dynamicDecrease = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; + $scope.colorbrewerPalettes = []; + $scope.instantiateColorBrewerPalettes = function () { + for (const key in colorbrewer) { + if (colorbrewer.hasOwnProperty(key)) { + const colorPalettes = colorbrewer[key]; + var paletteEntry = { + "paletteName": key, + "paletteArrayObject": colorPalettes + }; + $scope.colorbrewerPalettes.push(paletteEntry); + } + } + // instantiate with palette 'Blues' + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + }; + $scope.instantiateColorBrewerPalettes(); + $scope.$on("onEditIndicatorMetadata", function (event, indicatorDataset) { + $scope.currentIndicatorDataset = indicatorDataset; + $scope.resetIndicatorEditMetadataForm(); + kommonitorMultiStepFormHelperService.registerClickHandler(); + }); + $scope.$on("availableRolesUpdate", function (event) { + let allowedRoles = $scope.currentIndicatorDataset ? $scope.currentIndicatorDataset.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + }); + $scope.resetIndicatorEditMetadataForm = function () { + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.datasetName = $scope.currentIndicatorDataset.indicatorName; + $scope.datasetNameInvalid = false; + $scope.indicatorReferenceDateNote = $scope.currentIndicatorDataset.referenceDateNote; + $scope.displayOrder = $scope.currentIndicatorDataset.displayOrder; + $scope.metadata = {}; + $scope.metadata.note = $scope.currentIndicatorDataset.metadata.note; + $scope.metadata.literature = $scope.currentIndicatorDataset.metadata.literature; + $scope.metadata.sridEPSG = 4326; + $scope.metadata.datasource = $scope.currentIndicatorDataset.metadata.datasource; + $scope.metadata.databasis = $scope.currentIndicatorDataset.metadata.databasis; + $scope.metadata.contact = $scope.currentIndicatorDataset.metadata.contact; + $scope.metadata.description = $scope.currentIndicatorDataset.metadata.description; + $scope.metadata.lastUpdate = $scope.currentIndicatorDataset.metadata.lastUpdate; + // $('#indicatorEditLastUpdateDatepicker').data({date: $scope.currentIndicatorDataset.metadata.lastUpdate}); + $('#indicatorEditLastUpdateDatepicker').datepicker('setDate', $scope.currentIndicatorDataset.metadata.lastUpdate); + kommonitorDataExchangeService.updateIntervalOptions.forEach(function (option) { + if (option.apiName === $scope.currentIndicatorDataset.metadata.updateInterval) { + $scope.metadata.updateInterval = option; + } + }); + let allowedRoles = $scope.currentIndicatorDataset ? $scope.currentIndicatorDataset.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + $scope.indicatorAbbreviation = $scope.currentIndicatorDataset.abbreviation; + kommonitorDataExchangeService.indicatorTypeOptions.forEach(function (option) { + if (option.apiName === $scope.currentIndicatorDataset.indicatorType) { + $scope.indicatorType = option; + } + }); + $scope.indicatorCharacteristicValue = $scope.currentIndicatorDataset.characteristicValue; + $scope.isHeadlineIndicator = $scope.currentIndicatorDataset.isHeadlineIndicator; + $scope.indicatorUnit = $scope.currentIndicatorDataset.unit; + $scope.enableFreeTextUnit = true; + kommonitorDataExchangeService.indicatorUnitOptions.forEach(function (option) { + if (option === $scope.currentIndicatorDataset.unit) { + // if the unit is in list of known units then disable freeText + $scope.enableFreeTextUnit = false; + } + }); + $scope.indicatorProcessDescription = $scope.currentIndicatorDataset.processDescription; + $scope.indicatorTagsString_withCommas = ""; + for (let index = 0; index < $scope.currentIndicatorDataset.tags.length; index++) { + $scope.indicatorTagsString_withCommas += $scope.currentIndicatorDataset.tags[index]; + if (index < $scope.currentIndicatorDataset.tags.length - 1) { + $scope.indicatorTagsString_withCommas += ","; + } + } + if (!$scope.currentIndicatorDataset.tags || $scope.currentIndicatorDataset.tags.length === 0) { + $scope.indicatorTagsString_withCommas = undefined; + } + $scope.indicatorInterpretation = $scope.currentIndicatorDataset.interpretation; + kommonitorDataExchangeService.indicatorCreationTypeOptions.forEach(function (option) { + if (option.apiName === $scope.currentIndicatorDataset.creationType) { + $scope.indicatorCreationType = option; + } + }); + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; + for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; + if (spatialUnitMetadata.spatialUnitLevel === $scope.currentIndicatorDataset.lowestSpatialUnitForComputation) { + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; + break; + } + } + if ($scope.indicatorCreationType.apiName === "COMPUTATION") { + $scope.enableLowestSpatialUnitSelect = true; + } + else { + $scope.enableLowestSpatialUnitSelect = false; + } + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.currentIndicatorDataset.topicReference); + if (topicHierarchy && topicHierarchy[0]) { + $scope.indicatorTopic_mainTopic = topicHierarchy[0]; + } + if (topicHierarchy && topicHierarchy[1]) { + $scope.indicatorTopic_subTopic = topicHierarchy[1]; + } + if (topicHierarchy && topicHierarchy[2]) { + $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; + } + if (topicHierarchy && topicHierarchy[3]) { + $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; + } + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + if ($scope.currentIndicatorDataset.referencedIndicators && $scope.currentIndicatorDataset.referencedIndicators.length > 0) { + for (const indicatorReference of $scope.currentIndicatorDataset.referencedIndicators) { + var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.referencedIndicatorId); + var referenceEntry = { + "referencedIndicatorName": indicatorMetadata.indicatorName, + "referencedIndicatorId": indicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, + "referencedIndicatorDescription": indicatorReference.referencedIndicatorDescription + }; + $scope.indicatorReferences_adminView.push(referenceEntry); + } + } + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + if ($scope.currentIndicatorDataset.referencedGeoresources && $scope.currentIndicatorDataset.referencedGeoresources.length > 0) { + for (const georesourceReference of $scope.currentIndicatorDataset.referencedGeoresources) { + var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.referencedGeoresourceId); + var geo_referenceEntry = { + "referencedGeoresourceName": georesourceMetadata.datasetName, + "referencedGeoresourceId": georesourceMetadata.georesourceId, + "referencedGeoresourceDescription": georesourceReference.referencedGeoresourceDescription + }; + $scope.georesourceReferences_adminView.push(geo_referenceEntry); + } + } + $scope.numClassesArray = [3, 4, 5, 6, 7, 8]; + $scope.numClasses = $scope.numClassesArray[2]; + // instantiate with palette 'Blues' + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + for (const colorbrewerPalette of $scope.colorbrewerPalettes) { + if (colorbrewerPalette.paletteName === $scope.currentIndicatorDataset.defaultClassificationMapping.colorBrewerSchemeName) { + $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; + break; + } + } + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $("#indicatorEditMetadataSuccessAlert").hide(); + $("#indicatorEditMetadataErrorAlert").hide(); + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickColorBrewerEntry = function (colorPaletteEntry) { + $scope.selectedColorBrewerPaletteEntry = colorPaletteEntry; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onAddOrUpdateIndicatorReference = function () { + var tmpIndicatorReference_adminView = { + "referencedIndicatorName": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorName, + "referencedIndicatorId": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": $scope.tmpIndicatorReference_selectedIndicatorMetadata.abbreviation, + "referencedIndicatorDescription": $scope.tmpIndicatorReference_referenceDescription + }; + var processed = false; + for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { + var indicatorReference_adminView = $scope.indicatorReferences_adminView[index]; + if (indicatorReference_adminView.referencedIndicatorId === tmpIndicatorReference_adminView.referencedIndicatorId) { + // replace object + $scope.indicatorReferences_adminView[index] = tmpIndicatorReference_adminView; + processed = true; + break; + } + } + if (!processed) { + // new entry + $scope.indicatorReferences_adminView.push(tmpIndicatorReference_adminView); + } + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickEditIndicatorReference = function (indicatorReference_adminView) { + $scope.tmpIndicatorReference_selectedIndicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference_adminView.referencedIndicatorId); + $scope.tmpIndicatorReference_referenceDescription = indicatorReference_adminView.referencedIndicatorDescription; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickDeleteIndicatorReference = function (indicatorReference_adminView) { + for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { + if ($scope.indicatorReferences_adminView[index].referencedIndicatorId === indicatorReference_adminView.referencedIndicatorId) { + // remove object + $scope.indicatorReferences_adminView.splice(index, 1); + break; + } + } + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onAddOrUpdateGeoresourceReference = function () { + var tmpGeoresourceReference_adminView = { + "referencedGeoresourceName": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.datasetName, + "referencedGeoresourceId": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.georesourceId, + "referencedGeoresourceDescription": $scope.tmpGeoresourceReference_referenceDescription + }; + var processed = false; + for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { + var georesourceReference_adminView = $scope.georesourceReferences_adminView[index]; + if (georesourceReference_adminView.referencedGeoresourceId === tmpGeoresourceReference_adminView.referencedGeoresourceId) { + // replace object + $scope.georesourceReferences_adminView[index] = tmpGeoresourceReference_adminView; + processed = true; + break; + } + } + if (!processed) { + // new entry + $scope.georesourceReferences_adminView.push(tmpGeoresourceReference_adminView); + } + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickEditGeoresourceReference = function (georesourceReference_adminView) { + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference_adminView.referencedGeoresourceId); + $scope.tmpGeoresourceReference_referenceDescription = georesourceReference_adminView.referencedGeoresourceDescription; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickDeleteGeoresourceReference = function (georesourceReference_adminView) { + for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { + if ($scope.georesourceReferences_adminView[index].referencedGeoresourceId === georesourceReference_adminView.referencedGeoresourceId) { + // remove object + $scope.georesourceReferences_adminView.splice(index, 1); + break; + } + } + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onChangeCreationType = function () { + if ($scope.indicatorCreationType.apiName === "COMPUTATION") { + $scope.enableLowestSpatialUnitSelect = true; + } + else { + $scope.enableLowestSpatialUnitSelect = false; + } + }; + $scope.onChangeIndicatorUnit = function () { + if ($scope.indicatorUnit.includes("Freitext")) { + $scope.enableFreeTextUnit = true; + } + else { + $scope.enableFreeTextUnit = false; + } + }; + $scope.checkDatasetName = function () { + $scope.datasetNameInvalid = false; + kommonitorDataExchangeService.availableIndicators.forEach(function (indicator) { + if (indicator.indicatorName === $scope.datasetName) { + $scope.datasetNameInvalid = true; + return; + } + }); + }; + $scope.buildPatchBody_indicators = function () { + var patchBody = { + "metadata": { + "note": $scope.metadata.note || null, + "literature": $scope.metadata.literature || null, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG || 4326, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description || null, + "databasis": $scope.metadata.databasis || null + }, + "refrencesToOtherIndicators": [], + "allowedRoles": [], + "datasetName": $scope.datasetName, + "abbreviation": $scope.indicatorAbbreviation || null, + "characteristicValue": $scope.indicatorCharacteristicValue || null, + "tags": [], + "creationType": $scope.indicatorCreationType.apiName, + "unit": $scope.indicatorUnit, + "topicReference": "", + "refrencesToGeoresources": [], + "indicatorType": $scope.indicatorType.apiName, + "interpretation": $scope.indicatorInterpretation || "", + "isHeadlineIndicator": $scope.isHeadlineIndicator || false, + "processDescription": $scope.indicatorProcessDescription || "", + "referenceDateNote": $scope.indicatorReferenceDateNote || "", + "displayOrder": $scope.displayOrder, + "lowestSpatialUnitForComputation": $scope.indicatorLowestSpatialUnitMetadataObjectForComputation ? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : null, + "defaultClassificationMapping": { + "colorBrewerSchemeName": $scope.selectedColorBrewerPaletteEntry.paletteName, + "items": [ + { + "defaultColorAsHex": "#edf8e9", + "defaultCustomRating": "sehr niedrig" + }, + { + "defaultColorAsHex": "#bae4b3", + "defaultCustomRating": "niedrig" + }, + { + "defaultColorAsHex": "#74c476", + "defaultCustomRating": "mittel" + }, + { + "defaultColorAsHex": "#31a354", + "defaultCustomRating": "hoch" + }, + { + "defaultColorAsHex": "#006d2c", + "defaultCustomRating": "sehr hoch" + } + ] + } + }; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + patchBody.allowedRoles.push(roleId); + } + // TAGS + if ($scope.indicatorTagsString_withCommas) { + var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); + for (const tagString of tags_splitted) { + patchBody.tags.push(tagString.trim()); + } + } + // TOPIC REFERENCE + if ($scope.indicatorTopic_subsubsubTopic) { + patchBody.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; + } + else if ($scope.indicatorTopic_subsubTopic) { + patchBody.topicReference = $scope.indicatorTopic_subsubTopic.topicId; + } + else if ($scope.indicatorTopic_subTopic) { + patchBody.topicReference = $scope.indicatorTopic_subTopic.topicId; + } + else if ($scope.indicatorTopic_mainTopic) { + patchBody.topicReference = $scope.indicatorTopic_mainTopic.topicId; + } + else { + patchBody.topicReference = ""; + } + // REFERENCES + if ($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0) { + patchBody.refrencesToOtherIndicators = []; + for (const indicRef of $scope.indicatorReferences_adminView) { + patchBody.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } + } + if ($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0) { + patchBody.refrencesToGeoresources = []; + for (const geoRef of $scope.georesourceReferences_adminView) { + patchBody.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + return patchBody; + }; + $scope.editIndicatorMetadata = function () { + var patchBody = $scope.buildPatchBody_indicators(); + // TODO verify input + // TODO Create and perform POST Request with loading screen + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId, + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.successMessagePart = $scope.datasetName; + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + $("#indicatorEditMetadataSuccessAlert").show(); + $scope.loadingData = false; + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#indicatorEditMetadataErrorAlert").show(); + $scope.loadingData = false; + // setTimeout(function() { + // $("#indicatorEditMetadataSuccessAlert").hide(); + // }, 3000); + }); + }; + $scope.onImportIndicatorEditMetadata = function () { + $scope.indicatorMetadataImportError = ""; + $("#indicatorEditMetadataImportFile").files = []; + // trigger file chooser + $("#indicatorEditMetadataImportFile").click(); + }; + $(document).on("change", "#indicatorEditMetadataImportFile", function () { + console.log("Importing Indicator metadata for Edit Indicator Form"); + // get the file + var file = document.getElementById('indicatorEditMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + $scope.parseMetadataFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMetadataFile(event); + } + catch (error) { + console.error("Uploaded Metadata File cannot be parsed."); + $scope.indicatorMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("indicatorsEditMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorEditMetadataImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMetadataFile = function (event) { + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + if (!$scope.metadataImportSettings.metadata) { + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorAddMetadataImportErrorAlert").show(); + $scope.$digest(); + } + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function (option) { + if (option.apiName === $scope.metadataImportSettings.metadata.updateInterval) { + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#indicatorAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + $scope.datasetName = $scope.metadataImportSettings.datasetName; + $scope.indicatorReferenceDateNote = $scope.metadataImportSettings.referenceDateNote; + $scope.displayOrder = $scope.metadataImportSettings.displayOrder; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + // indicator specific properties + $scope.indicatorAbbreviation = $scope.metadataImportSettings.abbreviation; + for (const indicatorTypeOption of kommonitorDataExchangeService.indicatorTypeOptions) { + if (indicatorTypeOption.apiName === $scope.metadataImportSettings.indicatorType) { + $scope.indicatorType = indicatorTypeOption; + break; + } + } + for (const indicatorCreationTypeOption of kommonitorDataExchangeService.indicatorCreationTypeOptions) { + if (indicatorCreationTypeOption.apiName === $scope.metadataImportSettings.creationType) { + $scope.indicatorCreationType = indicatorCreationTypeOption; + if (indicatorCreationTypeOption.apiName === "COMPUTATION") { + $scope.enableLowestSpatialUnitSelect = true; + } + else { + $scope.enableLowestSpatialUnitSelect = false; + } + break; + } + } + $scope.indicatorCharacteristicValue = $scope.metadataImportSettings.characteristicValue; + $scope.isHeadlineIndicator = $scope.metadataImportSettings.isHeadlineIndicator; + $scope.indicatorUnit = $scope.metadataImportSettings.unit; + if (kommonitorDataExchangeService.indicatorUnitOptions.includes($scope.metadataImportSettings.unit)) { + $scope.enableFreeTextUnit = false; + } + else { + $scope.enableFreeTextUnit = true; + } + $scope.indicatorProcessDescription = $scope.metadataImportSettings.processDescription; + $scope.indicatorTagsString_withCommas = undefined; + if ($scope.metadataImportSettings.tags && $scope.metadataImportSettings.tags.length > 0) { + $scope.indicatorTagsString_withCommas = ""; + for (let index = 0; index < $scope.metadataImportSettings.tags.length; index++) { + $scope.indicatorTagsString_withCommas += $scope.metadataImportSettings.tags[index]; + if (index < $scope.metadataImportSettings.tags.length - 1) { + $scope.indicatorTagsString_withCommas += ","; + } + } + } + $scope.indicatorInterpretation = $scope.metadataImportSettings.interpretation; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; + for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; + if (spatialUnitMetadata.spatialUnitLevel === $scope.metadataImportSettings.lowestSpatialUnitForComputation) { + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; + break; + } + } + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); + if (topicHierarchy && topicHierarchy[0]) { + $scope.indicatorTopic_mainTopic = topicHierarchy[0]; + } + if (topicHierarchy && topicHierarchy[1]) { + $scope.indicatorTopic_subTopic = topicHierarchy[1]; + } + if (topicHierarchy && topicHierarchy[2]) { + $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; + } + if (topicHierarchy && topicHierarchy[3]) { + $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; + } + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + if ($scope.metadataImportSettings.refrencesToOtherIndicators && $scope.metadataImportSettings.refrencesToOtherIndicators.length > 0) { + for (const indicatorReference of $scope.metadataImportSettings.refrencesToOtherIndicators) { + var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.indicatorId); + var referenceEntry = { + "referencedIndicatorName": indicatorMetadata.indicatorName, + "referencedIndicatorId": indicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, + "referencedIndicatorDescription": indicatorReference.referenceDescription + }; + $scope.indicatorReferences_adminView.push(referenceEntry); + } + } + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + if ($scope.metadataImportSettings.refrencesToGeoresources && $scope.metadataImportSettings.refrencesToGeoresources.length > 0) { + for (const georesourceReference of $scope.metadataImportSettings.refrencesToGeoresources) { + var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.georesourceId); + var geo_referenceEntry = { + "referencedGeoresourceName": georesourceMetadata.datasetName, + "referencedGeoresourceId": georesourceMetadata.georesourceId, + "referencedGeoresourceDescription": georesourceReference.referenceDescription + }; + $scope.georesourceReferences_adminView.push(geo_referenceEntry); + } + } + $scope.numClassesArray = [3, 4, 5, 6, 7, 8]; + $scope.numClasses = $scope.numClassesArray[2]; + $scope.selectedColorBrewerPaletteEntry = undefined; + for (const colorbrewerPalette of $scope.colorbrewerPalettes) { + if (colorbrewerPalette.paletteName === $scope.metadataImportSettings.defaultClassificationMapping.colorBrewerSchemeName) { + $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; + break; + } + } + $scope.spatialUnitRefKeyProperty = undefined; + $scope.targetSpatialUnitMetadata = undefined; + $scope.$digest(); + }; + $scope.onExportIndicatorEditMetadataTemplate = function () { + var metadataJSON = JSON.stringify($scope.indicatorMetadataStructure); + var fileName = "Indikator_Metadaten_Vorlage_Export.json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onExportIndicatorEditMetadata = function () { + var metadataExport = $scope.indicatorMetadataStructure; + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.datasetName = $scope.datasetName || ""; + metadataExport.referenceDateNote = $scope.indicatorReferenceDateNote; + metadataExport.displayOrder = $scope.displayOrder; + metadataExport.allowedRoles = []; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + if ($scope.metadata.updateInterval) { + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + var name = $scope.datasetName; + // indicator specific properties + metadataExport.abbreviation = $scope.indicatorAbbreviation || ""; + metadataExport.indicatorType = $scope.indicatorType ? $scope.indicatorType.apiName : ""; + metadataExport.creationType = $scope.indicatorCreationType ? $scope.indicatorCreationType.apiName : ""; + metadataExport.characteristicValue = $scope.indicatorCharacteristicValue || ""; + metadataExport.isHeadlineIndicator = $scope.isHeadlineIndicator || false; + metadataExport.unit = $scope.indicatorUnit || ""; + metadataExport.processDescription = $scope.indicatorProcessDescription || ""; + metadataExport.tags = []; + if ($scope.indicatorTagsString_withCommas) { + var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); + for (const tagString of tags_splitted) { + metadataExport.tags.push(tagString.trim()); + } + } + metadataExport.interpretation = $scope.indicatorInterpretation || ""; + metadataExport.lowestSpatialUnitForComputation = $scope.indicatorLowestSpatialUnitMetadataObjectForComputation ? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : ""; + if ($scope.indicatorTopic_subsubsubTopic) { + metadataExport.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; + } + else if ($scope.indicatorTopic_subsubTopic) { + metadataExport.topicReference = $scope.indicatorTopic_subsubTopic.topicId; + } + else if ($scope.indicatorTopic_subTopic) { + metadataExport.topicReference = $scope.indicatorTopic_subTopic.topicId; + } + else if ($scope.indicatorTopic_mainTopic) { + metadataExport.topicReference = $scope.indicatorTopic_mainTopic.topicId; + } + else { + metadataExport.topicReference = ""; + } + metadataExport.refrencesToOtherIndicators = []; + if ($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0) { + metadataExport.refrencesToOtherIndicators = []; + for (const indicRef of $scope.indicatorReferences_adminView) { + metadataExport.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } + } + metadataExport.refrencesToGeoresources = []; + if ($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0) { + metadataExport.refrencesToGeoresources = []; + for (const geoRef of $scope.georesourceReferences_adminView) { + metadataExport.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + var defaultClassificationMapping = { + "colorBrewerSchemeName": $scope.selectedColorBrewerPaletteEntry ? $scope.selectedColorBrewerPaletteEntry.paletteName : "Blues", + "items": [ + { + "defaultColorAsHex": "#edf8e9", + "defaultCustomRating": "sehr niedrig" + }, + { + "defaultColorAsHex": "#bae4b3", + "defaultCustomRating": "niedrig" + }, + { + "defaultColorAsHex": "#74c476", + "defaultCustomRating": "mittel" + }, + { + "defaultColorAsHex": "#31a354", + "defaultCustomRating": "hoch" + }, + { + "defaultColorAsHex": "#006d2c", + "defaultCustomRating": "sehr hoch" + } + ] + }; + metadataExport.defaultClassificationMapping = defaultClassificationMapping; + var metadataJSON = JSON.stringify(metadataExport); + var fileName = "Indikatoren_Metadaten_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.hideSuccessAlert = function () { + $("#indicatorEditMetadataSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#indicatorEditMetadataErrorAlert").hide(); + }; + $scope.hideMetadataErrorAlert = function () { + $("#indicatorEditMetadataImportErrorAlert").hide(); + }; + } + ] +}); +//# sourceMappingURL=indicator-edit-metadata-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.js.map new file mode 100644 index 000000000..377773cad --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-edit-metadata-modal.component.js","sourceRoot":"","sources":["indicator-edit-metadata-modal.component.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,SAAS,CAAC,4BAA4B,EAAE;IACpF,WAAW,EAAG,6HAA6H;IAC3I,UAAU,EAAG,CAAC,+BAA+B,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,sCAAsC;QAC1I,iCAAiC;QACjC,SAAS,oCAAoC,CAAC,6BAA6B,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EACtH,oCAAoC,EAAE,+BAA+B;YAEtE,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;YAE3E,MAAM,CAAC,uBAAuB,CAAC;YAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAsEE;YAEF,aAAa;YACb,CAAC,CAAC,oCAAoC,CAAC,CAAC,UAAU,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;YAEpG,MAAM,CAAC,0BAA0B,GAAG;gBACnC,UAAU,EAAE;oBACX,MAAM,EAAE,kBAAkB;oBAC1B,YAAY,EAAE,gCAAgC;oBAC9C,gBAAgB,EAAE,gDAAgD;oBAClE,UAAU,EAAE,IAAI;oBAChB,YAAY,EAAE,wBAAwB;oBACtC,SAAS,EAAE,4BAA4B;oBACvC,YAAY,EAAE,YAAY;oBAC1B,aAAa,EAAE,wCAAwC;oBACvD,WAAW,EAAE,uBAAuB;iBACpC;gBACD,cAAc,EAAE,CAAC,QAAQ,CAAC;gBAC1B,4BAA4B,EAAE;oBAC7B;wBACE,sBAAsB,EAAE,iCAAiC;wBACzD,aAAa,EAAE,oCAAoC;qBACpD;iBACC;gBACD,yBAAyB,EAAE;oBAC5B;wBACE,sBAAsB,EAAE,iCAAiC;wBACzD,eAAe,EAAE,sCAAsC;qBACxD;iBACC;gBACH,aAAa,EAAE,2BAA2B;gBAC1C,cAAc,EAAE,gDAAgD;gBAChE,qBAAqB,EAAE,6MAA6M;gBACpO,MAAM,EAAE;oBACP,mDAAmD;iBACnD;gBACD,cAAc,EAAE,iOAAiO;gBACjP,MAAM,EAAE,uBAAuB;gBAC/B,gBAAgB,EAAE,8CAA8C;gBAChE,eAAe,EAAE,4GAA4G;gBAC7H,gBAAgB,EAAE,6EAA6E;gBAC/F,qBAAqB,EAAE,oEAAoE;gBAC3F,oBAAoB,EAAE,sEAAsE;gBAC5F,iCAAiC,EAAE,oLAAoL;gBACvN,mBAAmB,EAAE,4CAA4C;gBACjE,cAAc,EAAE,CAAC;gBACjB,8BAA8B,EAAE;oBAC/B,uBAAuB,EAAE,mEAAmE;oBAC5F,OAAO,EAAE;wBACR;4BACC,qBAAqB,EAAE,iDAAiD;4BACxE,mBAAmB,EAAE,4BAA4B;yBACjD;qBACD;iBACD;aACD,CAAC;YAEF,MAAM,CAAC,iCAAiC,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;YAEhI,MAAM,CAAC,sBAAsB,CAAC;YAC9B,MAAM,CAAC,4BAA4B,CAAC;YACpC,MAAM,CAAC,oCAAoC,CAAC;YAE5C,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;YAC/B,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAElC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,cAAc,GAAG,SAAS,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;YACrC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC;YACpC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC;YAExC,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC;YAG9C,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;YAC9B,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;YACzC,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC;YACjC,MAAM,CAAC,4BAA4B,GAAG,SAAS,CAAC;YAChD,MAAM,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACnC,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC;YACjC,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAClC,MAAM,CAAC,2BAA2B,GAAG,SAAS,CAAC;YAC/C,MAAM,CAAC,8BAA8B,GAAG,SAAS,CAAC;YAClD,MAAM,CAAC,uBAAuB,GAAG,SAAS,CAAC;YAC3C,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;YACzC,MAAM,CAAC,sDAAsD,GAAG,SAAS,CAAC;YAC1E,MAAM,CAAC,6BAA6B,GAAG,KAAK,CAAC;YAE7C,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC;YAC9C,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;YAExB,MAAM,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC5C,MAAM,CAAC,uBAAuB,GAAG,SAAS,CAAC;YAC3C,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC;YAC9C,MAAM,CAAC,6BAA6B,GAAG,SAAS,CAAC;YAEjD,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;YACvC,MAAM,CAAC,+CAA+C,GAAG,SAAS,CAAC;YACnE,MAAM,CAAC,0CAA0C,GAAG,SAAS,CAAC;YAC9D,2CAA2C;YAC3C,MAAM,CAAC,6BAA6B,GAAG,EAAE,CAAC;YAC1C,wDAAwD;YACxD,MAAM,CAAC,8BAA8B,GAAG,EAAE,CAAC;YAE3C,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;YACzC,MAAM,CAAC,mDAAmD,GAAG,SAAS,CAAC;YACvE,MAAM,CAAC,4CAA4C,GAAG,SAAS,CAAC;YAChE,6CAA6C;YAC7C,MAAM,CAAC,+BAA+B,GAAG,EAAE,CAAC;YAC5C,wDAAwD;YACxD,MAAM,CAAC,gCAAgC,GAAG,EAAE,CAAC;YAE7C,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,+BAA+B,GAAG,SAAS,CAAC;YAEpD,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAEpC,MAAM,CAAC,kBAAkB,GAAG,WAAW,CAAC;YACxC,MAAM,CAAC,oCAAoC,GAAG,KAAK,CAAC,mDAAmD,CAAC;YACxG,MAAM,CAAC,oCAAoC,GAAG,KAAK,CAAC,mDAAmD,CAAC;YACxG,MAAM,CAAC,mBAAmB,GAAG,EAAE,CAAC;YAGhC,MAAM,CAAC,8BAA8B,GAAG;gBACvC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;oBAC9B,IAAI,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;wBACpC,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;wBAEvC,IAAI,YAAY,GAAG;4BAClB,aAAa,EAAE,GAAG;4BAClB,oBAAoB,EAAE,aAAa;yBACnC,CAAC;wBAEF,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;qBAC9C;iBACD;gBAED,mCAAmC;gBACnC,MAAM,CAAC,+BAA+B,GAAG,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAEzE,CAAC,CAAC;YAEF,MAAM,CAAC,8BAA8B,EAAE,CAAC;YAExC,MAAM,CAAC,GAAG,CAAC,yBAAyB,EAAE,UAAU,KAAK,EAAE,gBAAgB;gBAEtE,MAAM,CAAC,uBAAuB,GAAG,gBAAgB,CAAC;gBAElD,MAAM,CAAC,8BAA8B,EAAE,CAAC;gBACxC,oCAAoC,CAAC,oBAAoB,EAAE,CAAC;YAE7D,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,UAAU,KAAK;gBACjD,IAAI,YAAY,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrG,MAAM,CAAC,0BAA0B,GAAG,+BAA+B,CAAC,uBAAuB,CAAC,kCAAkC,EAAE,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YAC/N,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,8BAA8B,GAAG;gBAEvC,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAEpC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC,aAAa,CAAC;gBAClE,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAElC,MAAM,CAAC,0BAA0B,GAAG,MAAM,CAAC,uBAAuB,CAAC,iBAAiB,CAAC;gBACrF,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,uBAAuB,CAAC,YAAY,CAAC;gBAElE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACpE,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAChF,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAChC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAChF,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC9E,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1E,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAElF,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAChF,4GAA4G;gBAC5G,CAAC,CAAC,oCAAoC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAElH,6BAA6B,CAAC,qBAAqB,CAAC,OAAO,CAAC,UAAS,MAAM;oBAC1E,IAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,uBAAuB,CAAC,QAAQ,CAAC,cAAc,EAAC;wBAC5E,MAAM,CAAC,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC;qBACxC;gBACF,CAAC,CAAC,CAAC;gBAEH,IAAI,YAAY,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrG,MAAM,CAAC,0BAA0B,GAAG,+BAA+B,CAAC,uBAAuB,CAAC,kCAAkC,EAAE,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBAE9N,MAAM,CAAC,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,YAAY,CAAC;gBAE3E,6BAA6B,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAS,MAAM;oBACzE,IAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,uBAAuB,CAAC,aAAa,EAAC;wBAClE,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;qBAC9B;gBACF,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,4BAA4B,GAAG,MAAM,CAAC,uBAAuB,CAAC,mBAAmB,CAAC;gBACzF,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,uBAAuB,CAAC,mBAAmB,CAAC;gBAChF,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC;gBAE3D,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBACjC,6BAA6B,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAS,MAAM;oBACzE,IAAG,MAAM,KAAK,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAC;wBACjD,8DAA8D;wBAC9D,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;qBAClC;gBACF,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,2BAA2B,GAAG,MAAM,CAAC,uBAAuB,CAAC,kBAAkB,CAAC;gBACvF,MAAM,CAAC,8BAA8B,GAAG,EAAE,CAAC;gBAE3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAChF,MAAM,CAAC,8BAA8B,IAAI,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAEpF,IAAG,KAAK,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAC;wBACzD,MAAM,CAAC,8BAA8B,IAAI,GAAG,CAAC;qBAC7C;iBACD;gBAED,IAAI,CAAE,MAAM,CAAC,uBAAuB,CAAC,IAAI,IAAI,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAC;oBAC7F,MAAM,CAAC,8BAA8B,GAAG,SAAS,CAAC;iBAClD;gBAED,MAAM,CAAC,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC,cAAc,CAAC;gBAE/E,6BAA6B,CAAC,4BAA4B,CAAC,OAAO,CAAC,UAAS,MAAM;oBACjF,IAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,uBAAuB,CAAC,YAAY,EAAC;wBACjE,MAAM,CAAC,qBAAqB,GAAG,MAAM,CAAC;qBACtC;gBACF,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,sDAAsD,GAAG,SAAS,CAAC;gBAE1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,6BAA6B,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACpF,MAAM,mBAAmB,GAAG,6BAA6B,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;oBAEnF,IAAG,mBAAmB,CAAC,gBAAgB,KAAK,MAAM,CAAC,uBAAuB,CAAC,+BAA+B,EAAC;wBAC1G,MAAM,CAAC,sDAAsD,GAAG,mBAAmB,CAAC;wBACpF,MAAM;qBACN;iBACD;gBAED,IAAG,MAAM,CAAC,qBAAqB,CAAC,OAAO,KAAK,aAAa,EAAC;oBACzD,MAAM,CAAC,6BAA6B,GAAG,IAAI,CAAC;iBAC5C;qBACG;oBACH,MAAM,CAAC,6BAA6B,GAAG,KAAK,CAAC;iBAC7C;gBAED,IAAI,cAAc,GAAG,6BAA6B,CAAC,2BAA2B,CAAC,MAAM,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;gBAE7H,IAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAC;oBACtC,MAAM,CAAC,wBAAwB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;iBACpD;gBACD,IAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAC;oBACtC,MAAM,CAAC,uBAAuB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;iBACnD;gBACD,IAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAC;oBACtC,MAAM,CAAC,0BAA0B,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;iBACtD;gBACD,IAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAC;oBACtC,MAAM,CAAC,6BAA6B,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;iBACzD;gBAED,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;gBACvC,MAAM,CAAC,+CAA+C,GAAG,SAAS,CAAC;gBACnE,MAAM,CAAC,0CAA0C,GAAG,SAAS,CAAC;gBAE9D,2CAA2C;gBAC3C,MAAM,CAAC,6BAA6B,GAAG,EAAE,CAAC;gBAC1C,wDAAwD;gBACxD,MAAM,CAAC,8BAA8B,GAAG,EAAE,CAAC;gBAC3C,IAAG,MAAM,CAAC,uBAAuB,CAAC,oBAAoB,IAAI,MAAM,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAC;oBACxH,KAAK,MAAM,kBAAkB,IAAI,MAAM,CAAC,uBAAuB,CAAC,oBAAoB,EAAE;wBACrF,IAAI,iBAAiB,GAAG,6BAA6B,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;wBACzH,IAAI,cAAc,GAAG;4BACpB,yBAAyB,EAAE,iBAAiB,CAAC,aAAa;4BAC1D,uBAAuB,EAAE,iBAAiB,CAAC,WAAW;4BACtD,iCAAiC,EAAE,iBAAiB,CAAC,YAAY;4BACjE,gCAAgC,EAAE,kBAAkB,CAAC,8BAA8B;yBACnF,CAAC;wBACF,MAAM,CAAC,6BAA6B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;qBAC1D;iBAED;gBAED,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;gBACzC,MAAM,CAAC,mDAAmD,GAAG,SAAS,CAAC;gBACvE,MAAM,CAAC,4CAA4C,GAAG,SAAS,CAAC;gBAChE,6CAA6C;gBAC7C,MAAM,CAAC,+BAA+B,GAAG,EAAE,CAAC;gBAC5C,wDAAwD;gBACxD,MAAM,CAAC,gCAAgC,GAAG,EAAE,CAAC;gBAE7C,IAAG,MAAM,CAAC,uBAAuB,CAAC,sBAAsB,IAAI,MAAM,CAAC,uBAAuB,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAC;oBAC5H,KAAK,MAAM,oBAAoB,IAAI,MAAM,CAAC,uBAAuB,CAAC,sBAAsB,EAAE;wBACzF,IAAI,mBAAmB,GAAG,6BAA6B,CAAC,0BAA0B,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,CAAC;wBACjI,IAAI,kBAAkB,GAAG;4BACxB,2BAA2B,EAAE,mBAAmB,CAAC,WAAW;4BAC5D,yBAAyB,EAAE,mBAAmB,CAAC,aAAa;4BAC5D,kCAAkC,EAAE,oBAAoB,CAAC,gCAAgC;yBACzF,CAAC;wBACF,MAAM,CAAC,+BAA+B,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;qBAChE;iBAED;gBAED,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;gBACvC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAE9C,mCAAmC;gBACnC,MAAM,CAAC,+BAA+B,GAAG,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;gBAExE,KAAK,MAAM,kBAAkB,IAAI,MAAM,CAAC,mBAAmB,EAAE;oBAC5D,IAAI,kBAAkB,CAAC,WAAW,KAAK,MAAM,CAAC,uBAAuB,CAAC,4BAA4B,CAAC,qBAAqB,EAAC;wBACxH,MAAM,CAAC,+BAA+B,GAAG,kBAAkB,CAAC;wBAC5D,MAAM;qBACN;iBACD;gBAEF,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBACpC,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/C,CAAC,CAAC,kCAAkC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAE7C,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,uBAAuB,GAAG,UAAS,iBAAiB;gBAC1D,MAAM,CAAC,+BAA+B,GAAG,iBAAiB,CAAC;gBAE3D,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,+BAA+B,GAAG;gBACxC,IAAI,+BAA+B,GAAG;oBACrC,yBAAyB,EAAE,MAAM,CAAC,+CAA+C,CAAC,aAAa;oBAC/F,uBAAuB,EAAE,MAAM,CAAC,+CAA+C,CAAC,WAAW;oBAC3F,iCAAiC,EAAE,MAAM,CAAC,+CAA+C,CAAC,YAAY;oBACtG,gCAAgC,EAAE,MAAM,CAAC,0CAA0C;iBACnF,CAAC;gBAEF,IAAI,SAAS,GAAG,KAAK,CAAC;gBAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBACjF,IAAI,4BAA4B,GAAG,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;oBAE/E,IAAI,4BAA4B,CAAC,qBAAqB,KAAK,+BAA+B,CAAC,qBAAqB,EAAC;wBAChH,iBAAiB;wBACjB,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,GAAG,+BAA+B,CAAC;wBAC9E,SAAS,GAAG,IAAI,CAAC;wBACjB,MAAM;qBACN;iBACD;gBAED,IAAG,CAAE,SAAS,EAAC;oBACd,YAAY;oBACZ,MAAM,CAAC,6BAA6B,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;iBAC3E;gBAED,MAAM,CAAC,+CAA+C,GAAG,SAAS,CAAC;gBACnE,MAAM,CAAC,0CAA0C,GAAG,SAAS,CAAC;gBAE9D,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,6BAA6B,GAAG,UAAS,4BAA4B;gBAE3E,MAAM,CAAC,+CAA+C,GAAG,6BAA6B,CAAC,wBAAwB,CAAC,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;gBACpK,MAAM,CAAC,0CAA0C,GAAG,4BAA4B,CAAC,8BAA8B,CAAC;gBAEhH,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,+BAA+B,GAAG,UAAS,4BAA4B;gBAE7E,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAEjF,IAAI,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC,qBAAqB,KAAK,4BAA4B,CAAC,qBAAqB,EAAC;wBAC5H,gBAAgB;wBAChB,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBACtD,MAAM;qBACN;iBACD;gBAED,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,iCAAiC,GAAG;gBAC1C,IAAI,iCAAiC,GAAG;oBACvC,2BAA2B,EAAE,MAAM,CAAC,mDAAmD,CAAC,WAAW;oBACnG,yBAAyB,EAAE,MAAM,CAAC,mDAAmD,CAAC,aAAa;oBACnG,kCAAkC,EAAE,MAAM,CAAC,4CAA4C;iBACvF,CAAC;gBAEF,IAAI,SAAS,GAAG,KAAK,CAAC;gBAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,+BAA+B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBACnF,IAAI,8BAA8B,GAAG,MAAM,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;oBAEnF,IAAI,8BAA8B,CAAC,uBAAuB,KAAK,iCAAiC,CAAC,uBAAuB,EAAC;wBACxH,iBAAiB;wBACjB,MAAM,CAAC,+BAA+B,CAAC,KAAK,CAAC,GAAG,iCAAiC,CAAC;wBAClF,SAAS,GAAG,IAAI,CAAC;wBACjB,MAAM;qBACN;iBACD;gBAED,IAAG,CAAE,SAAS,EAAC;oBACd,YAAY;oBACZ,MAAM,CAAC,+BAA+B,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;iBAC/E;gBAED,MAAM,CAAC,mDAAmD,GAAG,SAAS,CAAC;gBACvE,MAAM,CAAC,4CAA4C,GAAG,SAAS,CAAC;gBAEhE,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,+BAA+B,GAAG,UAAS,8BAA8B;gBAE/E,MAAM,CAAC,mDAAmD,GAAG,6BAA6B,CAAC,0BAA0B,CAAC,8BAA8B,CAAC,uBAAuB,CAAC,CAAC;gBAC9K,MAAM,CAAC,4CAA4C,GAAG,8BAA8B,CAAC,gCAAgC,CAAC;gBAEtH,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,iCAAiC,GAAG,UAAS,8BAA8B;gBAEjF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,+BAA+B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAEnF,IAAI,MAAM,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC,uBAAuB,KAAK,8BAA8B,CAAC,uBAAuB,EAAC;wBACpI,gBAAgB;wBAChB,MAAM,CAAC,+BAA+B,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBACxD,MAAM;qBACN;iBACD;gBAED,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,oBAAoB,GAAG;gBAC7B,IAAG,MAAM,CAAC,qBAAqB,CAAC,OAAO,KAAK,aAAa,EAAC;oBACzD,MAAM,CAAC,6BAA6B,GAAG,IAAI,CAAC;iBAC5C;qBACG;oBACH,MAAM,CAAC,6BAA6B,GAAG,KAAK,CAAC;iBAC7C;YAEF,CAAC,CAAC;YAEF,MAAM,CAAC,qBAAqB,GAAG;gBAC9B,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAC;oBAC7C,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;iBACjC;qBACG;oBACH,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;iBAClC;YACF,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,GAAG;gBACzB,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAClC,6BAA6B,CAAC,mBAAmB,CAAC,OAAO,CAAC,UAAS,SAAS;oBAC3E,IAAI,SAAS,CAAC,aAAa,KAAK,MAAM,CAAC,WAAW,EAAC;wBAClD,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;wBACjC,OAAO;qBACP;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,CAAC,yBAAyB,GAAG;gBAClC,IAAI,SAAS,GACb;oBACC,UAAU,EAAE;wBACX,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI;wBACpC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI;wBAChD,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO;wBACxD,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI;wBAC5C,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;wBACxC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;wBAClC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;wBACxC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,IAAI,IAAI;wBAClD,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI;qBAC9C;oBACD,4BAA4B,EAAE,EAAE;oBAC9B,cAAc,EAAE,EAAE;oBAClB,aAAa,EAAE,MAAM,CAAC,WAAW;oBACjC,cAAc,EAAE,MAAM,CAAC,qBAAqB,IAAI,IAAI;oBACpD,qBAAqB,EAAE,MAAM,CAAC,4BAA4B,IAAI,IAAI;oBAClE,MAAM,EAAE,EAAE;oBACV,cAAc,EAAE,MAAM,CAAC,qBAAqB,CAAC,OAAO;oBACpD,MAAM,EAAE,MAAM,CAAC,aAAa;oBAC5B,gBAAgB,EAAE,EAAE;oBACpB,yBAAyB,EAAE,EAAE;oBAC7B,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO;oBAC7C,gBAAgB,EAAE,MAAM,CAAC,uBAAuB,IAAI,EAAE;oBACtD,qBAAqB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;oBAC1D,oBAAoB,EAAE,MAAM,CAAC,2BAA2B,IAAI,EAAE;oBAC9D,mBAAmB,EAAE,MAAM,CAAC,0BAA0B,IAAI,EAAE;oBAC5D,cAAc,EAAE,MAAM,CAAC,YAAY;oBACnC,iCAAiC,EAAE,MAAM,CAAC,sDAAsD,CAAA,CAAC,CAAC,MAAM,CAAC,sDAAsD,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;oBACvL,8BAA8B,EAAE;wBACjC,uBAAuB,EAAE,MAAM,CAAC,+BAA+B,CAAC,WAAW;wBAC3E,OAAO,EAAE;4BACR;gCACE,mBAAmB,EAAE,SAAS;gCAC9B,qBAAqB,EAAE,cAAc;6BACtC;4BACD;gCACE,mBAAmB,EAAE,SAAS;gCAC9B,qBAAqB,EAAE,SAAS;6BACjC;4BACD;gCACE,mBAAmB,EAAE,SAAS;gCAC9B,qBAAqB,EAAE,QAAQ;6BAChC;4BACD;gCACE,mBAAmB,EAAE,SAAS;gCAC9B,qBAAqB,EAAE,MAAM;6BAC9B;4BACD;gCACE,mBAAmB,EAAE,SAAS;gCAC9B,qBAAqB,EAAE,WAAW;6BACnC;yBACC;qBACD;iBACH,CAAC;gBAEF,IAAI,OAAO,GAAG,+BAA+B,CAAC,qCAAqC,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;gBACvH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;oBAC7B,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACpC;gBAED,OAAO;gBACP,IAAG,MAAM,CAAC,8BAA8B,EAAC;oBACxC,IAAI,aAAa,GAAG,MAAM,CAAC,8BAA8B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACrE,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;wBACtC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACD;gBAED,kBAAkB;gBAClB,IAAG,MAAM,CAAC,6BAA6B,EAAC;oBACvC,SAAS,CAAC,cAAc,GAAG,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC;iBACxE;qBACI,IAAG,MAAM,CAAC,0BAA0B,EAAC;oBACzC,SAAS,CAAC,cAAc,GAAG,MAAM,CAAC,0BAA0B,CAAC,OAAO,CAAC;iBACrE;qBACI,IAAG,MAAM,CAAC,uBAAuB,EAAC;oBACtC,SAAS,CAAC,cAAc,GAAG,MAAM,CAAC,uBAAuB,CAAC,OAAO,CAAC;iBAClE;qBACI,IAAG,MAAM,CAAC,wBAAwB,EAAC;oBACvC,SAAS,CAAC,cAAc,GAAG,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC;iBACnE;qBACI;oBACJ,SAAS,CAAC,cAAc,GAAG,EAAE,CAAC;iBAC9B;gBAGD,aAAa;gBACb,IAAG,MAAM,CAAC,6BAA6B,IAAI,MAAM,CAAC,6BAA6B,CAAC,MAAM,GAAG,CAAC,EAAC;oBAC1F,SAAS,CAAC,0BAA0B,GAAG,EAAE,CAAC;oBAE1C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,6BAA6B,EAAE;wBAC5D,SAAS,CAAC,0BAA0B,CAAC,IAAI,CAAC;4BACzC,aAAa,EAAE,QAAQ,CAAC,qBAAqB;4BAC7C,sBAAsB,EAAE,QAAQ,CAAC,8BAA8B;yBAC/D,CAAC,CAAC;qBACH;iBACD;gBAED,IAAG,MAAM,CAAC,+BAA+B,IAAI,MAAM,CAAC,+BAA+B,CAAC,MAAM,GAAG,CAAC,EAAC;oBAC9F,SAAS,CAAC,uBAAuB,GAAG,EAAE,CAAC;oBAEvC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,+BAA+B,EAAE;wBAC5D,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;4BACtC,eAAe,EAAE,MAAM,CAAC,uBAAuB;4BAC/C,sBAAsB,EAAE,MAAM,CAAC,gCAAgC;yBAC/D,CAAC,CAAC;qBACH;iBACD;gBAGD,OAAO,SAAS,CAAC;YAClB,CAAC,CAAC;YAEF,MAAM,CAAC,qBAAqB,GAAG;gBAE9B,IAAI,SAAS,GAAG,MAAM,CAAC,yBAAyB,EAAE,CAAC;gBAEnD,oBAAoB;gBAEpB,2DAA2D;gBAE3D,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAE1B,KAAK,CAAC;oBACL,GAAG,EAAE,6BAA6B,CAAC,0BAA0B,GAAG,cAAc,GAAG,MAAM,CAAC,uBAAuB,CAAC,WAAW;oBAC3H,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,SAAS;oBACf,aAAa;oBACb,+BAA+B;oBAC/B,IAAI;iBACJ,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,QAAQ;oBACvC,8CAA8C;oBAC9C,iCAAiC;oBAEjC,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,WAAW,CAAC;oBAE/C,UAAU,CAAC,UAAU,CAAC,+BAA+B,EAAE,MAAM,EAAE,MAAM,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;oBAC3G,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAE5B,CAAC,EAAE,SAAS,aAAa,CAAC,KAAK;oBAC9B,IAAG,KAAK,CAAC,IAAI,EAAC;wBACb,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACxF;yBACG;wBACH,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;qBACnF;oBAED,CAAC,CAAC,kCAAkC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC7C,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;oBAE3B,0BAA0B;oBAC1B,oDAAoD;oBACpD,YAAY;gBACd,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAEF,MAAM,CAAC,6BAA6B,GAAG;gBAEtC,MAAM,CAAC,4BAA4B,GAAG,EAAE,CAAC;gBAEzC,CAAC,CAAC,kCAAkC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAEjD,uBAAuB;gBACvB,CAAC,CAAC,kCAAkC,CAAC,CAAC,KAAK,EAAE,CAAC;YAE/C,CAAC,CAAC;YAEF,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,kCAAkC,EAAE;gBAE5D,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;gBAEpE,eAAe;gBACf,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,iCAAiC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC/E,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,qBAAqB,GAAG,UAAS,IAAI;gBAC3C,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;gBAElC,UAAU,CAAC,MAAM,GAAG,UAAS,KAAK;oBAEjC,IAAG;wBACF,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;qBACpC;oBACD,OAAM,KAAK,EAAC;wBACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;wBAC1D,MAAM,CAAC,4BAA4B,GAAG,mDAAmD,CAAC;wBAC1F,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,iCAAiC,CAAC;wBAC1G,CAAC,CAAC,wCAAwC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAEnD,MAAM,CAAC,OAAO,EAAE,CAAC;qBACjB;gBAEF,CAAC,CAAC;gBAEF,wCAAwC;gBACxC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC;YAEF,MAAM,CAAC,qBAAqB,GAAG,UAAS,KAAK;gBAC5C,8CAA8C;gBAC9C,MAAM,CAAC,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAEhE,IAAG,CAAE,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAC;oBAC3C,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;oBAC5E,MAAM,CAAC,4BAA4B,GAAG,qEAAqE,CAAC;oBAC5G,QAAQ,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,iCAAiC,CAAC;oBACzG,CAAC,CAAC,uCAAuC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAElD,MAAM,CAAC,OAAO,EAAE,CAAC;iBACjB;gBAEA,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnE,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC/E,6BAA6B,CAAC,qBAAqB,CAAC,OAAO,CAAC,UAAS,MAAM;oBAC1E,IAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,cAAc,EAAC;wBAC3E,MAAM,CAAC,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC;qBACxC;gBACF,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC3E,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC/E,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACzE,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC/E,kBAAkB;gBAClB,CAAC,CAAC,mCAAmC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAEzF,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACjF,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAE7E,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC,WAAW,CAAC;gBAE/D,MAAM,CAAC,0BAA0B,GAAG,MAAM,CAAC,sBAAsB,CAAC,iBAAiB,CAAC;gBACpF,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,sBAAsB,CAAC,YAAY,CAAC;gBAEjE,MAAM,CAAC,0BAA0B,GAAG,+BAA+B,CAAC,uBAAuB,CAAC,kCAAkC,EAAE,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,aAAa,EAAE,MAAM,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;gBAE5P,gCAAgC;gBAEhC,MAAM,CAAC,qBAAqB,GAAG,MAAM,CAAC,sBAAsB,CAAC,YAAY,CAAC;gBAE1E,KAAK,MAAM,mBAAmB,IAAI,6BAA6B,CAAC,oBAAoB,EAAE;oBACrF,IAAG,mBAAmB,CAAC,OAAO,KAAK,MAAM,CAAC,sBAAsB,CAAC,aAAa,EAAC;wBAC9E,MAAM,CAAC,aAAa,GAAG,mBAAmB,CAAC;wBAC3C,MAAM;qBACN;iBACD;gBAED,KAAK,MAAM,2BAA2B,IAAI,6BAA6B,CAAC,4BAA4B,EAAE;oBACrG,IAAG,2BAA2B,CAAC,OAAO,KAAK,MAAM,CAAC,sBAAsB,CAAC,YAAY,EAAC;wBACrF,MAAM,CAAC,qBAAqB,GAAG,2BAA2B,CAAC;wBAE3D,IAAG,2BAA2B,CAAC,OAAO,KAAK,aAAa,EAAC;4BACxD,MAAM,CAAC,6BAA6B,GAAG,IAAI,CAAC;yBAC5C;6BACG;4BACH,MAAM,CAAC,6BAA6B,GAAG,KAAK,CAAC;yBAC7C;wBACD,MAAM;qBACN;iBACD;gBAED,MAAM,CAAC,4BAA4B,GAAG,MAAM,CAAC,sBAAsB,CAAC,mBAAmB,CAAC;gBACxF,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,sBAAsB,CAAC,mBAAmB,CAAC;gBAC/E,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC;gBAC1D,IAAG,6BAA6B,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAC;oBAClG,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;iBAClC;qBACG;oBACH,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;iBACjC;gBAED,MAAM,CAAC,2BAA2B,GAAG,MAAM,CAAC,sBAAsB,CAAC,kBAAkB,CAAC;gBAEtF,MAAM,CAAC,8BAA8B,GAAG,SAAS,CAAC;gBAClD,IAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,IAAI,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAC;oBACtF,MAAM,CAAC,8BAA8B,GAAG,EAAE,CAAC;oBAC3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;wBAC/E,MAAM,CAAC,8BAA8B,IAAI,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAEnF,IAAG,KAAK,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAC;4BACxD,MAAM,CAAC,8BAA8B,IAAI,GAAG,CAAC;yBAC7C;qBACD;iBACD;gBAED,MAAM,CAAC,uBAAuB,GAAG,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC;gBAC9E,MAAM,CAAC,sDAAsD,GAAG,SAAS,CAAC;gBAE1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,6BAA6B,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACpF,MAAM,mBAAmB,GAAG,6BAA6B,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;oBAEnF,IAAG,mBAAmB,CAAC,gBAAgB,KAAK,MAAM,CAAC,sBAAsB,CAAC,+BAA+B,EAAC;wBACzG,MAAM,CAAC,sDAAsD,GAAG,mBAAmB,CAAC;wBACpF,MAAM;qBACN;iBACD;gBAED,IAAI,cAAc,GAAG,6BAA6B,CAAC,2BAA2B,CAAC,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;gBAE7H,IAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAC;oBACtC,MAAM,CAAC,wBAAwB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;iBACpD;gBACD,IAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAC;oBACtC,MAAM,CAAC,uBAAuB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;iBACnD;gBACD,IAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAC;oBACtC,MAAM,CAAC,0BAA0B,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;iBACtD;gBACD,IAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAC;oBACtC,MAAM,CAAC,6BAA6B,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;iBACzD;gBAED,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;gBACvC,MAAM,CAAC,+CAA+C,GAAG,SAAS,CAAC;gBACnE,MAAM,CAAC,0CAA0C,GAAG,SAAS,CAAC;gBAE9D,2CAA2C;gBAC3C,MAAM,CAAC,6BAA6B,GAAG,EAAE,CAAC;gBAC1C,wDAAwD;gBACxD,MAAM,CAAC,8BAA8B,GAAG,EAAE,CAAC;gBAC3C,IAAG,MAAM,CAAC,sBAAsB,CAAC,0BAA0B,IAAI,MAAM,CAAC,sBAAsB,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAC;oBAClI,KAAK,MAAM,kBAAkB,IAAI,MAAM,CAAC,sBAAsB,CAAC,0BAA0B,EAAE;wBAC1F,IAAI,iBAAiB,GAAG,6BAA6B,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;wBAC/G,IAAI,cAAc,GAAG;4BACpB,yBAAyB,EAAE,iBAAiB,CAAC,aAAa;4BAC1D,uBAAuB,EAAE,iBAAiB,CAAC,WAAW;4BACtD,iCAAiC,EAAE,iBAAiB,CAAC,YAAY;4BACjE,gCAAgC,EAAE,kBAAkB,CAAC,oBAAoB;yBACzE,CAAC;wBACF,MAAM,CAAC,6BAA6B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;qBAC1D;iBAED;gBAED,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;gBACzC,MAAM,CAAC,mDAAmD,GAAG,SAAS,CAAC;gBACvE,MAAM,CAAC,4CAA4C,GAAG,SAAS,CAAC;gBAChE,6CAA6C;gBAC7C,MAAM,CAAC,+BAA+B,GAAG,EAAE,CAAC;gBAC5C,wDAAwD;gBACxD,MAAM,CAAC,gCAAgC,GAAG,EAAE,CAAC;gBAE7C,IAAG,MAAM,CAAC,sBAAsB,CAAC,uBAAuB,IAAI,MAAM,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAC;oBAC5H,KAAK,MAAM,oBAAoB,IAAI,MAAM,CAAC,sBAAsB,CAAC,uBAAuB,EAAE;wBACzF,IAAI,mBAAmB,GAAG,6BAA6B,CAAC,0BAA0B,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;wBACvH,IAAI,kBAAkB,GAAG;4BACxB,2BAA2B,EAAE,mBAAmB,CAAC,WAAW;4BAC5D,yBAAyB,EAAE,mBAAmB,CAAC,aAAa;4BAC5D,kCAAkC,EAAE,oBAAoB,CAAC,oBAAoB;yBAC7E,CAAC;wBACF,MAAM,CAAC,+BAA+B,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;qBAChE;iBAED;gBAED,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;gBACvC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,CAAC,+BAA+B,GAAG,SAAS,CAAC;gBAEnD,KAAK,MAAM,kBAAkB,IAAI,MAAM,CAAC,mBAAmB,EAAE;oBAC5D,IAAI,kBAAkB,CAAC,WAAW,KAAK,MAAM,CAAC,sBAAsB,CAAC,4BAA4B,CAAC,qBAAqB,EAAC;wBACvH,MAAM,CAAC,+BAA+B,GAAG,kBAAkB,CAAC;wBAC5D,MAAM;qBACN;iBACD;gBAED,MAAM,CAAC,yBAAyB,GAAG,SAAS,CAAC;gBAC7C,MAAM,CAAC,yBAAyB,GAAG,SAAS,CAAC;gBAC7C,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC;YAEF,MAAM,CAAC,qCAAqC,GAAG;gBAE9C,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;gBAErE,IAAI,QAAQ,GAAG,yCAAyC,CAAC;gBAEzD,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,EAAC,IAAI,EAAE,kBAAkB,EAAC,CAAC,CAAC;gBAChE,IAAI,IAAI,GAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAEtC,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACpC,CAAC,CAAC,QAAQ,GAAM,QAAQ,CAAC;gBACzB,CAAC,CAAC,IAAI,GAAU,IAAI,CAAC;gBACrB,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC;gBACvB,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACpB,CAAC,CAAC,GAAG,GAAG,qBAAqB,CAAC;gBAC9B,CAAC,CAAC,KAAK,EAAE,CAAC;gBAEV,CAAC,CAAC,MAAM,EAAE,CAAC;YACZ,CAAC,CAAC;YAEF,MAAM,CAAC,6BAA6B,GAAG;gBACtC,IAAI,cAAc,GAAG,MAAM,CAAC,0BAA0B,CAAC;gBAEvD,cAAc,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC1D,cAAc,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAK,EAAE,CAAC;gBACvE,cAAc,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAClE,cAAc,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;gBACtE,cAAc,CAAC,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;gBAChE,cAAc,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;gBACtE,cAAc,CAAC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;gBACxE,cAAc,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;gBACpE,cAAc,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;gBAEtD,cAAc,CAAC,iBAAiB,GAAG,MAAM,CAAC,0BAA0B,CAAC;gBACrE,cAAc,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;gBAElD,cAAc,CAAC,YAAY,GAAG,EAAE,CAAC;gBACjC,IAAI,OAAO,GAAG,+BAA+B,CAAC,qCAAqC,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;gBACvH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;oBAC7B,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACzC;gBAED,IAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAC;oBAChC,cAAc,CAAC,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC;iBACjF;gBAED,IAAI,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;gBAE9B,gCAAgC;gBAEhC,cAAc,CAAC,YAAY,GAAG,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAC;gBACjE,cAAc,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxF,cAAc,CAAC,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEvG,cAAc,CAAC,mBAAmB,GAAG,MAAM,CAAC,4BAA4B,IAAI,EAAE,CAAC;gBAC/E,cAAc,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,IAAI,KAAK,CAAC;gBACzE,cAAc,CAAC,IAAI,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;gBACjD,cAAc,CAAC,kBAAkB,GAAG,MAAM,CAAC,2BAA2B,IAAI,EAAE,CAAC;gBAC7E,cAAc,CAAC,IAAI,GAAG,EAAE,CAAC;gBAEzB,IAAG,MAAM,CAAC,8BAA8B,EAAC;oBACxC,IAAI,aAAa,GAAG,MAAM,CAAC,8BAA8B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACrE,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;wBACtC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;qBAC3C;iBACD;gBAED,cAAc,CAAC,cAAc,GAAG,MAAM,CAAC,uBAAuB,IAAI,EAAE,CAAC;gBACrE,cAAc,CAAC,+BAA+B,GAAG,MAAM,CAAC,sDAAsD,CAAA,CAAC,CAAC,MAAM,CAAC,sDAAsD,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEpM,IAAG,MAAM,CAAC,6BAA6B,EAAC;oBACvC,cAAc,CAAC,cAAc,GAAG,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC;iBAC7E;qBACI,IAAG,MAAM,CAAC,0BAA0B,EAAC;oBACzC,cAAc,CAAC,cAAc,GAAG,MAAM,CAAC,0BAA0B,CAAC,OAAO,CAAC;iBAC1E;qBACI,IAAG,MAAM,CAAC,uBAAuB,EAAC;oBACtC,cAAc,CAAC,cAAc,GAAG,MAAM,CAAC,uBAAuB,CAAC,OAAO,CAAC;iBACvE;qBACI,IAAG,MAAM,CAAC,wBAAwB,EAAC;oBACvC,cAAc,CAAC,cAAc,GAAG,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC;iBACxE;qBACI;oBACJ,cAAc,CAAC,cAAc,GAAG,EAAE,CAAC;iBACnC;gBAED,cAAc,CAAC,0BAA0B,GAAG,EAAE,CAAC;gBAE/C,IAAG,MAAM,CAAC,6BAA6B,IAAI,MAAM,CAAC,6BAA6B,CAAC,MAAM,GAAG,CAAC,EAAC;oBAC1F,cAAc,CAAC,0BAA0B,GAAG,EAAE,CAAC;oBAE/C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,6BAA6B,EAAE;wBAC5D,cAAc,CAAC,0BAA0B,CAAC,IAAI,CAAC;4BAC9C,aAAa,EAAE,QAAQ,CAAC,qBAAqB;4BAC7C,sBAAsB,EAAE,QAAQ,CAAC,8BAA8B;yBAC/D,CAAC,CAAC;qBACH;iBACD;gBAED,cAAc,CAAC,uBAAuB,GAAG,EAAE,CAAC;gBAE5C,IAAG,MAAM,CAAC,+BAA+B,IAAI,MAAM,CAAC,+BAA+B,CAAC,MAAM,GAAG,CAAC,EAAC;oBAC9F,cAAc,CAAC,uBAAuB,GAAG,EAAE,CAAC;oBAE5C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,+BAA+B,EAAE;wBAC5D,cAAc,CAAC,uBAAuB,CAAC,IAAI,CAAC;4BAC3C,eAAe,EAAE,MAAM,CAAC,uBAAuB;4BAC/C,sBAAsB,EAAE,MAAM,CAAC,gCAAgC;yBAC/D,CAAC,CAAC;qBACH;iBACD;gBAEA,IAAI,4BAA4B,GAAG;oBAClC,uBAAuB,EAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC,MAAM,CAAC,+BAA+B,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;oBAC/H,OAAO,EAAE;wBACR;4BACE,mBAAmB,EAAE,SAAS;4BAC9B,qBAAqB,EAAE,cAAc;yBACtC;wBACD;4BACE,mBAAmB,EAAE,SAAS;4BAC9B,qBAAqB,EAAE,SAAS;yBACjC;wBACD;4BACE,mBAAmB,EAAE,SAAS;4BAC9B,qBAAqB,EAAE,QAAQ;yBAChC;wBACD;4BACE,mBAAmB,EAAE,SAAS;4BAC9B,qBAAqB,EAAE,MAAM;yBAC9B;wBACD;4BACE,mBAAmB,EAAE,SAAS;4BAC9B,qBAAqB,EAAE,WAAW;yBACnC;qBACC;iBACH,CAAC;gBAEF,cAAc,CAAC,4BAA4B,GAAG,4BAA4B,CAAC;gBAG5E,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBAElD,IAAI,QAAQ,GAAG,8BAA8B,CAAC;gBAE9C,IAAI,IAAI,EAAC;oBACR,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC;iBACvB;gBAED,QAAQ,IAAI,OAAO,CAAC;gBAEpB,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,EAAC,IAAI,EAAE,kBAAkB,EAAC,CAAC,CAAC;gBAChE,IAAI,IAAI,GAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAEtC,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACpC,CAAC,CAAC,QAAQ,GAAM,QAAQ,CAAC;gBACzB,CAAC,CAAC,IAAI,GAAU,IAAI,CAAC;gBACrB,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC;gBACvB,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACpB,CAAC,CAAC,GAAG,GAAG,qBAAqB,CAAC;gBAC9B,CAAC,CAAC,KAAK,EAAE,CAAC;gBAEV,CAAC,CAAC,MAAM,EAAE,CAAC;YACZ,CAAC,CAAC;YAED,MAAM,CAAC,gBAAgB,GAAG;gBACzB,CAAC,CAAC,oCAAoC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,CAAC,CAAC;YAEF,MAAM,CAAC,cAAc,GAAG;gBACvB,CAAC,CAAC,kCAAkC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,CAAC,CAAC;YAEF,MAAM,CAAC,sBAAsB,GAAG;gBAC/B,CAAC,CAAC,wCAAwC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,CAAC,CAAC;QAEJ,CAAC;KACD;CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.ts new file mode 100644 index 000000000..3ee53c046 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.component.ts @@ -0,0 +1,1133 @@ +angular.module('indicatorEditMetadataModal').component('indicatorEditMetadataModal', { + templateUrl : "components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + 'kommonitorDataGridHelperService', + function IndicatorEditMetadataModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout, + kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.currentIndicatorDataset; + + /* POST BODY + { + + "refrencesToOtherIndicators": [ + { + "referenceDescription": "referenceDescription", + "indicatorId": "indicatorId" + }, + { + "referenceDescription": "referenceDescription", + "indicatorId": "indicatorId" + } + ], + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "allowedRoles": [ + "allowedRoles", + "allowedRoles" + ], + "datasetName": "datasetName", + "applicableSpatialUnit": "applicableSpatialUnit", + "abbreviation": "abbreviation", + "characteristicValue": "characteristicValue", + "tags": [ + "tags", + "tags" + ], + "creationType": "INSERTION", + "unit": "unit", + "topicReference": "topicReference", + "referenceDateNote": "optional note for indicator reference date", + "displayOrder": 0, + "refrencesToGeoresources": [ + { + "referenceDescription": "referenceDescription", + "georesourceId": "georesourceId" + }, + { + "referenceDescription": "referenceDescription", + "georesourceId": "georesourceId" + } + ], + "indicatorType": "STATUS_ABSOLUTE", + "interpretation": "interpretation", + "isHeadlineIndicator": false, + "processDescription": "processDescription", + "lowestSpatialUnitForComputation": "lowestSpatialUnitForComputation", + "defaultClassificationMapping": { + "colorBrewerSchemeName": "colorBrewerSchemeName", + "items": [ + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + }, + { + "defaultCustomRating": "defaultCustomRating", + "defaultColorAsHex": "defaultColorAsHex" + } + ] + } + } + */ + + //Date picker + $('#indicatorEditLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + + $scope.indicatorMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "refrencesToOtherIndicators": [ + { + "referenceDescription": "description about the reference", + "indicatorId": "ID of referenced indicator dataset" + } + ], + "refrencesToGeoresources": [ + { + "referenceDescription": "description about the reference", + "georesourceId": "ID of referenced georesource dataset" + } + ], + "datasetName": "Name of indicator dataset", + "abbreviation": "optional abbreviation of the indicator dataset", + "characteristicValue": "if the same datasetName is used for different indicators, the optional characteristicValue parameter may serve to distinguish between them (i.e. Habitants - male, Habitants - female, Habitants - diverse)", + "tags": [ + "optinal list of tags; each tag is a free text tag" + ], + "creationType": "INSERTION|COMPUTATION <-- enum parameter controls whether each timestamp must be updated manually (INSERTION) or if KomMonitor shall compute the indicator values for respective timestamps based on script file (COMPUTATION)", + "unit": "unit of the indicator", + "topicReference": "ID of the respective main/sub topic instance", + "indicatorType": "STATUS_ABSOLUTE|STATUS_RELATIVE|DYNAMIC_ABSOLUTE|DYNAMIC_RELATIVE|STATUS_STANDARDIZED|DYNAMIC_STANDARDIZED", + "interpretation": "interpretation hints for the user to better understand the indicator values", + "isHeadlineIndicator": "boolean parameter to indicate if indicator is a headline indicator", + "processDescription": "detailed description about the computation/creation of the indicator", + "lowestSpatialUnitForComputation": "the name of the lowest possible spatial unit for which an indicator of creationType=COMPUTATION may be computed. All other superior spatial units will be aggregated automatically", + "referenceDateNote": "optional note for indicator reference date", + "displayOrder": 0, + "defaultClassificationMapping": { + "colorBrewerSchemeName": "schema name of colorBrewer colorPalette to use for classification", + "items": [ + { + "defaultCustomRating": "a string to rate indicator values of this class", + "defaultColorAsHex": "color as hexadecimal value" + } + ] + } + }; + + $scope.indicatorMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.indicatorMetadataStructure); + + $scope.metadataImportSettings; + $scope.indicatorMetadataImportError; + $scope.indicatorAddMetadataImportErrorAlert; + + $scope.datasetName = undefined; + $scope.datasetNameInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + + $scope.roleManagementTableOptions = undefined; + + + $scope.datasetName = undefined; + $scope.indicatorAbbreviation = undefined; + $scope.indicatorType = undefined; + $scope.indicatorCharacteristicValue = undefined; + $scope.isHeadlineIndicator = false; + $scope.indicatorUnit = undefined; + $scope.enableFreeTextUnit = false; + $scope.indicatorProcessDescription = undefined; + $scope.indicatorTagsString_withCommas = undefined; + $scope.indicatorInterpretation = undefined; + $scope.indicatorCreationType = undefined; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; + $scope.enableLowestSpatialUnitSelect = false; + + $scope.indicatorReferenceDateNote = undefined; + $scope.displayOrder = 0; + + $scope.indicatorTopic_mainTopic = undefined; + $scope.indicatorTopic_subTopic = undefined; + $scope.indicatorTopic_subsubTopic = undefined; + $scope.indicatorTopic_subsubsubTopic = undefined; + + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + + $scope.numClassesArray = [3,4,5,6,7,8]; + $scope.numClasses = $scope.numClassesArray[2]; + $scope.selectedColorBrewerPaletteEntry = undefined; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $scope.colorbrewerSchemes = colorbrewer; + $scope.colorbreweSchemeName_dynamicIncrease = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; + $scope.colorbreweSchemeName_dynamicDecrease = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; + $scope.colorbrewerPalettes = []; + + + $scope.instantiateColorBrewerPalettes = function(){ + for (const key in colorbrewer) { + if (colorbrewer.hasOwnProperty(key)) { + const colorPalettes = colorbrewer[key]; + + var paletteEntry = { + "paletteName": key, + "paletteArrayObject": colorPalettes + }; + + $scope.colorbrewerPalettes.push(paletteEntry); + } + } + + // instantiate with palette 'Blues' + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + + }; + + $scope.instantiateColorBrewerPalettes(); + + $scope.$on("onEditIndicatorMetadata", function (event, indicatorDataset) { + + $scope.currentIndicatorDataset = indicatorDataset; + + $scope.resetIndicatorEditMetadataForm(); + kommonitorMultiStepFormHelperService.registerClickHandler(); + + }); + + $scope.$on("availableRolesUpdate", function (event) { + let allowedRoles = $scope.currentIndicatorDataset ? $scope.currentIndicatorDataset.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + }); + + $scope.resetIndicatorEditMetadataForm = function(){ + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $scope.datasetName = $scope.currentIndicatorDataset.indicatorName; + $scope.datasetNameInvalid = false; + + $scope.indicatorReferenceDateNote = $scope.currentIndicatorDataset.referenceDateNote; + $scope.displayOrder = $scope.currentIndicatorDataset.displayOrder; + + $scope.metadata = {}; + $scope.metadata.note = $scope.currentIndicatorDataset.metadata.note; + $scope.metadata.literature = $scope.currentIndicatorDataset.metadata.literature; + $scope.metadata.sridEPSG = 4326; + $scope.metadata.datasource = $scope.currentIndicatorDataset.metadata.datasource; + $scope.metadata.databasis = $scope.currentIndicatorDataset.metadata.databasis; + $scope.metadata.contact = $scope.currentIndicatorDataset.metadata.contact; + $scope.metadata.description = $scope.currentIndicatorDataset.metadata.description; + + $scope.metadata.lastUpdate = $scope.currentIndicatorDataset.metadata.lastUpdate; + // $('#indicatorEditLastUpdateDatepicker').data({date: $scope.currentIndicatorDataset.metadata.lastUpdate}); + $('#indicatorEditLastUpdateDatepicker').datepicker('setDate', $scope.currentIndicatorDataset.metadata.lastUpdate); + + kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ + if(option.apiName === $scope.currentIndicatorDataset.metadata.updateInterval){ + $scope.metadata.updateInterval = option; + } + }); + + let allowedRoles = $scope.currentIndicatorDataset ? $scope.currentIndicatorDataset.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + + $scope.indicatorAbbreviation = $scope.currentIndicatorDataset.abbreviation; + + kommonitorDataExchangeService.indicatorTypeOptions.forEach(function(option){ + if(option.apiName === $scope.currentIndicatorDataset.indicatorType){ + $scope.indicatorType = option; + } + }); + + $scope.indicatorCharacteristicValue = $scope.currentIndicatorDataset.characteristicValue; + $scope.isHeadlineIndicator = $scope.currentIndicatorDataset.isHeadlineIndicator; + $scope.indicatorUnit = $scope.currentIndicatorDataset.unit; + + $scope.enableFreeTextUnit = true; + kommonitorDataExchangeService.indicatorUnitOptions.forEach(function(option){ + if(option === $scope.currentIndicatorDataset.unit){ + // if the unit is in list of known units then disable freeText + $scope.enableFreeTextUnit = false; + } + }); + + $scope.indicatorProcessDescription = $scope.currentIndicatorDataset.processDescription; + $scope.indicatorTagsString_withCommas = ""; + + for (let index = 0; index < $scope.currentIndicatorDataset.tags.length; index++) { + $scope.indicatorTagsString_withCommas += $scope.currentIndicatorDataset.tags[index]; + + if(index < $scope.currentIndicatorDataset.tags.length - 1){ + $scope.indicatorTagsString_withCommas += ","; + } + } + + if (! $scope.currentIndicatorDataset.tags || $scope.currentIndicatorDataset.tags.length === 0){ + $scope.indicatorTagsString_withCommas = undefined; + } + + $scope.indicatorInterpretation = $scope.currentIndicatorDataset.interpretation; + + kommonitorDataExchangeService.indicatorCreationTypeOptions.forEach(function(option){ + if(option.apiName === $scope.currentIndicatorDataset.creationType){ + $scope.indicatorCreationType = option; + } + }); + + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; + + for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; + + if(spatialUnitMetadata.spatialUnitLevel === $scope.currentIndicatorDataset.lowestSpatialUnitForComputation){ + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; + break; + } + } + + if($scope.indicatorCreationType.apiName === "COMPUTATION"){ + $scope.enableLowestSpatialUnitSelect = true; + } + else{ + $scope.enableLowestSpatialUnitSelect = false; + } + + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.currentIndicatorDataset.topicReference); + + if(topicHierarchy && topicHierarchy[0]){ + $scope.indicatorTopic_mainTopic = topicHierarchy[0]; + } + if(topicHierarchy && topicHierarchy[1]){ + $scope.indicatorTopic_subTopic = topicHierarchy[1]; + } + if(topicHierarchy && topicHierarchy[2]){ + $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; + } + if(topicHierarchy && topicHierarchy[3]){ + $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; + } + + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + if($scope.currentIndicatorDataset.referencedIndicators && $scope.currentIndicatorDataset.referencedIndicators.length > 0){ + for (const indicatorReference of $scope.currentIndicatorDataset.referencedIndicators) { + var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.referencedIndicatorId); + var referenceEntry = { + "referencedIndicatorName": indicatorMetadata.indicatorName, + "referencedIndicatorId": indicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, + "referencedIndicatorDescription": indicatorReference.referencedIndicatorDescription + }; + $scope.indicatorReferences_adminView.push(referenceEntry); + } + + } + + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + + if($scope.currentIndicatorDataset.referencedGeoresources && $scope.currentIndicatorDataset.referencedGeoresources.length > 0){ + for (const georesourceReference of $scope.currentIndicatorDataset.referencedGeoresources) { + var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.referencedGeoresourceId); + var geo_referenceEntry = { + "referencedGeoresourceName": georesourceMetadata.datasetName, + "referencedGeoresourceId": georesourceMetadata.georesourceId, + "referencedGeoresourceDescription": georesourceReference.referencedGeoresourceDescription + }; + $scope.georesourceReferences_adminView.push(geo_referenceEntry); + } + + } + + $scope.numClassesArray = [3,4,5,6,7,8]; + $scope.numClasses = $scope.numClassesArray[2]; + + // instantiate with palette 'Blues' + $scope.selectedColorBrewerPaletteEntry = $scope.colorbrewerPalettes[13]; + + for (const colorbrewerPalette of $scope.colorbrewerPalettes) { + if (colorbrewerPalette.paletteName === $scope.currentIndicatorDataset.defaultClassificationMapping.colorBrewerSchemeName){ + $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; + break; + } + } + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $("#indicatorEditMetadataSuccessAlert").hide(); + $("#indicatorEditMetadataErrorAlert").hide(); + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickColorBrewerEntry = function(colorPaletteEntry){ + $scope.selectedColorBrewerPaletteEntry = colorPaletteEntry; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onAddOrUpdateIndicatorReference = function(){ + var tmpIndicatorReference_adminView = { + "referencedIndicatorName": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorName, + "referencedIndicatorId": $scope.tmpIndicatorReference_selectedIndicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": $scope.tmpIndicatorReference_selectedIndicatorMetadata.abbreviation, + "referencedIndicatorDescription": $scope.tmpIndicatorReference_referenceDescription + }; + + var processed = false; + + for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { + var indicatorReference_adminView = $scope.indicatorReferences_adminView[index]; + + if (indicatorReference_adminView.referencedIndicatorId === tmpIndicatorReference_adminView.referencedIndicatorId){ + // replace object + $scope.indicatorReferences_adminView[index] = tmpIndicatorReference_adminView; + processed = true; + break; + } + } + + if(! processed){ + // new entry + $scope.indicatorReferences_adminView.push(tmpIndicatorReference_adminView); + } + + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickEditIndicatorReference = function(indicatorReference_adminView){ + + $scope.tmpIndicatorReference_selectedIndicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference_adminView.referencedIndicatorId); + $scope.tmpIndicatorReference_referenceDescription = indicatorReference_adminView.referencedIndicatorDescription; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickDeleteIndicatorReference = function(indicatorReference_adminView){ + + for (let index = 0; index < $scope.indicatorReferences_adminView.length; index++) { + + if ($scope.indicatorReferences_adminView[index].referencedIndicatorId === indicatorReference_adminView.referencedIndicatorId){ + // remove object + $scope.indicatorReferences_adminView.splice(index, 1); + break; + } + } + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onAddOrUpdateGeoresourceReference = function(){ + var tmpGeoresourceReference_adminView = { + "referencedGeoresourceName": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.datasetName, + "referencedGeoresourceId": $scope.tmpGeoresourceReference_selectedGeoresourceMetadata.georesourceId, + "referencedGeoresourceDescription": $scope.tmpGeoresourceReference_referenceDescription + }; + + var processed = false; + + for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { + var georesourceReference_adminView = $scope.georesourceReferences_adminView[index]; + + if (georesourceReference_adminView.referencedGeoresourceId === tmpGeoresourceReference_adminView.referencedGeoresourceId){ + // replace object + $scope.georesourceReferences_adminView[index] = tmpGeoresourceReference_adminView; + processed = true; + break; + } + } + + if(! processed){ + // new entry + $scope.georesourceReferences_adminView.push(tmpGeoresourceReference_adminView); + } + + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickEditGeoresourceReference = function(georesourceReference_adminView){ + + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference_adminView.referencedGeoresourceId); + $scope.tmpGeoresourceReference_referenceDescription = georesourceReference_adminView.referencedGeoresourceDescription; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickDeleteGeoresourceReference = function(georesourceReference_adminView){ + + for (let index = 0; index < $scope.georesourceReferences_adminView.length; index++) { + + if ($scope.georesourceReferences_adminView[index].referencedGeoresourceId === georesourceReference_adminView.referencedGeoresourceId){ + // remove object + $scope.georesourceReferences_adminView.splice(index, 1); + break; + } + } + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onChangeCreationType = function(){ + if($scope.indicatorCreationType.apiName === "COMPUTATION"){ + $scope.enableLowestSpatialUnitSelect = true; + } + else{ + $scope.enableLowestSpatialUnitSelect = false; + } + + }; + + $scope.onChangeIndicatorUnit = function(){ + if ($scope.indicatorUnit.includes("Freitext")){ + $scope.enableFreeTextUnit = true; + } + else{ + $scope.enableFreeTextUnit = false; + } + }; + + $scope.checkDatasetName = function(){ + $scope.datasetNameInvalid = false; + kommonitorDataExchangeService.availableIndicators.forEach(function(indicator){ + if (indicator.indicatorName === $scope.datasetName){ + $scope.datasetNameInvalid = true; + return; + } + }); + }; + + $scope.buildPatchBody_indicators = function(){ + var patchBody = + { + "metadata": { + "note": $scope.metadata.note || null, + "literature": $scope.metadata.literature || null, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG || 4326, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description || null, + "databasis": $scope.metadata.databasis || null + }, + "refrencesToOtherIndicators": [], // filled directly after + "allowedRoles": [], + "datasetName": $scope.datasetName, + "abbreviation": $scope.indicatorAbbreviation || null, + "characteristicValue": $scope.indicatorCharacteristicValue || null, + "tags": [], // filled directly after + "creationType": $scope.indicatorCreationType.apiName, + "unit": $scope.indicatorUnit, + "topicReference": "", // filled directly after + "refrencesToGeoresources": [], // filled directly after + "indicatorType": $scope.indicatorType.apiName, + "interpretation": $scope.indicatorInterpretation || "", + "isHeadlineIndicator": $scope.isHeadlineIndicator || false, + "processDescription": $scope.indicatorProcessDescription || "", + "referenceDateNote": $scope.indicatorReferenceDateNote || "", + "displayOrder": $scope.displayOrder, + "lowestSpatialUnitForComputation": $scope.indicatorLowestSpatialUnitMetadataObjectForComputation? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : null, + "defaultClassificationMapping": { + "colorBrewerSchemeName": $scope.selectedColorBrewerPaletteEntry.paletteName, + "items": [ + { + "defaultColorAsHex": "#edf8e9", + "defaultCustomRating": "sehr niedrig" + }, + { + "defaultColorAsHex": "#bae4b3", + "defaultCustomRating": "niedrig" + }, + { + "defaultColorAsHex": "#74c476", + "defaultCustomRating": "mittel" + }, + { + "defaultColorAsHex": "#31a354", + "defaultCustomRating": "hoch" + }, + { + "defaultColorAsHex": "#006d2c", + "defaultCustomRating": "sehr hoch" + } + ] + } + }; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + patchBody.allowedRoles.push(roleId); + } + + // TAGS + if($scope.indicatorTagsString_withCommas){ + var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); + for (const tagString of tags_splitted) { + patchBody.tags.push(tagString.trim()); + } + } + + // TOPIC REFERENCE + if($scope.indicatorTopic_subsubsubTopic){ + patchBody.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; + } + else if($scope.indicatorTopic_subsubTopic){ + patchBody.topicReference = $scope.indicatorTopic_subsubTopic.topicId; + } + else if($scope.indicatorTopic_subTopic){ + patchBody.topicReference = $scope.indicatorTopic_subTopic.topicId; + } + else if($scope.indicatorTopic_mainTopic){ + patchBody.topicReference = $scope.indicatorTopic_mainTopic.topicId; + } + else { + patchBody.topicReference = ""; + } + + + // REFERENCES + if($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0){ + patchBody.refrencesToOtherIndicators = []; + + for (const indicRef of $scope.indicatorReferences_adminView) { + patchBody.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } + } + + if($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0){ + patchBody.refrencesToGeoresources = []; + + for (const geoRef of $scope.georesourceReferences_adminView) { + patchBody.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + + + return patchBody; + }; + + $scope.editIndicatorMetadata = function(){ + + var patchBody = $scope.buildPatchBody_indicators(); + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + $scope.loadingData = true; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + $scope.currentIndicatorDataset.indicatorId, + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $scope.successMessagePart = $scope.datasetName; + + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", $scope.currentIndicatorDataset.indicatorId); + $("#indicatorEditMetadataSuccessAlert").show(); + $scope.loadingData = false; + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#indicatorEditMetadataErrorAlert").show(); + $scope.loadingData = false; + + // setTimeout(function() { + // $("#indicatorEditMetadataSuccessAlert").hide(); + // }, 3000); + }); + }; + + $scope.onImportIndicatorEditMetadata = function(){ + + $scope.indicatorMetadataImportError = ""; + + $("#indicatorEditMetadataImportFile").files = []; + + // trigger file chooser + $("#indicatorEditMetadataImportFile").click(); + + }; + + $(document).on("change", "#indicatorEditMetadataImportFile" ,function(){ + + console.log("Importing Indicator metadata for Edit Indicator Form"); + + // get the file + var file = document.getElementById('indicatorEditMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + + $scope.parseMetadataFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMetadataFile(event); + } + catch(error){ + console.error("Uploaded Metadata File cannot be parsed."); + $scope.indicatorMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("indicatorsEditMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorEditMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMetadataFile = function(event){ + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + + if(! $scope.metadataImportSettings.metadata){ + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorAddMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ + if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#indicatorAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + + $scope.datasetName = $scope.metadataImportSettings.datasetName; + + $scope.indicatorReferenceDateNote = $scope.metadataImportSettings.referenceDateNote; + $scope.displayOrder = $scope.metadataImportSettings.displayOrder; + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('indicatorEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + + // indicator specific properties + + $scope.indicatorAbbreviation = $scope.metadataImportSettings.abbreviation; + + for (const indicatorTypeOption of kommonitorDataExchangeService.indicatorTypeOptions) { + if(indicatorTypeOption.apiName === $scope.metadataImportSettings.indicatorType){ + $scope.indicatorType = indicatorTypeOption; + break; + } + } + + for (const indicatorCreationTypeOption of kommonitorDataExchangeService.indicatorCreationTypeOptions) { + if(indicatorCreationTypeOption.apiName === $scope.metadataImportSettings.creationType){ + $scope.indicatorCreationType = indicatorCreationTypeOption; + + if(indicatorCreationTypeOption.apiName === "COMPUTATION"){ + $scope.enableLowestSpatialUnitSelect = true; + } + else{ + $scope.enableLowestSpatialUnitSelect = false; + } + break; + } + } + + $scope.indicatorCharacteristicValue = $scope.metadataImportSettings.characteristicValue; + $scope.isHeadlineIndicator = $scope.metadataImportSettings.isHeadlineIndicator; + $scope.indicatorUnit = $scope.metadataImportSettings.unit; + if(kommonitorDataExchangeService.indicatorUnitOptions.includes($scope.metadataImportSettings.unit)){ + $scope.enableFreeTextUnit = false; + } + else{ + $scope.enableFreeTextUnit = true; + } + + $scope.indicatorProcessDescription = $scope.metadataImportSettings.processDescription; + + $scope.indicatorTagsString_withCommas = undefined; + if($scope.metadataImportSettings.tags && $scope.metadataImportSettings.tags.length > 0){ + $scope.indicatorTagsString_withCommas = ""; + for (let index = 0; index < $scope.metadataImportSettings.tags.length; index++) { + $scope.indicatorTagsString_withCommas += $scope.metadataImportSettings.tags[index]; + + if(index < $scope.metadataImportSettings.tags.length - 1){ + $scope.indicatorTagsString_withCommas += ","; + } + } + } + + $scope.indicatorInterpretation = $scope.metadataImportSettings.interpretation; + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = undefined; + + for (let i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + const spatialUnitMetadata = kommonitorDataExchangeService.availableSpatialUnits[i]; + + if(spatialUnitMetadata.spatialUnitLevel === $scope.metadataImportSettings.lowestSpatialUnitForComputation){ + $scope.indicatorLowestSpatialUnitMetadataObjectForComputation = spatialUnitMetadata; + break; + } + } + + var topicHierarchy = kommonitorDataExchangeService.getTopicHierarchyForTopicId($scope.metadataImportSettings.topicReference); + + if(topicHierarchy && topicHierarchy[0]){ + $scope.indicatorTopic_mainTopic = topicHierarchy[0]; + } + if(topicHierarchy && topicHierarchy[1]){ + $scope.indicatorTopic_subTopic = topicHierarchy[1]; + } + if(topicHierarchy && topicHierarchy[2]){ + $scope.indicatorTopic_subsubTopic = topicHierarchy[2]; + } + if(topicHierarchy && topicHierarchy[3]){ + $scope.indicatorTopic_subsubsubTopic = topicHierarchy[3]; + } + + $scope.indicatorNameFilter = undefined; + $scope.tmpIndicatorReference_selectedIndicatorMetadata = undefined; + $scope.tmpIndicatorReference_referenceDescription = undefined; + + // tmp array to display indicatorReferences + $scope.indicatorReferences_adminView = []; + // array for API request (has less information per item) + $scope.indicatorReferences_apiRequest = []; + if($scope.metadataImportSettings.refrencesToOtherIndicators && $scope.metadataImportSettings.refrencesToOtherIndicators.length > 0){ + for (const indicatorReference of $scope.metadataImportSettings.refrencesToOtherIndicators) { + var indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorReference.indicatorId); + var referenceEntry = { + "referencedIndicatorName": indicatorMetadata.indicatorName, + "referencedIndicatorId": indicatorMetadata.indicatorId, + "referencedIndicatorAbbreviation": indicatorMetadata.abbreviation, + "referencedIndicatorDescription": indicatorReference.referenceDescription + }; + $scope.indicatorReferences_adminView.push(referenceEntry); + } + + } + + $scope.georesourceNameFilter = undefined; + $scope.tmpGeoresourceReference_selectedGeoresourceMetadata = undefined; + $scope.tmpGeoresourceReference_referenceDescription = undefined; + // tmp array to display georesourceReferences + $scope.georesourceReferences_adminView = []; + // array for API request (has less information per item) + $scope.georesourceReferences_apiRequest = []; + + if($scope.metadataImportSettings.refrencesToGeoresources && $scope.metadataImportSettings.refrencesToGeoresources.length > 0){ + for (const georesourceReference of $scope.metadataImportSettings.refrencesToGeoresources) { + var georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceReference.georesourceId); + var geo_referenceEntry = { + "referencedGeoresourceName": georesourceMetadata.datasetName, + "referencedGeoresourceId": georesourceMetadata.georesourceId, + "referencedGeoresourceDescription": georesourceReference.referenceDescription + }; + $scope.georesourceReferences_adminView.push(geo_referenceEntry); + } + + } + + $scope.numClassesArray = [3,4,5,6,7,8]; + $scope.numClasses = $scope.numClassesArray[2]; + $scope.selectedColorBrewerPaletteEntry = undefined; + + for (const colorbrewerPalette of $scope.colorbrewerPalettes) { + if (colorbrewerPalette.paletteName === $scope.metadataImportSettings.defaultClassificationMapping.colorBrewerSchemeName){ + $scope.selectedColorBrewerPaletteEntry = colorbrewerPalette; + break; + } + } + + $scope.spatialUnitRefKeyProperty = undefined; + $scope.targetSpatialUnitMetadata = undefined; + $scope.$digest(); + }; + + $scope.onExportIndicatorEditMetadataTemplate = function(){ + + var metadataJSON = JSON.stringify($scope.indicatorMetadataStructure); + + var fileName = "Indikator_Metadaten_Vorlage_Export.json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + $scope.onExportIndicatorEditMetadata = function(){ + var metadataExport = $scope.indicatorMetadataStructure; + + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.datasetName = $scope.datasetName || ""; + + metadataExport.referenceDateNote = $scope.indicatorReferenceDateNote; + metadataExport.displayOrder = $scope.displayOrder; + + metadataExport.allowedRoles = []; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + + if($scope.metadata.updateInterval){ + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + + var name = $scope.datasetName; + + // indicator specific properties + + metadataExport.abbreviation = $scope.indicatorAbbreviation || ""; + metadataExport.indicatorType = $scope.indicatorType ? $scope.indicatorType.apiName : ""; + metadataExport.creationType = $scope.indicatorCreationType ? $scope.indicatorCreationType.apiName : ""; + + metadataExport.characteristicValue = $scope.indicatorCharacteristicValue || ""; + metadataExport.isHeadlineIndicator = $scope.isHeadlineIndicator || false; + metadataExport.unit = $scope.indicatorUnit || ""; + metadataExport.processDescription = $scope.indicatorProcessDescription || ""; + metadataExport.tags = []; + + if($scope.indicatorTagsString_withCommas){ + var tags_splitted = $scope.indicatorTagsString_withCommas.split(","); + for (const tagString of tags_splitted) { + metadataExport.tags.push(tagString.trim()); + } + } + + metadataExport.interpretation = $scope.indicatorInterpretation || ""; + metadataExport.lowestSpatialUnitForComputation = $scope.indicatorLowestSpatialUnitMetadataObjectForComputation? $scope.indicatorLowestSpatialUnitMetadataObjectForComputation.spatialUnitLevel : ""; + + if($scope.indicatorTopic_subsubsubTopic){ + metadataExport.topicReference = $scope.indicatorTopic_subsubsubTopic.topicId; + } + else if($scope.indicatorTopic_subsubTopic){ + metadataExport.topicReference = $scope.indicatorTopic_subsubTopic.topicId; + } + else if($scope.indicatorTopic_subTopic){ + metadataExport.topicReference = $scope.indicatorTopic_subTopic.topicId; + } + else if($scope.indicatorTopic_mainTopic){ + metadataExport.topicReference = $scope.indicatorTopic_mainTopic.topicId; + } + else { + metadataExport.topicReference = ""; + } + + metadataExport.refrencesToOtherIndicators = []; + + if($scope.indicatorReferences_adminView && $scope.indicatorReferences_adminView.length > 0){ + metadataExport.refrencesToOtherIndicators = []; + + for (const indicRef of $scope.indicatorReferences_adminView) { + metadataExport.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } + } + + metadataExport.refrencesToGeoresources = []; + + if($scope.georesourceReferences_adminView && $scope.georesourceReferences_adminView.length > 0){ + metadataExport.refrencesToGeoresources = []; + + for (const geoRef of $scope.georesourceReferences_adminView) { + metadataExport.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + + var defaultClassificationMapping = { + "colorBrewerSchemeName" : $scope.selectedColorBrewerPaletteEntry ? $scope.selectedColorBrewerPaletteEntry.paletteName : "Blues", + "items": [ + { + "defaultColorAsHex": "#edf8e9", + "defaultCustomRating": "sehr niedrig" + }, + { + "defaultColorAsHex": "#bae4b3", + "defaultCustomRating": "niedrig" + }, + { + "defaultColorAsHex": "#74c476", + "defaultCustomRating": "mittel" + }, + { + "defaultColorAsHex": "#31a354", + "defaultCustomRating": "hoch" + }, + { + "defaultColorAsHex": "#006d2c", + "defaultCustomRating": "sehr hoch" + } + ] + }; + + metadataExport.defaultClassificationMapping = defaultClassificationMapping; + + + var metadataJSON = JSON.stringify(metadataExport); + + var fileName = "Indikatoren_Metadaten_Export"; + + if (name){ + fileName += "-" + name; + } + + fileName += ".json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + $scope.hideSuccessAlert = function(){ + $("#indicatorEditMetadataSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#indicatorEditMetadataErrorAlert").hide(); + }; + + $scope.hideMetadataErrorAlert = function(){ + $("#indicatorEditMetadataImportErrorAlert").hide(); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.js b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.js index 512161bba..dd2260205 100644 --- a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.js +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('indicatorEditMetadataModal', ['kommonitorDataExchange', 'excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=indicator-edit-metadata-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.js.map b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.js.map new file mode 100644 index 000000000..2de7b6631 --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-edit-metadata-modal.module.js","sourceRoot":"","sources":["indicator-edit-metadata-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.ts b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.ts new file mode 100644 index 000000000..512161bba --- /dev/null +++ b/app/components/kommonitorAdmin/adminIndicatorsManagement/indicatorEditMetadataModal/indicator-edit-metadata-modal.module.ts @@ -0,0 +1 @@ +angular.module('indicatorEditMetadataModal', ['kommonitorDataExchange', 'excaliburDualList', 'kommonitorMultiStepFormHelper', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminMultiUseComponents/batchUpdateResultModal/batch-update-result-modal.component.js b/app/components/kommonitorAdmin/adminMultiUseComponents/batchUpdateResultModal/batch-update-result-modal.component.js index 2914aa53b..6778481d1 100644 --- a/app/components/kommonitorAdmin/adminMultiUseComponents/batchUpdateResultModal/batch-update-result-modal.component.js +++ b/app/components/kommonitorAdmin/adminMultiUseComponents/batchUpdateResultModal/batch-update-result-modal.component.js @@ -1,84 +1,68 @@ +"use strict"; angular.module('batchUpdateResultModal').component('batchUpdateResultModal', { - templateUrl : "components/kommonitorAdmin/adminMultiUseComponents/batchUpdateResultModal/batch-update-result-modal.template.html", - controller : ['$scope', '$rootScope', '__env', - function BatchUpdateResultModalController($scope, $rootScope, __env) { - - $scope.$on("batchUpdateCompleted", function(event, data) { - $scope.initializeResultModal(data) - $("#modal-batch-update-result").modal("show"); - }); - - - $scope.$on("reopenBatchUpdateResultModal", function() { - $("#modal-batch-update-result").modal("show"); - }); - - $scope.initializeResultModal = function(data) { - let responses = data.value; - let resourceType = data.resourceType - - let resourceTypeTableHeading = $("#batch-update-result-table-resource-type") - if (resourceType === "georesource") - resourceTypeTableHeading.html("Georessource") - if (resourceType === "indicator") - resourceTypeTableHeading.html("Indikator") - - - // populate table - for(var i=0;i { - $scope.$digest(); - }, timeout); - } - - - + templateUrl: "components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '__env', + function IndicatorEditTimeseriesMappingController(kommonitorDataExchangeService, $scope, $rootScope, __env) { + /* + [ + { + indicatorValueProperty: "DATE_2008-01-01" + timestamp: "2021-04-01" + timestampProperty: undefined + }, + { + indicatorValueProperty: "DATE_2009-01-01" + timestamp: undefined + timestampProperty: "2009-01-01" + } + ] + */ + //$scope.timeseriesMapping = [] + $scope.useTimeseriesAsProperty = false; + $scope.userInputIndicatorValueProperty = undefined; + $scope.userInputTimestamp = undefined; + $scope.userInputTimestampProperty = undefined; + //Date picker + $('.indicatorTimeseriesMappingTimestampDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + $scope.onChangeUseTimeseriesAsProperty = function () { + if ($scope.useTimeseriesAsProperty) { + $scope.userInputTimestamp = undefined; + } + else { + $scope.userInputTimestampProperty = undefined; + } + }; + $scope.onClickUpdateTimeseriesMapping = function () { + var tmpIndicatorTimeseriesMapping = { + "indicatorValueProperty": $scope.userInputIndicatorValueProperty, + "timestampProperty": $scope.userInputTimestampProperty, + "timestamp": $scope.userInputTimestamp + }; + var entryExists = false; + for (let index = 0; index < $scope.timeseriesMapping.length; index++) { + var timeseriesMappingEntry = $scope.timeseriesMapping[index]; + if (timeseriesMappingEntry.indicatorValueProperty === tmpIndicatorTimeseriesMapping.indicatorValueProperty) { + // replace object + $scope.timeseriesMapping[index] = tmpIndicatorTimeseriesMapping; + entryExists = true; + break; + } + } + if (!entryExists) { + // new entry + $scope.timeseriesMapping.push(tmpIndicatorTimeseriesMapping); + } + $scope.userInputIndicatorValueProperty = undefined; + $scope.userInputTimestampProperty = undefined; + $scope.userInputTimestamp = undefined; + $scope.digestAfterTimeout(250); + $rootScope.$broadcast("timeseriesMappingChanged", { mapping: $scope.timeseriesMapping }); + }; + $scope.onClickEditTimeseriesMappingEntry = function (timeseriesMappingEntry) { + $scope.userInputIndicatorValueProperty = timeseriesMappingEntry.indicatorValueProperty; + $scope.userInputTimestampProperty = timeseriesMappingEntry.timestampProperty; + $scope.userInputTimestamp = timeseriesMappingEntry.timestamp; + if ($scope.userInputTimestamp) { + $('.indicatorTimeseriesMappingTimestampDatepicker').datepicker('setDate', $scope.userInputTimestamp); + $scope.useTimeseriesAsProperty = false; + } + else { + $scope.useTimeseriesAsProperty = true; + } + $scope.digestAfterTimeout(250); + }; + $scope.onClickDeleteTimeseriesMappingEntry = function (timeseriesMappingEntry) { + for (let index = 0; index < $scope.timeseriesMapping.length; index++) { + if ($scope.timeseriesMapping[index].indicatorValueProperty === timeseriesMappingEntry.indicatorValueProperty) { + // remove object + $scope.timeseriesMapping.splice(index, 1); + break; + } + } + $scope.digestAfterTimeout(250); + $rootScope.$broadcast("timeseriesMappingChanged", { mapping: $scope.timeseriesMapping }); + }; + $scope.$on('loadTimeseriesMapping', function (event, args) { + if (typeof args.mapping !== "undefined") { + $scope.loadTimeseriesMapping(args.mapping); + } + else { + throw "Can't load timeseries mapping because args has no property 'mapping'."; + } + }); + $scope.loadTimeseriesMapping = function (mapping) { + let isValid = true; + if (mapping) { + for (const entry of mapping) { + if (!(entry.hasOwnProperty("indicatorValueProperty") && + (entry.hasOwnProperty("timestamp") || entry.hasOwnProperty("timestampProperty")))) + isValid = false; + } + } + if (isValid) + $scope.timeseriesMapping = mapping; + else + throw "Can't load timeseries mapping because mapping has incorrect properties.\ + Expected: indicatorValueProperty and either timestamp or timestampProperty."; + $scope.digestAfterTimeout(250); + $rootScope.$broadcast("timeseriesMappingChanged", { mapping: $scope.timeseriesMapping }); + }; + $scope.$on('resetTimeseriesMapping', function () { + $scope.resetTimeseriesMapping(); + }); + $scope.resetTimeseriesMapping = function () { + $scope.timeseriesMapping = []; + $scope.useTimeseriesAsProperty = false; + $scope.userInputIndicatorValueProperty = undefined; + $scope.userInputTimestamp = undefined; + $scope.userInputTimestampProperty = undefined; + $rootScope.$broadcast("timeseriesMappingChanged", { mapping: $scope.timeseriesMapping }); + }; + $scope.digestAfterTimeout = function (timeout) { + setTimeout(() => { + $scope.$digest(); + }, timeout); + }; } ] -}); \ No newline at end of file +}); +//# sourceMappingURL=indicator-edit-timeseries-mapping.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.component.js.map b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.component.js.map new file mode 100644 index 000000000..eb31a36c6 --- /dev/null +++ b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-edit-timeseries-mapping.component.js","sourceRoot":"","sources":["indicator-edit-timeseries-mapping.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.component.ts b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.component.ts new file mode 100644 index 000000000..227e54726 --- /dev/null +++ b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.component.ts @@ -0,0 +1,163 @@ +angular.module('indicatorEditTimeseriesMapping').component('indicatorEditTimeseriesMapping', { + templateUrl : "components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '__env', + function IndicatorEditTimeseriesMappingController(kommonitorDataExchangeService, $scope, $rootScope, __env) { + + /* + [ + { + indicatorValueProperty: "DATE_2008-01-01" + timestamp: "2021-04-01" + timestampProperty: undefined + }, + { + indicatorValueProperty: "DATE_2009-01-01" + timestamp: undefined + timestampProperty: "2009-01-01" + } + ] + */ + //$scope.timeseriesMapping = [] + $scope.useTimeseriesAsProperty = false; + + $scope.userInputIndicatorValueProperty = undefined; + $scope.userInputTimestamp = undefined; + $scope.userInputTimestampProperty = undefined; + + //Date picker + $('.indicatorTimeseriesMappingTimestampDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + + + + $scope.onChangeUseTimeseriesAsProperty = function(){ + if($scope.useTimeseriesAsProperty){ + $scope.userInputTimestamp = undefined; + } + else{ + $scope.userInputTimestampProperty = undefined; + } + }; + + + $scope.onClickUpdateTimeseriesMapping = function(){ + var tmpIndicatorTimeseriesMapping = { + "indicatorValueProperty": $scope.userInputIndicatorValueProperty, + "timestampProperty": $scope.userInputTimestampProperty, + "timestamp": $scope.userInputTimestamp + }; + + var entryExists = false; + + for (let index = 0; index < $scope.timeseriesMapping.length; index++) { + var timeseriesMappingEntry = $scope.timeseriesMapping[index]; + + if (timeseriesMappingEntry.indicatorValueProperty === tmpIndicatorTimeseriesMapping.indicatorValueProperty){ + // replace object + $scope.timeseriesMapping[index] = tmpIndicatorTimeseriesMapping; + entryExists = true; + break; + } + } + + if(! entryExists){ + // new entry + $scope.timeseriesMapping.push(tmpIndicatorTimeseriesMapping); + } + + $scope.userInputIndicatorValueProperty = undefined; + $scope.userInputTimestampProperty = undefined; + $scope.userInputTimestamp = undefined; + + $scope.digestAfterTimeout(250); + $rootScope.$broadcast("timeseriesMappingChanged", { mapping: $scope.timeseriesMapping } ); + }; + + + $scope.onClickEditTimeseriesMappingEntry = function(timeseriesMappingEntry){ + + $scope.userInputIndicatorValueProperty = timeseriesMappingEntry.indicatorValueProperty; + $scope.userInputTimestampProperty = timeseriesMappingEntry.timestampProperty; + $scope.userInputTimestamp = timeseriesMappingEntry.timestamp; + + if($scope.userInputTimestamp){ + $('.indicatorTimeseriesMappingTimestampDatepicker').datepicker('setDate', $scope.userInputTimestamp); + $scope.useTimeseriesAsProperty = false; + } + else{ + $scope.useTimeseriesAsProperty = true; + } + + $scope.digestAfterTimeout(250); + }; + + + $scope.onClickDeleteTimeseriesMappingEntry = function(timeseriesMappingEntry){ + for (let index = 0; index < $scope.timeseriesMapping.length; index++) { + + if ($scope.timeseriesMapping[index].indicatorValueProperty === timeseriesMappingEntry.indicatorValueProperty){ + // remove object + $scope.timeseriesMapping.splice(index, 1); + break; + } + } + + $scope.digestAfterTimeout(250); + $rootScope.$broadcast("timeseriesMappingChanged", { mapping: $scope.timeseriesMapping } ); + }; + + $scope.$on('loadTimeseriesMapping', function(event, args) { + if(typeof args.mapping !== "undefined") { + $scope.loadTimeseriesMapping(args.mapping); + } else { + throw "Can't load timeseries mapping because args has no property 'mapping'." + } + }); + + + $scope.loadTimeseriesMapping = function(mapping) { + let isValid = true; + if(mapping) { + for(const entry of mapping) { + if( !(entry.hasOwnProperty("indicatorValueProperty") && + (entry.hasOwnProperty("timestamp") || entry.hasOwnProperty("timestampProperty")))) + isValid = false + } + } + + if(isValid) + $scope.timeseriesMapping = mapping; + else + throw "Can't load timeseries mapping because mapping has incorrect properties.\ + Expected: indicatorValueProperty and either timestamp or timestampProperty." + + $scope.digestAfterTimeout(250); + $rootScope.$broadcast("timeseriesMappingChanged", { mapping: $scope.timeseriesMapping } ); + }; + + + + $scope.$on('resetTimeseriesMapping', function() { + $scope.resetTimeseriesMapping() + }); + + $scope.resetTimeseriesMapping = function() { + $scope.timeseriesMapping = []; + $scope.useTimeseriesAsProperty = false; + $scope.userInputIndicatorValueProperty = undefined; + $scope.userInputTimestamp = undefined; + $scope.userInputTimestampProperty = undefined; + $rootScope.$broadcast("timeseriesMappingChanged", { mapping: $scope.timeseriesMapping } ); + }; + + + $scope.digestAfterTimeout = function(timeout) { + setTimeout(() => { + $scope.$digest(); + }, timeout); + } + + + + } + ] +}); \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.js b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.js index b94097add..16c9ebaba 100644 --- a/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.js +++ b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.js @@ -1 +1,3 @@ -angular.module('indicatorEditTimeseriesMapping', ['kommonitorBatchUpdateHelper']); \ No newline at end of file +"use strict"; +angular.module('indicatorEditTimeseriesMapping', ['kommonitorBatchUpdateHelper']); +//# sourceMappingURL=indicator-edit-timeseries-mapping.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.js.map b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.js.map new file mode 100644 index 000000000..ab482a050 --- /dev/null +++ b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-edit-timeseries-mapping.module.js","sourceRoot":"","sources":["indicator-edit-timeseries-mapping.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gCAAgC,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.ts b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.ts new file mode 100644 index 000000000..b94097add --- /dev/null +++ b/app/components/kommonitorAdmin/adminMultiUseComponents/indicatorEditTimeseriesMapping/indicator-edit-timeseries-mapping.module.ts @@ -0,0 +1 @@ +angular.module('indicatorEditTimeseriesMapping', ['kommonitorBatchUpdateHelper']); \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.js b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.js index 0fee59c36..076b49b7e 100644 --- a/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.js +++ b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.js @@ -1,9 +1,10 @@ +"use strict"; angular.module('adminRoleExplanation').component('adminRoleExplanation', { - templateUrl : "components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$timeout', '$rootScope', '__env', '$http', - function RoleManagementController(kommonitorDataExchangeService, $scope, $timeout, $rootScope, __env, $http) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function RoleManagementController(kommonitorDataExchangeService, $scope, $timeout, $rootScope, __env, $http) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + } + ] +}); +//# sourceMappingURL=admin-role-explanation.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.js.map b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.js.map new file mode 100644 index 000000000..786f18175 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-role-explanation.component.js","sourceRoot":"","sources":["admin-role-explanation.component.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,SAAS,CAAC,sBAAsB,EAAE;IACxE,WAAW,EAAG,sFAAsF;IACpG,UAAU,EAAG,CAAC,+BAA+B,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;QACnG,SAAS,wBAAwB,CAAC,6BAA6B,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK;YAE1G,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;QAE5E,CAAC;KACD;CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.ts b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.ts new file mode 100644 index 000000000..0fee59c36 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.component.ts @@ -0,0 +1,9 @@ +angular.module('adminRoleExplanation').component('adminRoleExplanation', { + templateUrl : "components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function RoleManagementController(kommonitorDataExchangeService, $scope, $timeout, $rootScope, __env, $http) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.js b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.js index 94edf3728..cc573d772 100644 --- a/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.js +++ b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminRoleExplanation', ['kommonitorDataExchange']); +//# sourceMappingURL=admin-role-explanation.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.js.map b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.js.map new file mode 100644 index 000000000..3f25a5983 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-role-explanation.module.js","sourceRoot":"","sources":["admin-role-explanation.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.ts b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.ts new file mode 100644 index 000000000..94edf3728 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleExplanation/admin-role-explanation.module.ts @@ -0,0 +1 @@ +angular.module('adminRoleExplanation', ['kommonitorDataExchange']); diff --git a/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.js b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.js index 378f9407a..ab8eda474 100644 --- a/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.js +++ b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.js @@ -1,147 +1,115 @@ -angular.module('adminRoleManagement').component('adminRoleManagement', { - templateUrl: "components/kommonitorAdmin/adminRoleManagement/admin-role-management.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', 'kommonitorKeycloakHelperService', - '$scope', '$rootScope', '__env', '$http', '$timeout', - function RoleManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, - kommonitorKeycloakHelperService, $scope, $rootScope, __env, $http, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - - $scope.availableRoleDatasets; - $scope.selectAllEntriesInput = false; - - $scope.$on("initialMetadataLoadingCompleted", function (event) { - $timeout(function () { - $scope.initializeOrRefreshOverviewTable(); - }, 250); - }); - - $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { - $scope.loadingData = false; - }); - - $scope.initializeOrRefreshOverviewTable = function () { - $scope.loadingData = true; - $scope.accessControl = JSON.parse(JSON.stringify(kommonitorDataExchangeService.accessControl)); - - kommonitorDataGridHelperService.buildDataGrid_accessControl($scope.accessControl); - - $scope.loadingData = false; - }; - - $scope.$on("refreshAccessControlTable", function (event, crudType, targetRoleId) { - $scope.loadingData = true; - $scope.refreshAccessControlTable(crudType, targetRoleId); - }); - - $scope.onChangeSelectAllEntries = function () { - if ($scope.selectAllEntriesInput) { - $scope.availableRoleDatasets.forEach(function (dataset) { - dataset.isSelected = true; - }); - } - else { - $scope.availableRoleDatasets.forEach(function (dataset) { - dataset.isSelected = false; - }); - } - }; - - $scope.onChangeSelectAllEntries = function () { - if ($scope.selectAllEntriesInput) { - $scope.availableRoleDatasets.forEach(function (dataset) { - dataset.isSelected = true; - }); - } - else { - $scope.availableRoleDatasets.forEach(function (dataset) { - dataset.isSelected = false; - }); - } - }; - - $scope.refreshAccessControlTable = function (crudType, targetId) { - - if(! crudType || !targetId){ - // refetch all metadata from spatial units to update table - kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { - $scope.initializeOrRefreshOverviewTable(); - $scope.loadingData = false; - - }, function errorCallback(response) { - $scope.loadingData = false; - }); - } - else if(crudType && targetId){ - if(crudType == "add"){ - kommonitorCacheHelperService.fetchSingleAccessControlMetadata(targetId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - - }, function errorCallback(response) { - - $scope.loadingData = false; - }); - } - else if(crudType == "edit"){ - kommonitorCacheHelperService.fetchSingleAccessControlMetadata(targetId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - $scope.initializeOrRefreshOverviewTable(); - $scope.loadingData = false; - - }, function errorCallback(response) { - - $scope.loadingData = false; - }); - } - else if(crudType == "delete"){ - // targetRoleId might be array in this case - if(targetId && typeof targetId == "string"){ - kommonitorDataExchangeService.deleteSingleAccessControlMetadata(targetId); - - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - } - - else if (targetId && Array.isArray(targetId)){ - for (const id of targetId) { - kommonitorDataExchangeService.deleteSingleAccessControlMetadata(id); - } - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - } - - } - } - - }; - - $scope.onClickDeleteDatasets = function () { - $scope.loadingData = true; - - var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedAccessControlMetadata(); - - // submit selected spatial units to modal controller - $rootScope.$broadcast("onDeleteOrganizationalUnit", markedEntriesForDeletion); - - $scope.loadingData = false; - }; - - $scope.onClickEditMetadata = function (roleDataset) { - // submit selected spatial unit to modal controller - console.dir(roleDataset); - $rootScope.$broadcast("onEditRoleMetadata", roleDataset); - }; - - } - ] -}); +"use strict"; +angular.module('adminRoleManagement').component('adminRoleManagement', { + templateUrl: "components/kommonitorAdmin/adminRoleManagement/admin-role-management.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', 'kommonitorKeycloakHelperService', + '$scope', '$rootScope', '__env', '$http', '$timeout', + function RoleManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, kommonitorKeycloakHelperService, $scope, $rootScope, __env, $http, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.availableRoleDatasets; + $scope.selectAllEntriesInput = false; + $scope.$on("initialMetadataLoadingCompleted", function (event) { + $timeout(function () { + $scope.initializeOrRefreshOverviewTable(); + }, 250); + }); + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + $scope.loadingData = false; + }); + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + $scope.accessControl = JSON.parse(JSON.stringify(kommonitorDataExchangeService.accessControl)); + kommonitorDataGridHelperService.buildDataGrid_accessControl($scope.accessControl); + $scope.loadingData = false; + }; + $scope.$on("refreshAccessControlTable", function (event, crudType, targetRoleId) { + $scope.loadingData = true; + $scope.refreshAccessControlTable(crudType, targetRoleId); + }); + $scope.onChangeSelectAllEntries = function () { + if ($scope.selectAllEntriesInput) { + $scope.availableRoleDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableRoleDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + $scope.onChangeSelectAllEntries = function () { + if ($scope.selectAllEntriesInput) { + $scope.availableRoleDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableRoleDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + $scope.refreshAccessControlTable = function (crudType, targetId) { + if (!crudType || !targetId) { + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + }); + } + else if (crudType && targetId) { + if (crudType == "add") { + kommonitorCacheHelperService.fetchSingleAccessControlMetadata(targetId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + }); + } + else if (crudType == "edit") { + kommonitorCacheHelperService.fetchSingleAccessControlMetadata(targetId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + }); + } + else if (crudType == "delete") { + // targetRoleId might be array in this case + if (targetId && typeof targetId == "string") { + kommonitorDataExchangeService.deleteSingleAccessControlMetadata(targetId); + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + } + else if (targetId && Array.isArray(targetId)) { + for (const id of targetId) { + kommonitorDataExchangeService.deleteSingleAccessControlMetadata(id); + } + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + } + } + } + }; + $scope.onClickDeleteDatasets = function () { + $scope.loadingData = true; + var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedAccessControlMetadata(); + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteOrganizationalUnit", markedEntriesForDeletion); + $scope.loadingData = false; + }; + $scope.onClickEditMetadata = function (roleDataset) { + // submit selected spatial unit to modal controller + console.dir(roleDataset); + $rootScope.$broadcast("onEditRoleMetadata", roleDataset); + }; + } + ] +}); +//# sourceMappingURL=admin-role-management.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.js.map b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.js.map new file mode 100644 index 000000000..a0e54cd0c --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-role-management.component.js","sourceRoot":"","sources":["admin-role-management.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.ts b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.ts new file mode 100644 index 000000000..df4344bee --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.component.ts @@ -0,0 +1,147 @@ +angular.module('adminRoleManagement').component('adminRoleManagement', { + templateUrl: "components/kommonitorAdmin/adminRoleManagement/admin-role-management.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', 'kommonitorKeycloakHelperService', + '$scope', '$rootScope', '__env', '$http', '$timeout', + function RoleManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, + kommonitorKeycloakHelperService, $scope, $rootScope, __env, $http, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + + $scope.availableRoleDatasets; + $scope.selectAllEntriesInput = false; + + $scope.$on("initialMetadataLoadingCompleted", function (event) { + $timeout(function () { + $scope.initializeOrRefreshOverviewTable(); + }, 250); + }); + + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + $scope.loadingData = false; + }); + + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + $scope.accessControl = JSON.parse(JSON.stringify(kommonitorDataExchangeService.accessControl)); + + kommonitorDataGridHelperService.buildDataGrid_accessControl($scope.accessControl); + + $scope.loadingData = false; + }; + + $scope.$on("refreshAccessControlTable", function (event, crudType, targetRoleId) { + $scope.loadingData = true; + $scope.refreshAccessControlTable(crudType, targetRoleId); + }); + + $scope.onChangeSelectAllEntries = function () { + if ($scope.selectAllEntriesInput) { + $scope.availableRoleDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableRoleDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + + $scope.onChangeSelectAllEntries = function () { + if ($scope.selectAllEntriesInput) { + $scope.availableRoleDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableRoleDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + + $scope.refreshAccessControlTable = function (crudType, targetId) { + + if(! crudType || !targetId){ + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + + }, function errorCallback(response) { + $scope.loadingData = false; + }); + } + else if(crudType && targetId){ + if(crudType == "add"){ + kommonitorCacheHelperService.fetchSingleAccessControlMetadata(targetId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + + }, function errorCallback(response) { + + $scope.loadingData = false; + }); + } + else if(crudType == "edit"){ + kommonitorCacheHelperService.fetchSingleAccessControlMetadata(targetId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + + }, function errorCallback(response) { + + $scope.loadingData = false; + }); + } + else if(crudType == "delete"){ + // targetRoleId might be array in this case + if(targetId && typeof targetId == "string"){ + kommonitorDataExchangeService.deleteSingleAccessControlMetadata(targetId); + + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + } + + else if (targetId && Array.isArray(targetId)){ + for (const id of targetId) { + kommonitorDataExchangeService.deleteSingleAccessControlMetadata(id); + } + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + } + + } + } + + }; + + $scope.onClickDeleteDatasets = function () { + $scope.loadingData = true; + + var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedAccessControlMetadata(); + + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteOrganizationalUnit", markedEntriesForDeletion); + + $scope.loadingData = false; + }; + + $scope.onClickEditMetadata = function (roleDataset) { + // submit selected spatial unit to modal controller + console.dir(roleDataset); + $rootScope.$broadcast("onEditRoleMetadata", roleDataset); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.js b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.js index f93117994..cefa8a683 100644 --- a/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.js +++ b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminRoleManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorKeycloakHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=admin-role-management.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.js.map b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.js.map new file mode 100644 index 000000000..06c75cba8 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-role-management.module.js","sourceRoot":"","sources":["admin-role-management.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,wBAAwB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.ts b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.ts new file mode 100644 index 000000000..f93117994 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/admin-role-management.module.ts @@ -0,0 +1 @@ +angular.module('adminRoleManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorKeycloakHelper', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.js b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.js index c7ef4ee79..ccadbf41e 100644 --- a/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.js +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.js @@ -1,129 +1,107 @@ +"use strict"; angular.module('roleAddModal').component('roleAddModal', { - templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', - function SpatialUnitAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, kommonitorKeycloakHelperService, $scope, $rootScope, $timeout, $http, __env) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; - - $scope.loadingData = false; - $scope.newOrganizationalUnit = {}; - - $scope.nameInvalid = false; - $scope.errorMessagePart = undefined; - $scope.keycloakErrorMessagePart = undefined; - - $scope.checkRoleName = function () { - $scope.nameInvalid = kommonitorDataExchangeService.accessControl.some(ou => ou.name === $scope.newOrganizationalUnit.name); - }; - - - $scope.resetRoleAddForm = function () { - $scope.newOrganizationalUnit = {}; - - $scope.errorMessagePart = undefined; - $scope.keycloakErrorMessagePart = undefined; - $scope.checkRoleName(); - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.addRole = async function () { - $scope.errorMessagePart = undefined; - $scope.keycloakErrorMessagePart = undefined; - - let roleId = ""; - try { - var postBody = - { - "name": $scope.newOrganizationalUnit.name, - "description": $scope.newOrganizationalUnit.description, - "contact": $scope.newOrganizationalUnit.contact, - }; - - $scope.loadingData = true; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits", - method: "POST", - data: postBody - // headers: { - // 'Content-Type': 'application/json' - // } - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $("#roleAddSuccessAlert").show(); - try { - // The fetch API does not expose the Location Header for XSS protection - // So we refetch all metadata - await kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - kommonitorDataExchangeService.accessControl.forEach(function (entry) { - if (entry.name === $scope.newOrganizationalUnit.name) { - $scope.newOrganizationalUnit = JSON.parse(JSON.stringify(entry)) - } - }); - - await kommonitorKeycloakHelperService.postNewRoles($scope.newOrganizationalUnit.name); - await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); - $("#keycloakRoleAddSuccessAlert").show(); - } catch (error) { - if (error.data) { - $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $timeout(function () { - - $("#keycloakRoleAddErrorAlert").show(); - $scope.loadingData = false; - }); - } - - $rootScope.$broadcast("refreshAccessControlTable", "add", $scope.newOrganizationalUnit.organizationalUnitId); - $scope.checkRoleName(); - $timeout(function () { - $scope.loadingData = false; - }); - - }, function errorCallback(error) { - - }); - } catch (error) { - if (error.data) { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#roleAddErrorAlert").show(); - $scope.loadingData = false; - } - }; - - $scope.hideSuccessAlert = function () { - $("#roleAddSuccessAlert").hide(); - }; - - $scope.hideKeycloakSuccessAlert = function () { - $("#keycloakRoleAddSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function () { - $("#roleAddErrorAlert").hide(); - }; - - $scope.hideKeycloakErrorAlert = function () { - $("#keycloakRoleAddErrorAlert").hide(); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', + function SpatialUnitAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, kommonitorKeycloakHelperService, $scope, $rootScope, $timeout, $http, __env) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + $scope.loadingData = false; + $scope.newOrganizationalUnit = {}; + $scope.nameInvalid = false; + $scope.errorMessagePart = undefined; + $scope.keycloakErrorMessagePart = undefined; + $scope.checkRoleName = function () { + $scope.nameInvalid = kommonitorDataExchangeService.accessControl.some(ou => ou.name === $scope.newOrganizationalUnit.name); + }; + $scope.resetRoleAddForm = function () { + $scope.newOrganizationalUnit = {}; + $scope.errorMessagePart = undefined; + $scope.keycloakErrorMessagePart = undefined; + $scope.checkRoleName(); + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.addRole = async function () { + $scope.errorMessagePart = undefined; + $scope.keycloakErrorMessagePart = undefined; + let roleId = ""; + try { + var postBody = { + "name": $scope.newOrganizationalUnit.name, + "description": $scope.newOrganizationalUnit.description, + "contact": $scope.newOrganizationalUnit.contact, + }; + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits", + method: "POST", + data: postBody + // headers: { + // 'Content-Type': 'application/json' + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $("#roleAddSuccessAlert").show(); + try { + // The fetch API does not expose the Location Header for XSS protection + // So we refetch all metadata + await kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + kommonitorDataExchangeService.accessControl.forEach(function (entry) { + if (entry.name === $scope.newOrganizationalUnit.name) { + $scope.newOrganizationalUnit = JSON.parse(JSON.stringify(entry)); + } + }); + await kommonitorKeycloakHelperService.postNewRoles($scope.newOrganizationalUnit.name); + await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); + $("#keycloakRoleAddSuccessAlert").show(); + } + catch (error) { + if (error.data) { + $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $timeout(function () { + $("#keycloakRoleAddErrorAlert").show(); + $scope.loadingData = false; + }); + } + $rootScope.$broadcast("refreshAccessControlTable", "add", $scope.newOrganizationalUnit.organizationalUnitId); + $scope.checkRoleName(); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + }); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#roleAddErrorAlert").show(); + $scope.loadingData = false; + } + }; + $scope.hideSuccessAlert = function () { + $("#roleAddSuccessAlert").hide(); + }; + $scope.hideKeycloakSuccessAlert = function () { + $("#keycloakRoleAddSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#roleAddErrorAlert").hide(); + }; + $scope.hideKeycloakErrorAlert = function () { + $("#keycloakRoleAddErrorAlert").hide(); + }; + } + ] }); +//# sourceMappingURL=role-add-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.js.map b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.js.map new file mode 100644 index 000000000..1004e6e1d --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"role-add-modal.component.js","sourceRoot":"","sources":["role-add-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.ts b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.ts new file mode 100644 index 000000000..c7ef4ee79 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.component.ts @@ -0,0 +1,129 @@ +angular.module('roleAddModal').component('roleAddModal', { + templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', + function SpatialUnitAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, kommonitorKeycloakHelperService, $scope, $rootScope, $timeout, $http, __env) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + + $scope.loadingData = false; + $scope.newOrganizationalUnit = {}; + + $scope.nameInvalid = false; + $scope.errorMessagePart = undefined; + $scope.keycloakErrorMessagePart = undefined; + + $scope.checkRoleName = function () { + $scope.nameInvalid = kommonitorDataExchangeService.accessControl.some(ou => ou.name === $scope.newOrganizationalUnit.name); + }; + + + $scope.resetRoleAddForm = function () { + $scope.newOrganizationalUnit = {}; + + $scope.errorMessagePart = undefined; + $scope.keycloakErrorMessagePart = undefined; + $scope.checkRoleName(); + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.addRole = async function () { + $scope.errorMessagePart = undefined; + $scope.keycloakErrorMessagePart = undefined; + + let roleId = ""; + try { + var postBody = + { + "name": $scope.newOrganizationalUnit.name, + "description": $scope.newOrganizationalUnit.description, + "contact": $scope.newOrganizationalUnit.contact, + }; + + $scope.loadingData = true; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits", + method: "POST", + data: postBody + // headers: { + // 'Content-Type': 'application/json' + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $("#roleAddSuccessAlert").show(); + try { + // The fetch API does not expose the Location Header for XSS protection + // So we refetch all metadata + await kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + kommonitorDataExchangeService.accessControl.forEach(function (entry) { + if (entry.name === $scope.newOrganizationalUnit.name) { + $scope.newOrganizationalUnit = JSON.parse(JSON.stringify(entry)) + } + }); + + await kommonitorKeycloakHelperService.postNewRoles($scope.newOrganizationalUnit.name); + await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); + $("#keycloakRoleAddSuccessAlert").show(); + } catch (error) { + if (error.data) { + $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $timeout(function () { + + $("#keycloakRoleAddErrorAlert").show(); + $scope.loadingData = false; + }); + } + + $rootScope.$broadcast("refreshAccessControlTable", "add", $scope.newOrganizationalUnit.organizationalUnitId); + $scope.checkRoleName(); + $timeout(function () { + $scope.loadingData = false; + }); + + }, function errorCallback(error) { + + }); + } catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#roleAddErrorAlert").show(); + $scope.loadingData = false; + } + }; + + $scope.hideSuccessAlert = function () { + $("#roleAddSuccessAlert").hide(); + }; + + $scope.hideKeycloakSuccessAlert = function () { + $("#keycloakRoleAddSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function () { + $("#roleAddErrorAlert").hide(); + }; + + $scope.hideKeycloakErrorAlert = function () { + $("#keycloakRoleAddErrorAlert").hide(); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.js b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.js index c8f28576b..7c3e0fdd7 100644 --- a/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.js +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('roleAddModal', ['kommonitorImporterHelper', 'kommonitorKeycloakHelper']); +//# sourceMappingURL=role-add-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.js.map b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.js.map new file mode 100644 index 000000000..1051a6199 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"role-add-modal.module.js","sourceRoot":"","sources":["role-add-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,0BAA0B,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.ts b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.ts new file mode 100644 index 000000000..c8f28576b --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleAddModal/role-add-modal.module.ts @@ -0,0 +1 @@ +angular.module('roleAddModal', ['kommonitorImporterHelper', 'kommonitorKeycloakHelper']); diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.js b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.js index 0aef96685..5f2012859 100644 --- a/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.js +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.js @@ -1,215 +1,169 @@ +"use strict"; angular.module('roleDeleteModal').component('roleDeleteModal', { - templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function RoleDeleteModalController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, $scope, $rootScope, $http, __env, $q, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; - - $scope.elementsToDelete = []; - - $scope.loadingData = false; - - $scope.successfullyDeletedDatasets = []; - $scope.failedDatasetsAndErrors = []; - - $scope.deleteCorrespondingKeycloakRole = false; - - $scope.affectedSpatialUnits = []; - $scope.affectedGeoresources = []; - $scope.affectedIndicators = []; - - $scope.$on("onDeleteOrganizationalUnit", function (event, datasets) { - $scope.resetRolesDeleteForm(); - const original_size = datasets.length; - datasets = datasets.filter(org => org.name != "public" && org.name != "kommonitor") - if (datasets.length < original_size) { - $scope.failedDatasetsAndErrors.push([{"name": "public / kommonitor"}, "System Organisationseinheiten können nicht gelöscht werden! Die betroffene Einheit wurde aus der Liste entfernt."]); - $("#rolesDeleteErrorAlert").show(); - } - $scope.elementsToDelete = datasets; - }); - - - $scope.resetRolesDeleteForm = function () { - - $scope.successfullyDeletedDatasets = []; - $scope.failedDatasetsAndErrors = []; - $scope.affectedSpatialUnits = $scope.gatherAffectedSpatialUnits(); - $scope.affectedGeoresources = $scope.gatherAffectedGeoresources(); - $scope.affectedIndicators = $scope.gatherAffectedIndicators(); - $("#rolesDeleteSuccessAlert").hide(); - $("#rolesDeleteErrorAlert").hide(); - }; - - $scope.gatherAffectedSpatialUnits = function () { - $scope.affectedSpatialUnits = []; - - kommonitorDataExchangeService.availableSpatialUnits.forEach(function (spatialUnit) { - var allowedRoles = spatialUnit.allowedRoles; - - for (const datasetToDelete of $scope.elementsToDelete) { - if (allowedRoles.includes(datasetToDelete.organizationalUnitId)) { - $scope.affectedSpatialUnits.push(spatialUnit); - break; - } - } - }); - - return $scope.affectedSpatialUnits; - }; - - $scope.gatherAffectedGeoresources = function () { - $scope.affectedGeoresources = []; - - kommonitorDataExchangeService.availableGeoresources.forEach(function (georesource) { - var allowedRoles = georesource.allowedRoles; - - for (const datasetToDelete of $scope.elementsToDelete) { - if (allowedRoles.includes(datasetToDelete.organizationalUnitId)) { - $scope.affectedGeoresources.push(georesource); - break; - } - } - }); - - return $scope.affectedGeoresources; - }; - - $scope.gatherAffectedIndicators = function () { - $scope.affectedIndicators = []; - - kommonitorDataExchangeService.availableIndicators.forEach(function (indicator) { - var allowedRoles_metadata = indicator.allowedRoles; - - for (const datasetToDelete of $scope.elementsToDelete) { - if (allowedRoles_metadata.includes(datasetToDelete.organizationalUnitId)) { - $scope.affectedIndicators.push(indicator); - break; - } - - var applicableSpatialUnits = indicator.applicableSpatialUnits; - for (const applicableSpatialUnit of applicableSpatialUnits) { - if (applicableSpatialUnit.allowedRoles.includes(datasetToDelete.organizationalUnitId)) { - $scope.affectedIndicators.push(indicator); - break; - } - } - } - }); - - return $scope.affectedIndicators; - }; - - $scope.deleteRoles = function () { - - $scope.loadingData = true; - - var deletePromises = []; - - $scope.elementsToDelete.forEach(function (dataset) { - deletePromises.push($scope.getDeleteDatasetPromise(dataset)); - }); - - $q.all(deletePromises).then(async function successCallback(successArray) { - // - - if ($scope.failedDatasetsAndErrors.length > 0) { - // error handling - $("#rolesDeleteErrorAlert").show(); - - $timeout(function(){ - - $scope.loadingData = false; - }); - } - if ($scope.successfullyDeletedDatasets.length > 0) { - $("#rolesDeleteSuccessAlert").show(); - - // fetch mMetada again as roles were deleted - - await kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - // refresh role overview table - $rootScope.$broadcast("refreshAccessControlTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => dataset.organizationalUnitId)); - - // refresh all admin dashboard diagrams due to modified metadata - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - } - }, function errorCallback(errorArray) { - - $("#rolesDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#georesourcesDeleteSuccessAlert").show(); - // } - - $rootScope.$broadcast("refreshAccessControlTable"); - $scope.loadingData = false; - }); - - }; - - $scope.getDeleteDatasetPromise = function (dataset) { - return $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits/" + dataset.organizationalUnitId, - method: "DELETE" - }).then(function successCallback(response) { - $scope.successfullyDeletedDatasets.push(dataset); - - // remove entry from array - var index = -1; - - for (var i = 0; i < kommonitorDataExchangeService.availableRoles.length; i++) { - if (kommonitorDataExchangeService.availableRoles[i].organizationalUnitId === dataset.organizationalUnitId) { - index = i; - break; - } - } - - if (index > -1) { - kommonitorDataExchangeService.availableRoles.splice(index, 1); - } - - // delete role in keycloak - if($scope.deleteCorrespondingKeycloakRole){ - $scope.tryDeleteKeycloakRole(dataset); - } - - }, function errorCallback(error) { - if (error.data) { - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); - } - else { - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); - } - }); - }; - - $scope.tryDeleteKeycloakRole = async function(roleMetadata){ - try { - kommonitorKeycloakHelperService.deleteRoles(roleMetadata.name); - await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); - } catch (error) { - if (error.data) { - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); - } - else { - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); - } - } - }; - - $scope.hideSuccessAlert = function () { - $("#rolesDeleteSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function () { - $("#rolesDeleteErrorAlert").hide(); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function RoleDeleteModalController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, $scope, $rootScope, $http, __env, $q, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + $scope.elementsToDelete = []; + $scope.loadingData = false; + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $scope.deleteCorrespondingKeycloakRole = false; + $scope.affectedSpatialUnits = []; + $scope.affectedGeoresources = []; + $scope.affectedIndicators = []; + $scope.$on("onDeleteOrganizationalUnit", function (event, datasets) { + $scope.resetRolesDeleteForm(); + const original_size = datasets.length; + datasets = datasets.filter(org => org.name != "public" && org.name != "kommonitor"); + if (datasets.length < original_size) { + $scope.failedDatasetsAndErrors.push([{ "name": "public / kommonitor" }, "System Organisationseinheiten können nicht gelöscht werden! Die betroffene Einheit wurde aus der Liste entfernt."]); + $("#rolesDeleteErrorAlert").show(); + } + $scope.elementsToDelete = datasets; + }); + $scope.resetRolesDeleteForm = function () { + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $scope.affectedSpatialUnits = $scope.gatherAffectedSpatialUnits(); + $scope.affectedGeoresources = $scope.gatherAffectedGeoresources(); + $scope.affectedIndicators = $scope.gatherAffectedIndicators(); + $("#rolesDeleteSuccessAlert").hide(); + $("#rolesDeleteErrorAlert").hide(); + }; + $scope.gatherAffectedSpatialUnits = function () { + $scope.affectedSpatialUnits = []; + kommonitorDataExchangeService.availableSpatialUnits.forEach(function (spatialUnit) { + var allowedRoles = spatialUnit.allowedRoles; + for (const datasetToDelete of $scope.elementsToDelete) { + if (allowedRoles.includes(datasetToDelete.organizationalUnitId)) { + $scope.affectedSpatialUnits.push(spatialUnit); + break; + } + } + }); + return $scope.affectedSpatialUnits; + }; + $scope.gatherAffectedGeoresources = function () { + $scope.affectedGeoresources = []; + kommonitorDataExchangeService.availableGeoresources.forEach(function (georesource) { + var allowedRoles = georesource.allowedRoles; + for (const datasetToDelete of $scope.elementsToDelete) { + if (allowedRoles.includes(datasetToDelete.organizationalUnitId)) { + $scope.affectedGeoresources.push(georesource); + break; + } + } + }); + return $scope.affectedGeoresources; + }; + $scope.gatherAffectedIndicators = function () { + $scope.affectedIndicators = []; + kommonitorDataExchangeService.availableIndicators.forEach(function (indicator) { + var allowedRoles_metadata = indicator.allowedRoles; + for (const datasetToDelete of $scope.elementsToDelete) { + if (allowedRoles_metadata.includes(datasetToDelete.organizationalUnitId)) { + $scope.affectedIndicators.push(indicator); + break; + } + var applicableSpatialUnits = indicator.applicableSpatialUnits; + for (const applicableSpatialUnit of applicableSpatialUnits) { + if (applicableSpatialUnit.allowedRoles.includes(datasetToDelete.organizationalUnitId)) { + $scope.affectedIndicators.push(indicator); + break; + } + } + } + }); + return $scope.affectedIndicators; + }; + $scope.deleteRoles = function () { + $scope.loadingData = true; + var deletePromises = []; + $scope.elementsToDelete.forEach(function (dataset) { + deletePromises.push($scope.getDeleteDatasetPromise(dataset)); + }); + $q.all(deletePromises).then(async function successCallback(successArray) { + // + if ($scope.failedDatasetsAndErrors.length > 0) { + // error handling + $("#rolesDeleteErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + } + if ($scope.successfullyDeletedDatasets.length > 0) { + $("#rolesDeleteSuccessAlert").show(); + // fetch mMetada again as roles were deleted + await kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + // refresh role overview table + $rootScope.$broadcast("refreshAccessControlTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => dataset.organizationalUnitId)); + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + $timeout(function () { + $scope.loadingData = false; + }); + } + }, function errorCallback(errorArray) { + $("#rolesDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#georesourcesDeleteSuccessAlert").show(); + // } + $rootScope.$broadcast("refreshAccessControlTable"); + $scope.loadingData = false; + }); + }; + $scope.getDeleteDatasetPromise = function (dataset) { + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits/" + dataset.organizationalUnitId, + method: "DELETE" + }).then(function successCallback(response) { + $scope.successfullyDeletedDatasets.push(dataset); + // remove entry from array + var index = -1; + for (var i = 0; i < kommonitorDataExchangeService.availableRoles.length; i++) { + if (kommonitorDataExchangeService.availableRoles[i].organizationalUnitId === dataset.organizationalUnitId) { + index = i; + break; + } + } + if (index > -1) { + kommonitorDataExchangeService.availableRoles.splice(index, 1); + } + // delete role in keycloak + if ($scope.deleteCorrespondingKeycloakRole) { + $scope.tryDeleteKeycloakRole(dataset); + } + }, function errorCallback(error) { + if (error.data) { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + $scope.tryDeleteKeycloakRole = async function (roleMetadata) { + try { + kommonitorKeycloakHelperService.deleteRoles(roleMetadata.name); + await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); + } + catch (error) { + if (error.data) { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + } + }; + $scope.hideSuccessAlert = function () { + $("#rolesDeleteSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#rolesDeleteErrorAlert").hide(); + }; + } + ] }); +//# sourceMappingURL=role-delete-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.js.map b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.js.map new file mode 100644 index 000000000..82ae0734d --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"role-delete-modal.component.js","sourceRoot":"","sources":["role-delete-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.ts b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.ts new file mode 100644 index 000000000..0aef96685 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.component.ts @@ -0,0 +1,215 @@ +angular.module('roleDeleteModal').component('roleDeleteModal', { + templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function RoleDeleteModalController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, $scope, $rootScope, $http, __env, $q, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + + $scope.elementsToDelete = []; + + $scope.loadingData = false; + + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + + $scope.deleteCorrespondingKeycloakRole = false; + + $scope.affectedSpatialUnits = []; + $scope.affectedGeoresources = []; + $scope.affectedIndicators = []; + + $scope.$on("onDeleteOrganizationalUnit", function (event, datasets) { + $scope.resetRolesDeleteForm(); + const original_size = datasets.length; + datasets = datasets.filter(org => org.name != "public" && org.name != "kommonitor") + if (datasets.length < original_size) { + $scope.failedDatasetsAndErrors.push([{"name": "public / kommonitor"}, "System Organisationseinheiten können nicht gelöscht werden! Die betroffene Einheit wurde aus der Liste entfernt."]); + $("#rolesDeleteErrorAlert").show(); + } + $scope.elementsToDelete = datasets; + }); + + + $scope.resetRolesDeleteForm = function () { + + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $scope.affectedSpatialUnits = $scope.gatherAffectedSpatialUnits(); + $scope.affectedGeoresources = $scope.gatherAffectedGeoresources(); + $scope.affectedIndicators = $scope.gatherAffectedIndicators(); + $("#rolesDeleteSuccessAlert").hide(); + $("#rolesDeleteErrorAlert").hide(); + }; + + $scope.gatherAffectedSpatialUnits = function () { + $scope.affectedSpatialUnits = []; + + kommonitorDataExchangeService.availableSpatialUnits.forEach(function (spatialUnit) { + var allowedRoles = spatialUnit.allowedRoles; + + for (const datasetToDelete of $scope.elementsToDelete) { + if (allowedRoles.includes(datasetToDelete.organizationalUnitId)) { + $scope.affectedSpatialUnits.push(spatialUnit); + break; + } + } + }); + + return $scope.affectedSpatialUnits; + }; + + $scope.gatherAffectedGeoresources = function () { + $scope.affectedGeoresources = []; + + kommonitorDataExchangeService.availableGeoresources.forEach(function (georesource) { + var allowedRoles = georesource.allowedRoles; + + for (const datasetToDelete of $scope.elementsToDelete) { + if (allowedRoles.includes(datasetToDelete.organizationalUnitId)) { + $scope.affectedGeoresources.push(georesource); + break; + } + } + }); + + return $scope.affectedGeoresources; + }; + + $scope.gatherAffectedIndicators = function () { + $scope.affectedIndicators = []; + + kommonitorDataExchangeService.availableIndicators.forEach(function (indicator) { + var allowedRoles_metadata = indicator.allowedRoles; + + for (const datasetToDelete of $scope.elementsToDelete) { + if (allowedRoles_metadata.includes(datasetToDelete.organizationalUnitId)) { + $scope.affectedIndicators.push(indicator); + break; + } + + var applicableSpatialUnits = indicator.applicableSpatialUnits; + for (const applicableSpatialUnit of applicableSpatialUnits) { + if (applicableSpatialUnit.allowedRoles.includes(datasetToDelete.organizationalUnitId)) { + $scope.affectedIndicators.push(indicator); + break; + } + } + } + }); + + return $scope.affectedIndicators; + }; + + $scope.deleteRoles = function () { + + $scope.loadingData = true; + + var deletePromises = []; + + $scope.elementsToDelete.forEach(function (dataset) { + deletePromises.push($scope.getDeleteDatasetPromise(dataset)); + }); + + $q.all(deletePromises).then(async function successCallback(successArray) { + // + + if ($scope.failedDatasetsAndErrors.length > 0) { + // error handling + $("#rolesDeleteErrorAlert").show(); + + $timeout(function(){ + + $scope.loadingData = false; + }); + } + if ($scope.successfullyDeletedDatasets.length > 0) { + $("#rolesDeleteSuccessAlert").show(); + + // fetch mMetada again as roles were deleted + + await kommonitorDataExchangeService.fetchAccessControlMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + // refresh role overview table + $rootScope.$broadcast("refreshAccessControlTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => dataset.organizationalUnitId)); + + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + } + }, function errorCallback(errorArray) { + + $("#rolesDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#georesourcesDeleteSuccessAlert").show(); + // } + + $rootScope.$broadcast("refreshAccessControlTable"); + $scope.loadingData = false; + }); + + }; + + $scope.getDeleteDatasetPromise = function (dataset) { + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits/" + dataset.organizationalUnitId, + method: "DELETE" + }).then(function successCallback(response) { + $scope.successfullyDeletedDatasets.push(dataset); + + // remove entry from array + var index = -1; + + for (var i = 0; i < kommonitorDataExchangeService.availableRoles.length; i++) { + if (kommonitorDataExchangeService.availableRoles[i].organizationalUnitId === dataset.organizationalUnitId) { + index = i; + break; + } + } + + if (index > -1) { + kommonitorDataExchangeService.availableRoles.splice(index, 1); + } + + // delete role in keycloak + if($scope.deleteCorrespondingKeycloakRole){ + $scope.tryDeleteKeycloakRole(dataset); + } + + }, function errorCallback(error) { + if (error.data) { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + + $scope.tryDeleteKeycloakRole = async function(roleMetadata){ + try { + kommonitorKeycloakHelperService.deleteRoles(roleMetadata.name); + await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); + } catch (error) { + if (error.data) { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + } + }; + + $scope.hideSuccessAlert = function () { + $("#rolesDeleteSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function () { + $("#rolesDeleteErrorAlert").hide(); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.js b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.js index 392448e6f..5551e3055 100644 --- a/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.js +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.js @@ -1,7 +1,8 @@ +"use strict"; angular.module('roleDeleteModal', ['kommonitorDataExchange', 'kommonitorKeycloakHelper']); - -angular.module('roleDeleteModal').filter('formatJson', ['kommonitorDataExchangeService', function(kommonitorDataExchangeService){ - return function(json){ - return kommonitorDataExchangeService.syntaxHighlightJSON(json); - }; -}]); +angular.module('roleDeleteModal').filter('formatJson', ['kommonitorDataExchangeService', function (kommonitorDataExchangeService) { + return function (json) { + return kommonitorDataExchangeService.syntaxHighlightJSON(json); + }; + }]); +//# sourceMappingURL=role-delete-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.js.map b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.js.map new file mode 100644 index 000000000..f5ee6d6aa --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"role-delete-modal.module.js","sourceRoot":"","sources":["role-delete-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,wBAAwB,EAAE,0BAA0B,CAAC,CAAC,CAAC;AAE1F,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,+BAA+B,EAAE,UAAS,6BAA6B;QAC3H,OAAO,UAAS,IAAI;YAChB,OAAO,6BAA6B,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC;IACN,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.ts b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.ts new file mode 100644 index 000000000..392448e6f --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleDeleteModal/role-delete-modal.module.ts @@ -0,0 +1,7 @@ +angular.module('roleDeleteModal', ['kommonitorDataExchange', 'kommonitorKeycloakHelper']); + +angular.module('roleDeleteModal').filter('formatJson', ['kommonitorDataExchangeService', function(kommonitorDataExchangeService){ + return function(json){ + return kommonitorDataExchangeService.syntaxHighlightJSON(json); + }; +}]); diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.js b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.js index 6e575d7dc..c90b5485d 100644 --- a/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.js +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.js @@ -1,134 +1,105 @@ +"use strict"; angular.module('roleEditMetadataModal').component('roleEditMetadataModal', { - templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', function RoleEditMetadataModalController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, $scope, $rootScope, $timeout, $http, __env) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; - - $scope.current = {}; - $scope.old = {}; - $scope.old.name = undefined; - $scope.nameInvalid = false; - - $scope.loadingData = false; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $scope.$on("onEditRoleMetadata", function (event, organizationalUnit) { - - $scope.current = organizationalUnit; - $scope.old.name = organizationalUnit.name; - - $scope.resetRoleEditMetadataForm(); - }); - - // Checks for duplicate names - // Disallowed to prevent confusion - $scope.checkRoleName = function(){ - $scope.nameInvalid = false; - kommonitorDataExchangeService.accessControl.forEach(function(ou){ - if (ou.name === $scope.current.name && ou.organizationalUnitId != $scope.current.organizationalUnitId){ - $scope.nameInvalid = true; - return; - } - }); - }; - - - $scope.resetRoleEditMetadataForm = function () { - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $("#editMetadataSuccessAlert").hide(); - $("#editMetadataErrorAlert").hide(); - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.editRoleMetadata = function () { - - var putBody = - { - "name": $scope.current.name, - "description": $scope.current.description, - "contact": $scope.current.contact - }; - - $scope.loadingData = true; - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits/" + $scope.current.organizationalUnitId, - method: "PUT", - data: putBody - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.successMessagePart = $scope.current.name; - - $("#editMetadataSuccessAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - try { - await kommonitorKeycloakHelperService.renameExistingRoles($scope.old.name, $scope.current.name); - // on successful update within keycloak explicitly set old name to current name - // otherwise subsequent edit requests will be erronous - $scope.old.name = $scope.current.name; - await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); - $("#keycloakRoleEditSuccessAlert").show(); - } catch (error) { - if (error.data) { - $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $timeout(function(){ - $("#keycloakRoleEditErrorAlert").show(); - $scope.loadingData = false; - }); - } - - $rootScope.$broadcast("refreshAccessControlTable", "edit", $scope.current.organizationalUnitId); - - }, function errorCallback(error) { - if (error.data) { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#editMetadataErrorAlert").show(); - $scope.loadingData = false; - }); - }; - - - $scope.hideSuccessAlert = function () { - $("#editMetadataSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function () { - $("#editMetadataErrorAlert").hide(); - }; - - $scope.hideKeycloakSuccessAlert = function () { - $("#keycloakRoleEditSuccessAlert").hide(); - }; - - $scope.hideKeycloakErrorAlert = function () { - $("#keycloakRoleEditErrorAlert").hide(); - }; - - - } - ] + templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', function RoleEditMetadataModalController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, $scope, $rootScope, $timeout, $http, __env) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + $scope.current = {}; + $scope.old = {}; + $scope.old.name = undefined; + $scope.nameInvalid = false; + $scope.loadingData = false; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.$on("onEditRoleMetadata", function (event, organizationalUnit) { + $scope.current = organizationalUnit; + $scope.old.name = organizationalUnit.name; + $scope.resetRoleEditMetadataForm(); + }); + // Checks for duplicate names + // Disallowed to prevent confusion + $scope.checkRoleName = function () { + $scope.nameInvalid = false; + kommonitorDataExchangeService.accessControl.forEach(function (ou) { + if (ou.name === $scope.current.name && ou.organizationalUnitId != $scope.current.organizationalUnitId) { + $scope.nameInvalid = true; + return; + } + }); + }; + $scope.resetRoleEditMetadataForm = function () { + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $("#editMetadataSuccessAlert").hide(); + $("#editMetadataErrorAlert").hide(); + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.editRoleMetadata = function () { + var putBody = { + "name": $scope.current.name, + "description": $scope.current.description, + "contact": $scope.current.contact + }; + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits/" + $scope.current.organizationalUnitId, + method: "PUT", + data: putBody + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.successMessagePart = $scope.current.name; + $("#editMetadataSuccessAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + try { + await kommonitorKeycloakHelperService.renameExistingRoles($scope.old.name, $scope.current.name); + // on successful update within keycloak explicitly set old name to current name + // otherwise subsequent edit requests will be erronous + $scope.old.name = $scope.current.name; + await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); + $("#keycloakRoleEditSuccessAlert").show(); + } + catch (error) { + if (error.data) { + $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $timeout(function () { + $("#keycloakRoleEditErrorAlert").show(); + $scope.loadingData = false; + }); + } + $rootScope.$broadcast("refreshAccessControlTable", "edit", $scope.current.organizationalUnitId); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#editMetadataErrorAlert").show(); + $scope.loadingData = false; + }); + }; + $scope.hideSuccessAlert = function () { + $("#editMetadataSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#editMetadataErrorAlert").hide(); + }; + $scope.hideKeycloakSuccessAlert = function () { + $("#keycloakRoleEditSuccessAlert").hide(); + }; + $scope.hideKeycloakErrorAlert = function () { + $("#keycloakRoleEditErrorAlert").hide(); + }; + } + ] }); +//# sourceMappingURL=role-edit-metadata-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.js.map b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.js.map new file mode 100644 index 000000000..ecb5e67c8 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"role-edit-metadata-modal.component.js","sourceRoot":"","sources":["role-edit-metadata-modal.component.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,SAAS,CAAC,uBAAuB,EAAE;IAC1E,WAAW,EAAE,6GAA6G;IAC1H,UAAU,EAAE,CAAC,+BAA+B,EAAE,iCAAiC,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,+BAA+B,CAAC,6BAA6B,EAAE,+BAA+B,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK;YAEzR,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;YAC3E,IAAI,CAAC,uCAAuC,GAAG,+BAA+B,CAAC;YAE/E,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;YAC5B,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAE3B,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAE3B,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAEpC,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,UAAU,KAAK,EAAE,kBAAkB;gBAEnE,MAAM,CAAC,OAAO,GAAG,kBAAkB,CAAC;gBACpC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;gBAE1C,MAAM,CAAC,yBAAyB,EAAE,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,6BAA6B;YAC7B,kCAAkC;YAClC,MAAM,CAAC,aAAa,GAAG;gBACtB,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC3B,6BAA6B,CAAC,aAAa,CAAC,OAAO,CAAC,UAAS,EAAE;oBAC9D,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,oBAAoB,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAC;wBACrG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;wBAC1B,OAAO;qBACP;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAGF,MAAM,CAAC,yBAAyB,GAAG;gBAElC,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACtC,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAEpC,CAAC,CAAC,2BAA2B,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtC,CAAC,CAAC,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEpC,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,GAAG;gBAEzB,IAAI,OAAO,GACX;oBACC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;oBAC3B,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW;oBACzC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;iBACjC,CAAC;gBAEF,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC1B,KAAK,CAAC;oBACL,GAAG,EAAE,6BAA6B,CAAC,0BAA0B,GAAG,uBAAuB,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB;oBAC7H,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,OAAO;iBACb,CAAC,CAAC,IAAI,CAAC,KAAK,UAAU,eAAe,CAAC,QAAQ;oBAC9C,8CAA8C;oBAC9C,iCAAiC;oBAEjC,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;oBAEhD,CAAC,CAAC,2BAA2B,CAAC,CAAC,IAAI,EAAE,CAAC;oBACtC,QAAQ,CAAC;wBAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC5B,CAAC,CAAC,CAAC;oBAEH,IAAI;wBACH,MAAM,+BAA+B,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBAChG,+EAA+E;wBAC/E,uDAAuD;wBACvD,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;wBACtC,MAAM,+BAA+B,CAAC,wBAAwB,EAAE,CAAC;wBACjE,CAAC,CAAC,+BAA+B,CAAC,CAAC,IAAI,EAAE,CAAC;qBAC1C;oBAAC,OAAO,KAAK,EAAE;wBACf,IAAI,KAAK,CAAC,IAAI,EAAE;4BACf,MAAM,CAAC,wBAAwB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;yBAChG;6BACI;4BACJ,MAAM,CAAC,wBAAwB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;yBAC3F;wBAED,QAAQ,CAAC;4BACR,CAAC,CAAC,6BAA6B,CAAC,CAAC,IAAI,EAAE,CAAC;4BACxC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;wBAC5B,CAAC,CAAC,CAAC;qBACH;oBAED,UAAU,CAAC,UAAU,CAAC,2BAA2B,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;gBAEjG,CAAC,EAAE,SAAS,aAAa,CAAC,KAAK;oBAC9B,IAAI,KAAK,CAAC,IAAI,EAAE;wBACf,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACxF;yBACI;wBACJ,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;qBACnF;oBAED,CAAC,CAAC,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;oBACpC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAGF,MAAM,CAAC,gBAAgB,GAAG;gBACzB,CAAC,CAAC,2BAA2B,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,CAAC,CAAC;YAEF,MAAM,CAAC,cAAc,GAAG;gBACvB,CAAC,CAAC,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,CAAC,CAAC;YAEF,MAAM,CAAC,wBAAwB,GAAG;gBACjC,CAAC,CAAC,+BAA+B,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,CAAC,CAAC;YAEF,MAAM,CAAC,sBAAsB,GAAG;gBAC/B,CAAC,CAAC,6BAA6B,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,CAAC,CAAC;QAGH,CAAC;KACA;CACD,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.ts b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.ts new file mode 100644 index 000000000..6e575d7dc --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.component.ts @@ -0,0 +1,134 @@ +angular.module('roleEditMetadataModal').component('roleEditMetadataModal', { + templateUrl: "components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', function RoleEditMetadataModalController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, $scope, $rootScope, $timeout, $http, __env) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + + $scope.current = {}; + $scope.old = {}; + $scope.old.name = undefined; + $scope.nameInvalid = false; + + $scope.loadingData = false; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $scope.$on("onEditRoleMetadata", function (event, organizationalUnit) { + + $scope.current = organizationalUnit; + $scope.old.name = organizationalUnit.name; + + $scope.resetRoleEditMetadataForm(); + }); + + // Checks for duplicate names + // Disallowed to prevent confusion + $scope.checkRoleName = function(){ + $scope.nameInvalid = false; + kommonitorDataExchangeService.accessControl.forEach(function(ou){ + if (ou.name === $scope.current.name && ou.organizationalUnitId != $scope.current.organizationalUnitId){ + $scope.nameInvalid = true; + return; + } + }); + }; + + + $scope.resetRoleEditMetadataForm = function () { + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $("#editMetadataSuccessAlert").hide(); + $("#editMetadataErrorAlert").hide(); + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.editRoleMetadata = function () { + + var putBody = + { + "name": $scope.current.name, + "description": $scope.current.description, + "contact": $scope.current.contact + }; + + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/organizationalUnits/" + $scope.current.organizationalUnitId, + method: "PUT", + data: putBody + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $scope.successMessagePart = $scope.current.name; + + $("#editMetadataSuccessAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + try { + await kommonitorKeycloakHelperService.renameExistingRoles($scope.old.name, $scope.current.name); + // on successful update within keycloak explicitly set old name to current name + // otherwise subsequent edit requests will be erronous + $scope.old.name = $scope.current.name; + await kommonitorKeycloakHelperService.fetchAndSetKeycloakRoles(); + $("#keycloakRoleEditSuccessAlert").show(); + } catch (error) { + if (error.data) { + $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.keycloakErrorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $timeout(function(){ + $("#keycloakRoleEditErrorAlert").show(); + $scope.loadingData = false; + }); + } + + $rootScope.$broadcast("refreshAccessControlTable", "edit", $scope.current.organizationalUnitId); + + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#editMetadataErrorAlert").show(); + $scope.loadingData = false; + }); + }; + + + $scope.hideSuccessAlert = function () { + $("#editMetadataSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function () { + $("#editMetadataErrorAlert").hide(); + }; + + $scope.hideKeycloakSuccessAlert = function () { + $("#keycloakRoleEditSuccessAlert").hide(); + }; + + $scope.hideKeycloakErrorAlert = function () { + $("#keycloakRoleEditErrorAlert").hide(); + }; + + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.js b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.js index 03ba32437..1b6feefc9 100644 --- a/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.js +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('roleEditMetadataModal', ['kommonitorKeycloakHelper']); +//# sourceMappingURL=role-edit-metadata-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.js.map b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.js.map new file mode 100644 index 000000000..144fd9cec --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"role-edit-metadata-modal.module.js","sourceRoot":"","sources":["role-edit-metadata-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.ts b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.ts new file mode 100644 index 000000000..03ba32437 --- /dev/null +++ b/app/components/kommonitorAdmin/adminRoleManagement/roleEditMetadataModal/role-edit-metadata-modal.module.ts @@ -0,0 +1 @@ +angular.module('roleEditMetadataModal', ['kommonitorKeycloakHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.js b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.js index 5941eb621..5423ed45a 100644 --- a/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.js +++ b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.js @@ -1,137 +1,99 @@ +"use strict"; angular.module('adminScriptExecution').component('adminScriptExecution', { - templateUrl: "components/kommonitorAdmin/adminScriptExecution/admin-script-execution.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', '$scope', '$rootScope', '__env', '$timeout', '$http', - function JobExecutionController(kommonitorDataExchangeService, kommonitorDataGridHelperService, $scope, $rootScope, __env, $timeout, $http) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - - $scope.availableDefaultComputationJobDatasets; - $scope.availableCustomizedComputationJobDatasets; - $scope.defaultComputationJobHealth; - $scope.customizedComputationJobHealth; - $scope.selectAllEntriesInput = false; - - $scope.fetchDefaultIndicatorJobs = function(){ - return $http({ - url: __env.targetUrlToProcessingEngine + "script-engine/defaultIndicatorComputation", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.availableDefaultComputationJobDatasets = response.data; - - }); - }; - - $scope.fetchCustomizedIndicatorJobs = function(){ - return $http({ - url: __env.targetUrlToProcessingEngine + "script-engine/customizableIndicatorComputation", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.availableCustomizedComputationJobDatasets = response.data; - - }); - }; - - $scope.fetchDefaultIndicatorJobHealth = function(){ - return $http({ - url: __env.targetUrlToProcessingEngine + "script-engine/defaultIndicatorComputation/health", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.defaultComputationJobHealth = response.data; - - }); - }; - - $scope.fetchCustomizedIndicatorJobHealth = function(){ - return $http({ - url: __env.targetUrlToProcessingEngine + "script-engine/customizableIndicatorComputation/health", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.customizedComputationJobHealth = response.data; - - }); - }; - - $scope.$on("initialMetadataLoadingCompleted", function (event) { - - - $timeout(async function () { - - await $scope.fetchDefaultIndicatorJobHealth(); - await $scope.fetchCustomizedIndicatorJobHealth(); - - await $scope.fetchDefaultIndicatorJobs(); - await $scope.fetchCustomizedIndicatorJobs(); - - $scope.initializeOrRefreshOverviewTable(); - }, 250); - - }); - - $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { - - $scope.loadingData = false; - - }); - - $scope.initializeOrRefreshOverviewTable = function () { - $scope.loadingData = true; - - kommonitorDataGridHelperService.buildDataGrid_defaultJobs($scope.availableDefaultComputationJobDatasets); - kommonitorDataGridHelperService.buildDataGrid_customizedJobs($scope.availableCustomizedComputationJobDatasets); - - $scope.loadingData = false; - }; - - $scope.$on("refreshJobOverviewTable", function (event) { - $scope.loadingData = true; - $scope.refreshJobOverviewTable(); - }); - - $scope.refreshJobOverviewTable = async function () { - - // refetch all metadata from spatial units to update table - await $scope.fetchDefaultIndicatorJobs(); - await $scope.fetchCustomizedIndicatorJobs(); - await $scope.fetchCustomizedIndicatorJobHealth(); - await $scope.fetchDefaultIndicatorJobHealth(); - - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - - }; - - $scope.onClickDeleteDatasets = function () { - $scope.loadingData = true; - - let markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedDefaultJobsMetadata(); - - // submit selected spatial units to modal controller - $rootScope.$broadcast("onDeleteJobs", markedEntriesForDeletion); - - $scope.loadingData = false; - }; - - $scope.syntaxHighlightJSON = function(json){ - return kommonitorDataExchangeService.syntaxHighlightJSON(json); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptExecution/admin-script-execution.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', '$scope', '$rootScope', '__env', '$timeout', '$http', + function JobExecutionController(kommonitorDataExchangeService, kommonitorDataGridHelperService, $scope, $rootScope, __env, $timeout, $http) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.availableDefaultComputationJobDatasets; + $scope.availableCustomizedComputationJobDatasets; + $scope.defaultComputationJobHealth; + $scope.customizedComputationJobHealth; + $scope.selectAllEntriesInput = false; + $scope.fetchDefaultIndicatorJobs = function () { + return $http({ + url: __env.targetUrlToProcessingEngine + "script-engine/defaultIndicatorComputation", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.availableDefaultComputationJobDatasets = response.data; + }); + }; + $scope.fetchCustomizedIndicatorJobs = function () { + return $http({ + url: __env.targetUrlToProcessingEngine + "script-engine/customizableIndicatorComputation", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.availableCustomizedComputationJobDatasets = response.data; + }); + }; + $scope.fetchDefaultIndicatorJobHealth = function () { + return $http({ + url: __env.targetUrlToProcessingEngine + "script-engine/defaultIndicatorComputation/health", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.defaultComputationJobHealth = response.data; + }); + }; + $scope.fetchCustomizedIndicatorJobHealth = function () { + return $http({ + url: __env.targetUrlToProcessingEngine + "script-engine/customizableIndicatorComputation/health", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.customizedComputationJobHealth = response.data; + }); + }; + $scope.$on("initialMetadataLoadingCompleted", function (event) { + $timeout(async function () { + await $scope.fetchDefaultIndicatorJobHealth(); + await $scope.fetchCustomizedIndicatorJobHealth(); + await $scope.fetchDefaultIndicatorJobs(); + await $scope.fetchCustomizedIndicatorJobs(); + $scope.initializeOrRefreshOverviewTable(); + }, 250); + }); + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + $scope.loadingData = false; + }); + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + kommonitorDataGridHelperService.buildDataGrid_defaultJobs($scope.availableDefaultComputationJobDatasets); + kommonitorDataGridHelperService.buildDataGrid_customizedJobs($scope.availableCustomizedComputationJobDatasets); + $scope.loadingData = false; + }; + $scope.$on("refreshJobOverviewTable", function (event) { + $scope.loadingData = true; + $scope.refreshJobOverviewTable(); + }); + $scope.refreshJobOverviewTable = async function () { + // refetch all metadata from spatial units to update table + await $scope.fetchDefaultIndicatorJobs(); + await $scope.fetchCustomizedIndicatorJobs(); + await $scope.fetchCustomizedIndicatorJobHealth(); + await $scope.fetchDefaultIndicatorJobHealth(); + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + }; + $scope.onClickDeleteDatasets = function () { + $scope.loadingData = true; + let markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedDefaultJobsMetadata(); + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteJobs", markedEntriesForDeletion); + $scope.loadingData = false; + }; + $scope.syntaxHighlightJSON = function (json) { + return kommonitorDataExchangeService.syntaxHighlightJSON(json); + }; + } + ] }); +//# sourceMappingURL=admin-script-execution.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.js.map b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.js.map new file mode 100644 index 000000000..d997aed4b --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-script-execution.component.js","sourceRoot":"","sources":["admin-script-execution.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.ts b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.ts new file mode 100644 index 000000000..5941eb621 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.component.ts @@ -0,0 +1,137 @@ +angular.module('adminScriptExecution').component('adminScriptExecution', { + templateUrl: "components/kommonitorAdmin/adminScriptExecution/admin-script-execution.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', '$scope', '$rootScope', '__env', '$timeout', '$http', + function JobExecutionController(kommonitorDataExchangeService, kommonitorDataGridHelperService, $scope, $rootScope, __env, $timeout, $http) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + + $scope.availableDefaultComputationJobDatasets; + $scope.availableCustomizedComputationJobDatasets; + $scope.defaultComputationJobHealth; + $scope.customizedComputationJobHealth; + $scope.selectAllEntriesInput = false; + + $scope.fetchDefaultIndicatorJobs = function(){ + return $http({ + url: __env.targetUrlToProcessingEngine + "script-engine/defaultIndicatorComputation", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $scope.availableDefaultComputationJobDatasets = response.data; + + }); + }; + + $scope.fetchCustomizedIndicatorJobs = function(){ + return $http({ + url: __env.targetUrlToProcessingEngine + "script-engine/customizableIndicatorComputation", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $scope.availableCustomizedComputationJobDatasets = response.data; + + }); + }; + + $scope.fetchDefaultIndicatorJobHealth = function(){ + return $http({ + url: __env.targetUrlToProcessingEngine + "script-engine/defaultIndicatorComputation/health", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $scope.defaultComputationJobHealth = response.data; + + }); + }; + + $scope.fetchCustomizedIndicatorJobHealth = function(){ + return $http({ + url: __env.targetUrlToProcessingEngine + "script-engine/customizableIndicatorComputation/health", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $scope.customizedComputationJobHealth = response.data; + + }); + }; + + $scope.$on("initialMetadataLoadingCompleted", function (event) { + + + $timeout(async function () { + + await $scope.fetchDefaultIndicatorJobHealth(); + await $scope.fetchCustomizedIndicatorJobHealth(); + + await $scope.fetchDefaultIndicatorJobs(); + await $scope.fetchCustomizedIndicatorJobs(); + + $scope.initializeOrRefreshOverviewTable(); + }, 250); + + }); + + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + + $scope.loadingData = false; + + }); + + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + + kommonitorDataGridHelperService.buildDataGrid_defaultJobs($scope.availableDefaultComputationJobDatasets); + kommonitorDataGridHelperService.buildDataGrid_customizedJobs($scope.availableCustomizedComputationJobDatasets); + + $scope.loadingData = false; + }; + + $scope.$on("refreshJobOverviewTable", function (event) { + $scope.loadingData = true; + $scope.refreshJobOverviewTable(); + }); + + $scope.refreshJobOverviewTable = async function () { + + // refetch all metadata from spatial units to update table + await $scope.fetchDefaultIndicatorJobs(); + await $scope.fetchCustomizedIndicatorJobs(); + await $scope.fetchCustomizedIndicatorJobHealth(); + await $scope.fetchDefaultIndicatorJobHealth(); + + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + + }; + + $scope.onClickDeleteDatasets = function () { + $scope.loadingData = true; + + let markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedDefaultJobsMetadata(); + + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteJobs", markedEntriesForDeletion); + + $scope.loadingData = false; + }; + + $scope.syntaxHighlightJSON = function(json){ + return kommonitorDataExchangeService.syntaxHighlightJSON(json); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.js b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.js index eb8ea9a19..e04145a45 100644 --- a/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.js +++ b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminScriptExecution', ['kommonitorDataExchange', 'kommonitorDataGridHelper']); +//# sourceMappingURL=admin-script-execution.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.js.map b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.js.map new file mode 100644 index 000000000..5a110d3c1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-script-execution.module.js","sourceRoot":"","sources":["admin-script-execution.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,wBAAwB,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.ts b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.ts new file mode 100644 index 000000000..eb8ea9a19 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptExecution/admin-script-execution.module.ts @@ -0,0 +1 @@ +angular.module('adminScriptExecution', ['kommonitorDataExchange', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.js b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.js index 12b8759b4..ca00b7a40 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.js @@ -1,157 +1,114 @@ +"use strict"; angular.module('adminScriptManagement').component('adminScriptManagement', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/admin-script-management.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$rootScope', '__env', '$timeout', '$http', - function ScriptManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $rootScope, __env, $timeout, $http) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - - $scope.availableScriptDatasets; - $scope.selectAllEntriesInput = false; - - $scope.$on("initialMetadataLoadingCompleted", function (event) { - - - $timeout(function () { - - $scope.initializeOrRefreshOverviewTable(); - }, 250); - - }); - - $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { - - $scope.loadingData = false; - - }); - - $scope.initializeOrRefreshOverviewTable = function () { - $scope.loadingData = true; - $scope.availableScriptDatasets = JSON.parse(JSON.stringify(kommonitorDataExchangeService.availableProcessScripts)); - - kommonitorDataGridHelperService.buildDataGrid_scripts($scope.availableScriptDatasets); - - $scope.loadingData = false; - }; - - $scope.$on("refreshScriptOverviewTable", function (event, crudType, scriptId) { - $scope.loadingData = true; - $scope.refreshScriptOverviewTable(crudType, scriptId); - }); - - $scope.onChangeSelectAllEntries = function () { - if ($scope.selectAllEntriesInput) { - $scope.availableScriptDatasets.forEach(function (dataset) { - dataset.isSelected = true; - }); - } - else { - $scope.availableScriptDatasets.forEach(function (dataset) { - dataset.isSelected = false; - }); - } - }; - - $scope.onChangeSelectAllEntries = function () { - if ($scope.selectAllEntriesInput) { - $scope.availableScriptDatasets.forEach(function (dataset) { - dataset.isSelected = true; - }); - } - else { - $scope.availableScriptDatasets.forEach(function (dataset) { - dataset.isSelected = false; - }); - } - }; - - $scope.refreshScriptOverviewTable = function (crudType, targetScriptId) { - - if(! crudType || !targetScriptId){ - // refetch all metadata from spatial units to update table - kommonitorDataExchangeService.fetchIndicatorScriptsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { - - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - - }, function errorCallback(response) { - - $scope.loadingData = false; - }); - } - else if(crudType && targetScriptId){ - if(crudType == "add"){ - kommonitorCacheHelperService.fetchSingleIndicatorScriptMetadata(targetScriptId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - kommonitorDataExchangeService.addSingleProcessScriptMetadata(data); - - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - - }, function errorCallback(response) { - - $scope.loadingData = false; - }); - } - else if(crudType == "edit"){ - kommonitorCacheHelperService.fetchSingleIndicatorScriptMetadata(targetScriptId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - kommonitorDataExchangeService.replaceSingleProcessScriptMetadata(data); - - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - - }, function errorCallback(response) { - - $scope.loadingData = false; - }); - } - else if(crudType == "delete"){ - // targetScriptId might be array in this case - if(targetScriptId && typeof targetScriptId == "string"){ - kommonitorDataExchangeService.deleteSingleProcessScriptMetadata(targetScriptId); - - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - } - - else if (targetScriptId && Array.isArray(targetScriptId)){ - for (const id of targetScriptId) { - kommonitorDataExchangeService.deleteSingleProcessScriptMetadata(id); - } - $scope.initializeOrRefreshOverviewTable(); - - $scope.loadingData = false; - } - - } - } - - }; - - $scope.onClickDeleteDatasets = function () { - $scope.loadingData = true; - - var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedScriptsMetadata(); - - // submit selected spatial units to modal controller - $rootScope.$broadcast("onDeleteScripts", markedEntriesForDeletion); - - $scope.loadingData = false; - }; - - $scope.onClickEditScript = function (scriptDataset) { - // submit selected spatial unit to modal controller - $rootScope.$broadcast("onEditScriptMetadata", scriptDataset); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/admin-script-management.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$rootScope', '__env', '$timeout', '$http', + function ScriptManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $rootScope, __env, $timeout, $http) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.availableScriptDatasets; + $scope.selectAllEntriesInput = false; + $scope.$on("initialMetadataLoadingCompleted", function (event) { + $timeout(function () { + $scope.initializeOrRefreshOverviewTable(); + }, 250); + }); + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + $scope.loadingData = false; + }); + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + $scope.availableScriptDatasets = JSON.parse(JSON.stringify(kommonitorDataExchangeService.availableProcessScripts)); + kommonitorDataGridHelperService.buildDataGrid_scripts($scope.availableScriptDatasets); + $scope.loadingData = false; + }; + $scope.$on("refreshScriptOverviewTable", function (event, crudType, scriptId) { + $scope.loadingData = true; + $scope.refreshScriptOverviewTable(crudType, scriptId); + }); + $scope.onChangeSelectAllEntries = function () { + if ($scope.selectAllEntriesInput) { + $scope.availableScriptDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableScriptDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + $scope.onChangeSelectAllEntries = function () { + if ($scope.selectAllEntriesInput) { + $scope.availableScriptDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableScriptDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + $scope.refreshScriptOverviewTable = function (crudType, targetScriptId) { + if (!crudType || !targetScriptId) { + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchIndicatorScriptsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + }); + } + else if (crudType && targetScriptId) { + if (crudType == "add") { + kommonitorCacheHelperService.fetchSingleIndicatorScriptMetadata(targetScriptId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + kommonitorDataExchangeService.addSingleProcessScriptMetadata(data); + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + }); + } + else if (crudType == "edit") { + kommonitorCacheHelperService.fetchSingleIndicatorScriptMetadata(targetScriptId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + kommonitorDataExchangeService.replaceSingleProcessScriptMetadata(data); + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + }, function errorCallback(response) { + $scope.loadingData = false; + }); + } + else if (crudType == "delete") { + // targetScriptId might be array in this case + if (targetScriptId && typeof targetScriptId == "string") { + kommonitorDataExchangeService.deleteSingleProcessScriptMetadata(targetScriptId); + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + } + else if (targetScriptId && Array.isArray(targetScriptId)) { + for (const id of targetScriptId) { + kommonitorDataExchangeService.deleteSingleProcessScriptMetadata(id); + } + $scope.initializeOrRefreshOverviewTable(); + $scope.loadingData = false; + } + } + } + }; + $scope.onClickDeleteDatasets = function () { + $scope.loadingData = true; + var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedScriptsMetadata(); + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteScripts", markedEntriesForDeletion); + $scope.loadingData = false; + }; + $scope.onClickEditScript = function (scriptDataset) { + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditScriptMetadata", scriptDataset); + }; + } + ] }); +//# sourceMappingURL=admin-script-management.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.js.map new file mode 100644 index 000000000..3fa7567c9 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-script-management.component.js","sourceRoot":"","sources":["admin-script-management.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.ts new file mode 100644 index 000000000..12b8759b4 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.component.ts @@ -0,0 +1,157 @@ +angular.module('adminScriptManagement').component('adminScriptManagement', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/admin-script-management.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$rootScope', '__env', '$timeout', '$http', + function ScriptManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $rootScope, __env, $timeout, $http) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + + $scope.availableScriptDatasets; + $scope.selectAllEntriesInput = false; + + $scope.$on("initialMetadataLoadingCompleted", function (event) { + + + $timeout(function () { + + $scope.initializeOrRefreshOverviewTable(); + }, 250); + + }); + + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + + $scope.loadingData = false; + + }); + + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + $scope.availableScriptDatasets = JSON.parse(JSON.stringify(kommonitorDataExchangeService.availableProcessScripts)); + + kommonitorDataGridHelperService.buildDataGrid_scripts($scope.availableScriptDatasets); + + $scope.loadingData = false; + }; + + $scope.$on("refreshScriptOverviewTable", function (event, crudType, scriptId) { + $scope.loadingData = true; + $scope.refreshScriptOverviewTable(crudType, scriptId); + }); + + $scope.onChangeSelectAllEntries = function () { + if ($scope.selectAllEntriesInput) { + $scope.availableScriptDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableScriptDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + + $scope.onChangeSelectAllEntries = function () { + if ($scope.selectAllEntriesInput) { + $scope.availableScriptDatasets.forEach(function (dataset) { + dataset.isSelected = true; + }); + } + else { + $scope.availableScriptDatasets.forEach(function (dataset) { + dataset.isSelected = false; + }); + } + }; + + $scope.refreshScriptOverviewTable = function (crudType, targetScriptId) { + + if(! crudType || !targetScriptId){ + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchIndicatorScriptsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + + }, function errorCallback(response) { + + $scope.loadingData = false; + }); + } + else if(crudType && targetScriptId){ + if(crudType == "add"){ + kommonitorCacheHelperService.fetchSingleIndicatorScriptMetadata(targetScriptId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + kommonitorDataExchangeService.addSingleProcessScriptMetadata(data); + + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + + }, function errorCallback(response) { + + $scope.loadingData = false; + }); + } + else if(crudType == "edit"){ + kommonitorCacheHelperService.fetchSingleIndicatorScriptMetadata(targetScriptId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + kommonitorDataExchangeService.replaceSingleProcessScriptMetadata(data); + + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + + }, function errorCallback(response) { + + $scope.loadingData = false; + }); + } + else if(crudType == "delete"){ + // targetScriptId might be array in this case + if(targetScriptId && typeof targetScriptId == "string"){ + kommonitorDataExchangeService.deleteSingleProcessScriptMetadata(targetScriptId); + + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + } + + else if (targetScriptId && Array.isArray(targetScriptId)){ + for (const id of targetScriptId) { + kommonitorDataExchangeService.deleteSingleProcessScriptMetadata(id); + } + $scope.initializeOrRefreshOverviewTable(); + + $scope.loadingData = false; + } + + } + } + + }; + + $scope.onClickDeleteDatasets = function () { + $scope.loadingData = true; + + var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedScriptsMetadata(); + + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteScripts", markedEntriesForDeletion); + + $scope.loadingData = false; + }; + + $scope.onClickEditScript = function (scriptDataset) { + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditScriptMetadata", scriptDataset); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.js b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.js index 27d7b1638..38e648a9d 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminScriptManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=admin-script-management.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.js.map new file mode 100644 index 000000000..04bec87c9 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-script-management.module.js","sourceRoot":"","sources":["admin-script-management.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,wBAAwB,EAAE,uBAAuB,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.ts new file mode 100644 index 000000000..27d7b1638 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/admin-script-management.module.ts @@ -0,0 +1 @@ +angular.module('adminScriptManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.js index 0a123a8db..a908cd313 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.js @@ -1,166 +1,135 @@ +"use strict"; angular.module('scriptAddModal').component('scriptAddModal', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', - '__env', '$timeout','kommonitorMultiStepFormHelperService', - function ScriptAddModalAddModalController(kommonitorDataExchangeService, kommonitorScriptHelperService, - $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - /* POST BODY - { - "scriptCodeBase64": "scriptCodeBase64", - "requiredIndicatorIds": [ - "requiredIndicatorIds", - "requiredIndicatorIds" - ], - "variableProcessParameters": [ - { - "minParameterValueForNumericInputs": 6.027456183070403, - "maxParameterValueForNumericInputs": 0.8008281904610115, - "defaultValue": "defaultValue", - "dataType": "string", - "name": "name", - "description": "description" - }, - { - "minParameterValueForNumericInputs": 6.027456183070403, - "maxParameterValueForNumericInputs": 0.8008281904610115, - "defaultValue": "defaultValue", - "dataType": "string", - "name": "name", - "description": "description" - } - ], - "associatedIndicatorId": "associatedIndicatorId", - "name": "name", - "description": "description", - "requiredGeoresourceIds": [ - "requiredGeoresourceIds", - "requiredGeoresourceIds" - ] - } - */ - - $scope.datasetName = undefined; - $scope.description = undefined; - kommonitorScriptHelperService.targetIndicator = undefined; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.errorMessagePart_indicatorMetadata = undefined; - - $scope.loadingData = false; - - $scope.resetScriptAddForm = function () { - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.errorMessagePart_indicatorMetadata = undefined; - - $scope.datasetName = undefined; - $scope.description = undefined; - kommonitorScriptHelperService.targetIndicator = undefined; - - kommonitorScriptHelperService.reset(); - - setTimeout(() => { - $scope.$digest(); - }, 1000); - }; - - $scope.addScript = async function () { - - $timeout(function () { - $scope.loadingData = true; - }); - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.errorMessagePart_indicatorMetadata = undefined; - - - // TODO Create and perform POST Request with loading screen - - try { - var addScriptResponse = await kommonitorScriptHelperService.postNewScript($scope.datasetName, $scope.description, kommonitorScriptHelperService.targetIndicator); - - let scriptId = addScriptResponse.scriptId; - $rootScope.$broadcast("refreshScriptOverviewTable", "add", scriptId); - if(kommonitorScriptHelperService.scriptFormulaHTML_overwriteTargetIndicatorMethod){ - try { - await kommonitorScriptHelperService.replaceMethodMetadataForTargetIndicator(kommonitorScriptHelperService.targetIndicator); - kommonitorScriptHelperService.scriptFormulaHTML_successToastDisplay = kommonitorScriptHelperService.scriptFormulaHTML; - $("#indicatorMetadataEditSuccessAlert").show(); - } catch (error) { - if (error.data) { - $scope.errorMessagePart_indicatorMetadata = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.errorMessagePart_indicatorMetadata = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#indicatorMetadataEditErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.loadingData = false; - $scope.$digest(); - }, 1000); - } - - } - - // refresh all admin dashboard diagrams due to modified metadata - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - - $("#scriptAddSuccessAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.loadingData = false; - $scope.$digest(); - }, 1000); - } catch (error) { - if (error.data) { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else { - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#scriptAddErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.loadingData = false; - $scope.$digest(); - }, 1000); - } - - }; - - - - $scope.hideSuccessAlert = function () { - $("#scriptAddSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function () { - $("#scriptAddErrorAlert").hide(); - }; - - $scope.hideSuccessAlert_indicatorMetadata = function () { - $("#indicatorMetadataEditSuccessAlert").hide(); - }; - - $scope.hideErrorAlert_indicatorMetadata = function () { - $("#indicatorMetadataEditErrorAlert").hide(); - }; - - kommonitorMultiStepFormHelperService.registerClickHandler(); - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', + '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + function ScriptAddModalAddModalController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + /* POST BODY + { + "scriptCodeBase64": "scriptCodeBase64", + "requiredIndicatorIds": [ + "requiredIndicatorIds", + "requiredIndicatorIds" + ], + "variableProcessParameters": [ + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + }, + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + } + ], + "associatedIndicatorId": "associatedIndicatorId", + "name": "name", + "description": "description", + "requiredGeoresourceIds": [ + "requiredGeoresourceIds", + "requiredGeoresourceIds" + ] + } + */ + $scope.datasetName = undefined; + $scope.description = undefined; + kommonitorScriptHelperService.targetIndicator = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.errorMessagePart_indicatorMetadata = undefined; + $scope.loadingData = false; + $scope.resetScriptAddForm = function () { + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.errorMessagePart_indicatorMetadata = undefined; + $scope.datasetName = undefined; + $scope.description = undefined; + kommonitorScriptHelperService.targetIndicator = undefined; + kommonitorScriptHelperService.reset(); + setTimeout(() => { + $scope.$digest(); + }, 1000); + }; + $scope.addScript = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.errorMessagePart_indicatorMetadata = undefined; + // TODO Create and perform POST Request with loading screen + try { + var addScriptResponse = await kommonitorScriptHelperService.postNewScript($scope.datasetName, $scope.description, kommonitorScriptHelperService.targetIndicator); + let scriptId = addScriptResponse.scriptId; + $rootScope.$broadcast("refreshScriptOverviewTable", "add", scriptId); + if (kommonitorScriptHelperService.scriptFormulaHTML_overwriteTargetIndicatorMethod) { + try { + await kommonitorScriptHelperService.replaceMethodMetadataForTargetIndicator(kommonitorScriptHelperService.targetIndicator); + kommonitorScriptHelperService.scriptFormulaHTML_successToastDisplay = kommonitorScriptHelperService.scriptFormulaHTML; + $("#indicatorMetadataEditSuccessAlert").show(); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart_indicatorMetadata = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart_indicatorMetadata = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#indicatorMetadataEditErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.loadingData = false; + $scope.$digest(); + }, 1000); + } + } + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + $("#scriptAddSuccessAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.loadingData = false; + $scope.$digest(); + }, 1000); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#scriptAddErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.loadingData = false; + $scope.$digest(); + }, 1000); + } + }; + $scope.hideSuccessAlert = function () { + $("#scriptAddSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#scriptAddErrorAlert").hide(); + }; + $scope.hideSuccessAlert_indicatorMetadata = function () { + $("#indicatorMetadataEditSuccessAlert").hide(); + }; + $scope.hideErrorAlert_indicatorMetadata = function () { + $("#indicatorMetadataEditErrorAlert").hide(); + }; + kommonitorMultiStepFormHelperService.registerClickHandler(); + } + ] }); +//# sourceMappingURL=script-add-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.js.map new file mode 100644 index 000000000..2faed4523 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-add-modal.component.js","sourceRoot":"","sources":["script-add-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.ts new file mode 100644 index 000000000..0a123a8db --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.component.ts @@ -0,0 +1,166 @@ +angular.module('scriptAddModal').component('scriptAddModal', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', + '__env', '$timeout','kommonitorMultiStepFormHelperService', + function ScriptAddModalAddModalController(kommonitorDataExchangeService, kommonitorScriptHelperService, + $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + /* POST BODY + { + "scriptCodeBase64": "scriptCodeBase64", + "requiredIndicatorIds": [ + "requiredIndicatorIds", + "requiredIndicatorIds" + ], + "variableProcessParameters": [ + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + }, + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + } + ], + "associatedIndicatorId": "associatedIndicatorId", + "name": "name", + "description": "description", + "requiredGeoresourceIds": [ + "requiredGeoresourceIds", + "requiredGeoresourceIds" + ] + } + */ + + $scope.datasetName = undefined; + $scope.description = undefined; + kommonitorScriptHelperService.targetIndicator = undefined; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.errorMessagePart_indicatorMetadata = undefined; + + $scope.loadingData = false; + + $scope.resetScriptAddForm = function () { + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.errorMessagePart_indicatorMetadata = undefined; + + $scope.datasetName = undefined; + $scope.description = undefined; + kommonitorScriptHelperService.targetIndicator = undefined; + + kommonitorScriptHelperService.reset(); + + setTimeout(() => { + $scope.$digest(); + }, 1000); + }; + + $scope.addScript = async function () { + + $timeout(function () { + $scope.loadingData = true; + }); + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.errorMessagePart_indicatorMetadata = undefined; + + + // TODO Create and perform POST Request with loading screen + + try { + var addScriptResponse = await kommonitorScriptHelperService.postNewScript($scope.datasetName, $scope.description, kommonitorScriptHelperService.targetIndicator); + + let scriptId = addScriptResponse.scriptId; + $rootScope.$broadcast("refreshScriptOverviewTable", "add", scriptId); + if(kommonitorScriptHelperService.scriptFormulaHTML_overwriteTargetIndicatorMethod){ + try { + await kommonitorScriptHelperService.replaceMethodMetadataForTargetIndicator(kommonitorScriptHelperService.targetIndicator); + kommonitorScriptHelperService.scriptFormulaHTML_successToastDisplay = kommonitorScriptHelperService.scriptFormulaHTML; + $("#indicatorMetadataEditSuccessAlert").show(); + } catch (error) { + if (error.data) { + $scope.errorMessagePart_indicatorMetadata = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart_indicatorMetadata = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#indicatorMetadataEditErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.loadingData = false; + $scope.$digest(); + }, 1000); + } + + } + + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + + $("#scriptAddSuccessAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.loadingData = false; + $scope.$digest(); + }, 1000); + } catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#scriptAddErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.loadingData = false; + $scope.$digest(); + }, 1000); + } + + }; + + + + $scope.hideSuccessAlert = function () { + $("#scriptAddSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function () { + $("#scriptAddErrorAlert").hide(); + }; + + $scope.hideSuccessAlert_indicatorMetadata = function () { + $("#indicatorMetadataEditSuccessAlert").hide(); + }; + + $scope.hideErrorAlert_indicatorMetadata = function () { + $("#indicatorMetadataEditErrorAlert").hide(); + }; + + kommonitorMultiStepFormHelperService.registerClickHandler(); + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.js index 56c0d7dc8..bbd8c97f1 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.js @@ -1,7 +1,9 @@ -angular.module('scriptAddModal', ['kommonitorDataExchange', 'kommonitorScriptHelper', +"use strict"; +angular.module('scriptAddModal', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'scriptGeneric', 'scriptSum', 'scriptSubtract', 'scriptPercentage', 'scriptShare', 'scriptDivision', 'scriptMultiplication', 'scriptPointsInPolygon', "scriptHeadlineIndicator", "scriptPromille", "scriptChangeAbsolute", "scriptChangeRelative", "scriptChangeAbsoluteRefDate", "scriptChangeRelativeRefDate", - "scriptTrend", "scriptContinuity", "scriptGeoresourceStatistics", "scriptGeoresourceSubsetShare", + "scriptTrend", "scriptContinuity", "scriptGeoresourceStatistics", "scriptGeoresourceSubsetShare", "scriptLineSegmentInPolygon", 'kommonitorMultiStepFormHelper' ]); +//# sourceMappingURL=script-add-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.js.map new file mode 100644 index 000000000..d4173590a --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-add-modal.module.js","sourceRoot":"","sources":["script-add-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB;IAChF,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB;IACnG,sBAAsB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,gBAAgB;IAC5F,sBAAsB,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,6BAA6B;IAC5G,aAAa,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,8BAA8B;IAChG,4BAA4B,EAAE,+BAA+B;CAChE,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.ts new file mode 100644 index 000000000..56c0d7dc8 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/script-add-modal.module.ts @@ -0,0 +1,7 @@ +angular.module('scriptAddModal', ['kommonitorDataExchange', 'kommonitorScriptHelper', + 'scriptGeneric', 'scriptSum', 'scriptSubtract', 'scriptPercentage', 'scriptShare', 'scriptDivision', + 'scriptMultiplication', 'scriptPointsInPolygon', "scriptHeadlineIndicator", "scriptPromille", + "scriptChangeAbsolute", "scriptChangeRelative", "scriptChangeAbsoluteRefDate", "scriptChangeRelativeRefDate", + "scriptTrend", "scriptContinuity", "scriptGeoresourceStatistics", "scriptGeoresourceSubsetShare", + "scriptLineSegmentInPolygon", 'kommonitorMultiStepFormHelper' +]); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.js index fc62ff4dd..e5e04df26 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.js @@ -1,149 +1,116 @@ +"use strict"; angular.module('scriptChangeAbsolute').component('scriptChangeAbsolute', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptChangeAbsoluteController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js"; - - $scope.tmpIndicatorSelection = undefined; - - $scope.compIndicatorSelection = undefined; - $scope.compIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicator = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; - $scope.parameterDefaultValue_computationIndicator = undefined; - $scope.parameterNumericMinValue_computationIndicator = 0; - $scope.parameterNumericMaxValue_computationIndicator = 1; - - $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; - - $scope.numberOfTemporalItems = 1; - - $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; - $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; - $scope.parameterDefaultValue_temporalOption = "YEARS"; - $scope.parameterNumericMinValue_temporalOption = 0; - $scope.parameterNumericMaxValue_temporalOption = 1; - - $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; - $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '1'."; - $scope.parameterDefaultValue_numTemporalItems = 1; - $scope.parameterNumericMinValue_numTemporalItems = 1; - $scope.parameterNumericMaxValue_numTemporalItems = 100000; - $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeComputationIndicator = function(compIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.compIndicatorSelection_old){ - kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); - } - kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); - - $scope.compIndicatorSelection_old = compIndicatorSelection; - - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.onChangeNumTemporalItems = function(){ - $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangeTemporalOption = function(){ - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - - $scope.parameterDefaultValue_computationIndicator = undefined; - - if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ - $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; - } - - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - if (! $scope.compIndicatorSelection){ - return; - } - - var formulaHTML = "Berechnung gemäß Formel
$ A_{N} - A_{M} $"; - var legendItemsHTML = "Legende zur Formel"; - - legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; - legendItemsHTML+="
$N$: Ziel-Zeitpunkt"; - legendItemsHTML+="
$M$: Ziel-Zeitpunkt minus " + $scope.numberOfTemporalItems + " " + $scope.temporalOption.displayName ; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptChangeAbsoluteController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; + $scope.numberOfTemporalItems = 1; + $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; + $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; + $scope.parameterDefaultValue_temporalOption = "YEARS"; + $scope.parameterNumericMinValue_temporalOption = 0; + $scope.parameterNumericMaxValue_temporalOption = 1; + $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '1'."; + $scope.parameterDefaultValue_numTemporalItems = 1; + $scope.parameterNumericMinValue_numTemporalItems = 1; + $scope.parameterNumericMaxValue_numTemporalItems = 100000; + $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeComputationIndicator = function (compIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.compIndicatorSelection_old) { + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + $scope.compIndicatorSelection_old = compIndicatorSelection; + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeNumTemporalItems = function () { + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeTemporalOption = function () { + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue_computationIndicator = undefined; + if ($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId) { + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + if (!$scope.compIndicatorSelection) { + return; + } + var formulaHTML = "Berechnung gemäß Formel
$ A_{N} - A_{M} $"; + var legendItemsHTML = "Legende zur Formel"; + legendItemsHTML += "
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML += "
$N$: Ziel-Zeitpunkt"; + legendItemsHTML += "
$M$: Ziel-Zeitpunkt minus " + $scope.numberOfTemporalItems + " " + $scope.temporalOption.displayName; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + } + ] }); +//# sourceMappingURL=script-change-absolute.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.js.map new file mode 100644 index 000000000..90f85e7c1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-change-absolute.component.js","sourceRoot":"","sources":["script-change-absolute.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.ts new file mode 100644 index 000000000..fc62ff4dd --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.component.ts @@ -0,0 +1,149 @@ +angular.module('scriptChangeAbsolute').component('scriptChangeAbsolute', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptChangeAbsoluteController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js"; + + $scope.tmpIndicatorSelection = undefined; + + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + + $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; + + $scope.numberOfTemporalItems = 1; + + $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; + $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; + $scope.parameterDefaultValue_temporalOption = "YEARS"; + $scope.parameterNumericMinValue_temporalOption = 0; + $scope.parameterNumericMaxValue_temporalOption = 1; + + $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '1'."; + $scope.parameterDefaultValue_numTemporalItems = 1; + $scope.parameterNumericMinValue_numTemporalItems = 1; + $scope.parameterNumericMaxValue_numTemporalItems = 100000; + $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeComputationIndicator = function(compIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.compIndicatorSelection_old){ + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + + $scope.compIndicatorSelection_old = compIndicatorSelection; + + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.onChangeNumTemporalItems = function(){ + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangeTemporalOption = function(){ + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + + $scope.parameterDefaultValue_computationIndicator = undefined; + + if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + if (! $scope.compIndicatorSelection){ + return; + } + + var formulaHTML = "Berechnung gemäß Formel
$ A_{N} - A_{M} $"; + var legendItemsHTML = "Legende zur Formel"; + + legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML+="
$N$: Ziel-Zeitpunkt"; + legendItemsHTML+="
$M$: Ziel-Zeitpunkt minus " + $scope.numberOfTemporalItems + " " + $scope.temporalOption.displayName ; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.js index 3faaf5ece..c563ae409 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptChangeAbsolute', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-change-absolute.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.js.map new file mode 100644 index 000000000..7794ca3b4 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-change-absolute.module.js","sourceRoot":"","sources":["script-change-absolute.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.ts new file mode 100644 index 000000000..3faaf5ece --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsolute/script-change-absolute.module.ts @@ -0,0 +1 @@ +angular.module('scriptChangeAbsolute', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.js index d5bbccb6c..8ea016307 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.js @@ -1,139 +1,108 @@ +"use strict"; angular.module('scriptChangeAbsoluteRefDate').component('scriptChangeAbsoluteRefDate', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptChangeAbsoluteRefDateController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_absChange_refDate.js"; - - $scope.tmpIndicatorSelection = undefined; - - $scope.compIndicatorSelection = undefined; - $scope.compIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicator = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; - $scope.parameterDefaultValue_computationIndicator = undefined; - $scope.parameterNumericMinValue_computationIndicator = 0; - $scope.parameterNumericMaxValue_computationIndicator = 1; - - $scope.referenceDate = ""; - - $scope.parameterName_referenceDate = "REFERENCE_DATE"; - $scope.parameterDescription_referenceDate = "konkretes Referenzdatum im Format 'YYYY-MM-DD'"; - $scope.parameterDefaultValue_referenceDate = ""; - $scope.parameterNumericMinValue_referenceDate = 0; - $scope.parameterNumericMaxValue_referenceDate = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeComputationIndicator = function(compIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.compIndicatorSelection_old){ - kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); - } - kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); - - $scope.compIndicatorSelection_old = compIndicatorSelection; - - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.onChangeNumTemporalItems = function(){ - $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangeReferenceDate = function(){ - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - - $scope.parameterDefaultValue_computationIndicator = undefined; - - if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ - $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; - } - - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceDate, $scope.parameterDescription_referenceDate, $scope.parameterDataType, $scope.referenceDate, $scope.parameterNumericMinValue_referenceDate, $scope.parameterNumericMaxValue_referenceDate); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - if (! $scope.compIndicatorSelection){ - return; - } - - var formulaHTML = "Berechnung gemäß Formel
$ A_{N} - A_{M} $"; - var legendItemsHTML = "Legende zur Formel"; - - legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; - legendItemsHTML+="
$N$: Ziel-Zeitpunkt"; - legendItemsHTML+="
$M$: fester Referenz-Zeitpunkt '" + $scope.referenceDate + "'"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptChangeAbsoluteRefDateController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_absChange_refDate.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + $scope.referenceDate = ""; + $scope.parameterName_referenceDate = "REFERENCE_DATE"; + $scope.parameterDescription_referenceDate = "konkretes Referenzdatum im Format 'YYYY-MM-DD'"; + $scope.parameterDefaultValue_referenceDate = ""; + $scope.parameterNumericMinValue_referenceDate = 0; + $scope.parameterNumericMaxValue_referenceDate = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeComputationIndicator = function (compIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.compIndicatorSelection_old) { + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + $scope.compIndicatorSelection_old = compIndicatorSelection; + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeNumTemporalItems = function () { + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeReferenceDate = function () { + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue_computationIndicator = undefined; + if ($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId) { + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceDate, $scope.parameterDescription_referenceDate, $scope.parameterDataType, $scope.referenceDate, $scope.parameterNumericMinValue_referenceDate, $scope.parameterNumericMaxValue_referenceDate); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + if (!$scope.compIndicatorSelection) { + return; + } + var formulaHTML = "Berechnung gemäß Formel
$ A_{N} - A_{M} $"; + var legendItemsHTML = "Legende zur Formel"; + legendItemsHTML += "
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML += "
$N$: Ziel-Zeitpunkt"; + legendItemsHTML += "
$M$: fester Referenz-Zeitpunkt '" + $scope.referenceDate + "'"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + } + ] }); +//# sourceMappingURL=script-change-absolute-ref-date.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.js.map new file mode 100644 index 000000000..77bbf9c56 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-change-absolute-ref-date.component.js","sourceRoot":"","sources":["script-change-absolute-ref-date.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.ts new file mode 100644 index 000000000..d5bbccb6c --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.component.ts @@ -0,0 +1,139 @@ +angular.module('scriptChangeAbsoluteRefDate').component('scriptChangeAbsoluteRefDate', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptChangeAbsoluteRefDateController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_absChange_refDate.js"; + + $scope.tmpIndicatorSelection = undefined; + + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + + $scope.referenceDate = ""; + + $scope.parameterName_referenceDate = "REFERENCE_DATE"; + $scope.parameterDescription_referenceDate = "konkretes Referenzdatum im Format 'YYYY-MM-DD'"; + $scope.parameterDefaultValue_referenceDate = ""; + $scope.parameterNumericMinValue_referenceDate = 0; + $scope.parameterNumericMaxValue_referenceDate = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeComputationIndicator = function(compIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.compIndicatorSelection_old){ + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + + $scope.compIndicatorSelection_old = compIndicatorSelection; + + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.onChangeNumTemporalItems = function(){ + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangeReferenceDate = function(){ + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + + $scope.parameterDefaultValue_computationIndicator = undefined; + + if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceDate, $scope.parameterDescription_referenceDate, $scope.parameterDataType, $scope.referenceDate, $scope.parameterNumericMinValue_referenceDate, $scope.parameterNumericMaxValue_referenceDate); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + if (! $scope.compIndicatorSelection){ + return; + } + + var formulaHTML = "Berechnung gemäß Formel
$ A_{N} - A_{M} $"; + var legendItemsHTML = "Legende zur Formel"; + + legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML+="
$N$: Ziel-Zeitpunkt"; + legendItemsHTML+="
$M$: fester Referenz-Zeitpunkt '" + $scope.referenceDate + "'"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.js index c4ada4bea..4596ce666 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptChangeAbsoluteRefDate', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-change-absolute-ref-date.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.js.map new file mode 100644 index 000000000..1a7154f93 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-change-absolute-ref-date.module.js","sourceRoot":"","sources":["script-change-absolute-ref-date.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,6BAA6B,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.ts new file mode 100644 index 000000000..c4ada4bea --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeAbsoluteRefDate/script-change-absolute-ref-date.module.ts @@ -0,0 +1 @@ +angular.module('scriptChangeAbsoluteRefDate', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.js index 2edbdc67e..333875695 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.js @@ -1,149 +1,116 @@ +"use strict"; angular.module('scriptChangeRelative').component('scriptChangeRelative', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptChangeRelativeController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js"; - - $scope.tmpIndicatorSelection = undefined; - - $scope.compIndicatorSelection = undefined; - $scope.compIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicator = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; - $scope.parameterDefaultValue_computationIndicator = undefined; - $scope.parameterNumericMinValue_computationIndicator = 0; - $scope.parameterNumericMaxValue_computationIndicator = 1; - - $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; - - $scope.numberOfTemporalItems = 1; - - $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; - $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; - $scope.parameterDefaultValue_temporalOption = "YEARS"; - $scope.parameterNumericMinValue_temporalOption = 0; - $scope.parameterNumericMaxValue_temporalOption = 1; - - $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; - $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '1'."; - $scope.parameterDefaultValue_numTemporalItems = 1; - $scope.parameterNumericMinValue_numTemporalItems = 1; - $scope.parameterNumericMaxValue_numTemporalItems = 100000; - $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeComputationIndicator = function(compIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.compIndicatorSelection_old){ - kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); - } - kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); - - $scope.compIndicatorSelection_old = compIndicatorSelection; - - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.onChangeNumTemporalItems = function(){ - $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangeTemporalOption = function(){ - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - - $scope.parameterDefaultValue_computationIndicator = undefined; - - if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ - $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; - } - - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - if (! $scope.compIndicatorSelection){ - return; - } - - var formulaHTML = "Berechnung gemäß Formel
$$ 100 \\times \\frac{A_{N} - A_{M}}{A_{M}} $$"; - var legendItemsHTML = "Legende zur Formel"; - - legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; - legendItemsHTML+="
$N$: Ziel-Zeitpunkt"; - legendItemsHTML+="
$M$: Ziel-Zeitpunkt minus " + $scope.numberOfTemporalItems + " " + $scope.temporalOption.displayName ; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptChangeRelativeController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; + $scope.numberOfTemporalItems = 1; + $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; + $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; + $scope.parameterDefaultValue_temporalOption = "YEARS"; + $scope.parameterNumericMinValue_temporalOption = 0; + $scope.parameterNumericMaxValue_temporalOption = 1; + $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '1'."; + $scope.parameterDefaultValue_numTemporalItems = 1; + $scope.parameterNumericMinValue_numTemporalItems = 1; + $scope.parameterNumericMaxValue_numTemporalItems = 100000; + $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeComputationIndicator = function (compIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.compIndicatorSelection_old) { + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + $scope.compIndicatorSelection_old = compIndicatorSelection; + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeNumTemporalItems = function () { + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeTemporalOption = function () { + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue_computationIndicator = undefined; + if ($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId) { + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + if (!$scope.compIndicatorSelection) { + return; + } + var formulaHTML = "Berechnung gemäß Formel
$$ 100 \\times \\frac{A_{N} - A_{M}}{A_{M}} $$"; + var legendItemsHTML = "Legende zur Formel"; + legendItemsHTML += "
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML += "
$N$: Ziel-Zeitpunkt"; + legendItemsHTML += "
$M$: Ziel-Zeitpunkt minus " + $scope.numberOfTemporalItems + " " + $scope.temporalOption.displayName; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + } + ] }); +//# sourceMappingURL=script-change-relative.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.js.map new file mode 100644 index 000000000..c83d3998f --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-change-relative.component.js","sourceRoot":"","sources":["script-change-relative.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.ts new file mode 100644 index 000000000..2edbdc67e --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.component.ts @@ -0,0 +1,149 @@ +angular.module('scriptChangeRelative').component('scriptChangeRelative', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptChangeRelativeController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js"; + + $scope.tmpIndicatorSelection = undefined; + + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + + $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; + + $scope.numberOfTemporalItems = 1; + + $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; + $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; + $scope.parameterDefaultValue_temporalOption = "YEARS"; + $scope.parameterNumericMinValue_temporalOption = 0; + $scope.parameterNumericMaxValue_temporalOption = 1; + + $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '1'."; + $scope.parameterDefaultValue_numTemporalItems = 1; + $scope.parameterNumericMinValue_numTemporalItems = 1; + $scope.parameterNumericMaxValue_numTemporalItems = 100000; + $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeComputationIndicator = function(compIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.compIndicatorSelection_old){ + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + + $scope.compIndicatorSelection_old = compIndicatorSelection; + + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.onChangeNumTemporalItems = function(){ + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangeTemporalOption = function(){ + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + + $scope.parameterDefaultValue_computationIndicator = undefined; + + if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + if (! $scope.compIndicatorSelection){ + return; + } + + var formulaHTML = "Berechnung gemäß Formel
$$ 100 \\times \\frac{A_{N} - A_{M}}{A_{M}} $$"; + var legendItemsHTML = "Legende zur Formel"; + + legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML+="
$N$: Ziel-Zeitpunkt"; + legendItemsHTML+="
$M$: Ziel-Zeitpunkt minus " + $scope.numberOfTemporalItems + " " + $scope.temporalOption.displayName ; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.js index 2c346192e..d1e194742 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptChangeRelative', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-change-relative.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.js.map new file mode 100644 index 000000000..16f6bb39c --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-change-relative.module.js","sourceRoot":"","sources":["script-change-relative.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.ts new file mode 100644 index 000000000..2c346192e --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelative/script-change-relative.module.ts @@ -0,0 +1 @@ +angular.module('scriptChangeRelative', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.js index c51b1b72e..bd7a2d8d1 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.js @@ -1,139 +1,108 @@ +"use strict"; angular.module('scriptChangeRelativeRefDate').component('scriptChangeRelativeRefDate', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptChangeRelativeRefDateController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_relChange_refDate.js"; - - $scope.tmpIndicatorSelection = undefined; - - $scope.compIndicatorSelection = undefined; - $scope.compIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicator = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; - $scope.parameterDefaultValue_computationIndicator = undefined; - $scope.parameterNumericMinValue_computationIndicator = 0; - $scope.parameterNumericMaxValue_computationIndicator = 1; - - $scope.referenceDate = ""; - - $scope.parameterName_referenceDate = "REFERENCE_DATE"; - $scope.parameterDescription_referenceDate = "konkretes Referenzdatum im Format 'YYYY-MM-DD'"; - $scope.parameterDefaultValue_referenceDate = ""; - $scope.parameterNumericMinValue_referenceDate = 0; - $scope.parameterNumericMaxValue_referenceDate = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeComputationIndicator = function(compIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.compIndicatorSelection_old){ - kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); - } - kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); - - $scope.compIndicatorSelection_old = compIndicatorSelection; - - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.onChangeNumTemporalItems = function(){ - $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangeReferenceDate = function(){ - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - - $scope.parameterDefaultValue_computationIndicator = undefined; - - if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ - $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; - } - - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceDate, $scope.parameterDescription_referenceDate, $scope.parameterDataType, $scope.referenceDate, $scope.parameterNumericMinValue_referenceDate, $scope.parameterNumericMaxValue_referenceDate); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - if (! $scope.compIndicatorSelection){ - return; - } - - var formulaHTML = "Berechnung gemäß Formel
$$ 100 \\times \\frac{A_{N} - A_{M}}{A_{M}} $$"; - var legendItemsHTML = "Legende zur Formel"; - - legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; - legendItemsHTML+="
$N$: Ziel-Zeitpunkt"; - legendItemsHTML+="
$M$: fester Referenz-Zeitpunkt '" + $scope.referenceDate + "'"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptChangeRelativeRefDateController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_relChange_refDate.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + $scope.referenceDate = ""; + $scope.parameterName_referenceDate = "REFERENCE_DATE"; + $scope.parameterDescription_referenceDate = "konkretes Referenzdatum im Format 'YYYY-MM-DD'"; + $scope.parameterDefaultValue_referenceDate = ""; + $scope.parameterNumericMinValue_referenceDate = 0; + $scope.parameterNumericMaxValue_referenceDate = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeComputationIndicator = function (compIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.compIndicatorSelection_old) { + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + $scope.compIndicatorSelection_old = compIndicatorSelection; + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeNumTemporalItems = function () { + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeReferenceDate = function () { + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue_computationIndicator = undefined; + if ($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId) { + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceDate, $scope.parameterDescription_referenceDate, $scope.parameterDataType, $scope.referenceDate, $scope.parameterNumericMinValue_referenceDate, $scope.parameterNumericMaxValue_referenceDate); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + if (!$scope.compIndicatorSelection) { + return; + } + var formulaHTML = "Berechnung gemäß Formel
$$ 100 \\times \\frac{A_{N} - A_{M}}{A_{M}} $$"; + var legendItemsHTML = "Legende zur Formel"; + legendItemsHTML += "
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML += "
$N$: Ziel-Zeitpunkt"; + legendItemsHTML += "
$M$: fester Referenz-Zeitpunkt '" + $scope.referenceDate + "'"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + } + ] }); +//# sourceMappingURL=script-change-relative-ref-date.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.js.map new file mode 100644 index 000000000..18414bded --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-change-relative-ref-date.component.js","sourceRoot":"","sources":["script-change-relative-ref-date.component.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,SAAS,CAAC,6BAA6B,EAAE;IACtF,WAAW,EAAE,sJAAsJ;IACnK,UAAU,EAAE,CAAC,+BAA+B,EAAE,+BAA+B,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU;QAClI,SAAS,qCAAqC,CAAC,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ;YAEtJ,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;YAC3E,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;YAE3E,sCAAsC;YACtC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YAEtB,MAAM,CAAC,oBAAoB,GAAG,iEAAiE,CAAC;YAEhG,MAAM,CAAC,qBAAqB,GAAG,SAAS,CAAC;YAEzC,MAAM,CAAC,sBAAsB,GAAG,SAAS,CAAC;YAC1C,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC;YAE9C,MAAM,CAAC,kCAAkC,GAAG,gBAAgB,CAAC;YAC7D,MAAM,CAAC,yCAAyC,GAAG,qCAAqC,CAAC;YACzF,MAAM,CAAC,0CAA0C,GAAG,SAAS,CAAC;YAC9D,MAAM,CAAC,6CAA6C,GAAG,CAAC,CAAC;YACzD,MAAM,CAAC,6CAA6C,GAAG,CAAC,CAAC;YAEzD,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC;YAE1B,MAAM,CAAC,2BAA2B,GAAG,gBAAgB,CAAC;YACtD,MAAM,CAAC,kCAAkC,GAAG,gDAAgD,CAAC;YAC7F,MAAM,CAAC,mCAAmC,GAAG,EAAE,CAAC;YAChD,MAAM,CAAC,sCAAsC,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,sCAAsC,GAAG,CAAC,CAAC;YAElD;;;;;;;;;;;;;;;;;;;cAmBE;YACF,MAAM,CAAC,iBAAiB,GAAG,6BAA6B,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;YAErF,MAAM,CAAC,oCAAoC,GAAG,SAAS,CAAC;YACxD,MAAM,CAAC,sBAAsB,GAAG,oBAAoB,CAAC;YAErD,MAAM,CAAC,iBAAiB,GAAG,SAAS,CAAC;YAErC;;cAEE;YACF,MAAM,CAAC,IAAI,GAAG;gBACb,6BAA6B,CAAC,KAAK,EAAE,CAAC;gBAEtC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC9B,CAAC,CAAC;YAEF,MAAM,CAAC,mBAAmB,GAAG;gBAC5B,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAC,cAAc,EAAE,MAAM,EAAC,CAAC,CAAC,IAAI,CAAC,UAAU,QAAQ;oBACvF,MAAM,CAAC,oCAAoC,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAC3D,6BAA6B,CAAC,yBAAyB,GAAG,QAAQ,CAAC,IAAI,CAAC;oBACxE,MAAM,CAAC,oCAAoC,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAE5D,6BAA6B,CAAC,yBAAyB,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;gBACvF,CAAC,CAAC,CAAC;YACN,CAAC,CAAC;YAEF,MAAM,CAAC,IAAI,EAAE,CAAC;YAEd,MAAM,CAAC,4BAA4B,GAAG,UAAS,sBAAsB;gBACpE,uEAAuE;gBACvE,IAAG,MAAM,CAAC,0BAA0B,EAAC;oBACpC,6BAA6B,CAAC,mBAAmB,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;iBACrF;gBACD,6BAA6B,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;gBAEvE,MAAM,CAAC,0BAA0B,GAAG,sBAAsB,CAAC;gBAE3D,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,MAAM,CAAC,gCAAgC,EAAE,CAAC;YAE3C,CAAC,CAAC;YAEF,MAAM,CAAC,wBAAwB,GAAG;gBACjC,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBACxE,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,MAAM,CAAC,gCAAgC,EAAE,CAAC;YAC3C,CAAC,CAAC;YAEF,MAAM,CAAC,qBAAqB,GAAG;gBAC9B,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,MAAM,CAAC,gCAAgC,EAAE,CAAC;YAC3C,CAAC,CAAC;YAEF,MAAM,CAAC,oBAAoB,GAAG;gBAC7B,6BAA6B,CAAC,4BAA4B,GAAG,EAAE,CAAC;gBAEhE,MAAM,CAAC,0CAA0C,GAAG,SAAS,CAAC;gBAE9D,IAAG,MAAM,CAAC,sBAAsB,IAAI,MAAM,CAAC,sBAAsB,CAAC,WAAW,EAAC;oBAC7E,MAAM,CAAC,0CAA0C,GAAG,MAAM,CAAC,sBAAsB,CAAC,WAAW,CAAC;iBAC9F;gBAED,6BAA6B,CAAC,kBAAkB,CAAC,MAAM,CAAC,kCAAkC,EAAE,MAAM,CAAC,yCAAyC,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,0CAA0C,EAAE,MAAM,CAAC,6CAA6C,EAAE,MAAM,CAAC,6CAA6C,CAAC,CAAC;gBACvU,6BAA6B,CAAC,kBAAkB,CAAC,MAAM,CAAC,2BAA2B,EAAE,MAAM,CAAC,kCAAkC,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC,sCAAsC,CAAC,CAAC;YAC/Q,CAAC,CAAC;YAEF,MAAM,CAAC,gCAAgC,GAAG;gBACzC,6BAA6B,CAAC,iBAAiB,GAAG,EAAE,CAAC;gBAErD,IAAI,CAAE,MAAM,CAAC,sBAAsB,EAAC;oBACnC,OAAO;iBACP;gBAEA,IAAI,WAAW,GAAG,2FAA2F,CAAC;gBAC9G,IAAI,eAAe,GAAG,2BAA2B,CAAC;gBAElD,eAAe,IAAE,aAAa,GAAG,MAAM,CAAC,sBAAsB,CAAC,aAAa,GAAG,IAAI,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,GAAI,GAAG,CAAC;gBAChI,eAAe,IAAE,2BAA2B,CAAC;gBAC7C,eAAe,IAAE,wCAAwC,GAAG,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC;gBAEvF,6BAA6B,CAAC,iBAAiB,GAAG,WAAW,GAAG,YAAY,GAAG,eAAe,CAAC;YAEjG,CAAC,CAAC;QAEH,CAAC;KACD;CACD,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.ts new file mode 100644 index 000000000..c51b1b72e --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.component.ts @@ -0,0 +1,139 @@ +angular.module('scriptChangeRelativeRefDate').component('scriptChangeRelativeRefDate', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptChangeRelativeRefDateController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_relChange_refDate.js"; + + $scope.tmpIndicatorSelection = undefined; + + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + + $scope.referenceDate = ""; + + $scope.parameterName_referenceDate = "REFERENCE_DATE"; + $scope.parameterDescription_referenceDate = "konkretes Referenzdatum im Format 'YYYY-MM-DD'"; + $scope.parameterDefaultValue_referenceDate = ""; + $scope.parameterNumericMinValue_referenceDate = 0; + $scope.parameterNumericMaxValue_referenceDate = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeComputationIndicator = function(compIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.compIndicatorSelection_old){ + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + + $scope.compIndicatorSelection_old = compIndicatorSelection; + + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.onChangeNumTemporalItems = function(){ + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangeReferenceDate = function(){ + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + + $scope.parameterDefaultValue_computationIndicator = undefined; + + if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceDate, $scope.parameterDescription_referenceDate, $scope.parameterDataType, $scope.referenceDate, $scope.parameterNumericMinValue_referenceDate, $scope.parameterNumericMaxValue_referenceDate); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + if (! $scope.compIndicatorSelection){ + return; + } + + var formulaHTML = "Berechnung gemäß Formel
$$ 100 \\times \\frac{A_{N} - A_{M}}{A_{M}} $$"; + var legendItemsHTML = "Legende zur Formel"; + + legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML+="
$N$: Ziel-Zeitpunkt"; + legendItemsHTML+="
$M$: fester Referenz-Zeitpunkt '" + $scope.referenceDate + "'"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.js index b7d28c43d..c1fc4756b 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptChangeRelativeRefDate', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-change-relative-ref-date.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.js.map new file mode 100644 index 000000000..2855ef362 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-change-relative-ref-date.module.js","sourceRoot":"","sources":["script-change-relative-ref-date.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,6BAA6B,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.ts new file mode 100644 index 000000000..b7d28c43d --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/changeRelativeRefDate/script-change-relative-ref-date.module.ts @@ -0,0 +1 @@ +angular.module('scriptChangeRelativeRefDate', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.js index 40efd1dd1..4b4608bcb 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.js @@ -1,153 +1,120 @@ +"use strict"; angular.module('scriptContinuity').component('scriptContinuity', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptContinuityController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js"; - - $scope.tmpIndicatorSelection = undefined; - - $scope.compIndicatorSelection = undefined; - $scope.compIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicator = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; - $scope.parameterDefaultValue_computationIndicator = undefined; - $scope.parameterNumericMinValue_computationIndicator = 0; - $scope.parameterNumericMaxValue_computationIndicator = 1; - - $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; - - $scope.numberOfTemporalItems = 3; - - $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; - $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; - $scope.parameterDefaultValue_temporalOption = "YEARS"; - $scope.parameterNumericMinValue_temporalOption = 0; - $scope.parameterNumericMaxValue_temporalOption = 1; - - $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; - $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '3'."; - $scope.parameterDefaultValue_numTemporalItems = 3; - $scope.parameterNumericMinValue_numTemporalItems = 3; - $scope.parameterNumericMaxValue_numTemporalItems = 100000; - $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeComputationIndicator = function(compIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.compIndicatorSelection_old){ - kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); - } - kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); - - $scope.compIndicatorSelection_old = compIndicatorSelection; - - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.onChangeNumTemporalItems = function(){ - $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangeTemporalOption = function(){ - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - - $scope.parameterDefaultValue_computationIndicator = undefined; - - if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ - $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; - } - - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - if (! $scope.compIndicatorSelection){ - return; - } - - var formulaHTML = "Berechnung gemäß Formel
$$ r = \\frac{\\sum_{n=1}^{m}((A_{n} - \\bar{A}) \\times (B_{n} - \\bar{B}))}{\\sqrt{\\sum_{n=1}^{m} (A_{n} - \\bar{A})^2 \\times \\sum_{n=1}^{m} (B_{n} - \\bar{B})^2}} $$"; - var legendItemsHTML = "Legende zur Formel"; - - legendItemsHTML+="
$r$: Kontinuität (Korrelationskoeffizient nach Pearson bei linearer Regression über die betrachtete Zeitspanne)"; - legendItemsHTML+="
$m$ = " + $scope.numberOfTemporalItems + " konsekutive vergangene " + $scope.temporalOption.displayName; - legendItemsHTML+="
$A_{n}$ = aufeinander folgende " + $scope.temporalOption.displayName; - legendItemsHTML+="
$\\bar{A}$ = arithmetisches Mittel der aufeinander folgenden " + $scope.temporalOption.displayName; - legendItemsHTML+="
$B_{n}$ = Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; - legendItemsHTML+="
$\\bar{B}$ = arithmetisches Mittel der Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; - legendItemsHTML+="
$B$ = Indikator '" + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]'"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptContinuityController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; + $scope.numberOfTemporalItems = 3; + $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; + $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; + $scope.parameterDefaultValue_temporalOption = "YEARS"; + $scope.parameterNumericMinValue_temporalOption = 0; + $scope.parameterNumericMaxValue_temporalOption = 1; + $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '3'."; + $scope.parameterDefaultValue_numTemporalItems = 3; + $scope.parameterNumericMinValue_numTemporalItems = 3; + $scope.parameterNumericMaxValue_numTemporalItems = 100000; + $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeComputationIndicator = function (compIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.compIndicatorSelection_old) { + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + $scope.compIndicatorSelection_old = compIndicatorSelection; + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeNumTemporalItems = function () { + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeTemporalOption = function () { + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue_computationIndicator = undefined; + if ($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId) { + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + if (!$scope.compIndicatorSelection) { + return; + } + var formulaHTML = "Berechnung gemäß Formel
$$ r = \\frac{\\sum_{n=1}^{m}((A_{n} - \\bar{A}) \\times (B_{n} - \\bar{B}))}{\\sqrt{\\sum_{n=1}^{m} (A_{n} - \\bar{A})^2 \\times \\sum_{n=1}^{m} (B_{n} - \\bar{B})^2}} $$"; + var legendItemsHTML = "Legende zur Formel"; + legendItemsHTML += "
$r$: Kontinuität (Korrelationskoeffizient nach Pearson bei linearer Regression über die betrachtete Zeitspanne)"; + legendItemsHTML += "
$m$ = " + $scope.numberOfTemporalItems + " konsekutive vergangene " + $scope.temporalOption.displayName; + legendItemsHTML += "
$A_{n}$ = aufeinander folgende " + $scope.temporalOption.displayName; + legendItemsHTML += "
$\\bar{A}$ = arithmetisches Mittel der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML += "
$B_{n}$ = Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML += "
$\\bar{B}$ = arithmetisches Mittel der Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML += "
$B$ = Indikator '" + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]'"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + } + ] }); +//# sourceMappingURL=script-continuity.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.js.map new file mode 100644 index 000000000..ca222bb0d --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-continuity.component.js","sourceRoot":"","sources":["script-continuity.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.ts new file mode 100644 index 000000000..40efd1dd1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.component.ts @@ -0,0 +1,153 @@ +angular.module('scriptContinuity').component('scriptContinuity', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptContinuityController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js"; + + $scope.tmpIndicatorSelection = undefined; + + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + + $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; + + $scope.numberOfTemporalItems = 3; + + $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; + $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; + $scope.parameterDefaultValue_temporalOption = "YEARS"; + $scope.parameterNumericMinValue_temporalOption = 0; + $scope.parameterNumericMaxValue_temporalOption = 1; + + $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '3'."; + $scope.parameterDefaultValue_numTemporalItems = 3; + $scope.parameterNumericMinValue_numTemporalItems = 3; + $scope.parameterNumericMaxValue_numTemporalItems = 100000; + $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeComputationIndicator = function(compIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.compIndicatorSelection_old){ + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + + $scope.compIndicatorSelection_old = compIndicatorSelection; + + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.onChangeNumTemporalItems = function(){ + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangeTemporalOption = function(){ + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + + $scope.parameterDefaultValue_computationIndicator = undefined; + + if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + if (! $scope.compIndicatorSelection){ + return; + } + + var formulaHTML = "Berechnung gemäß Formel
$$ r = \\frac{\\sum_{n=1}^{m}((A_{n} - \\bar{A}) \\times (B_{n} - \\bar{B}))}{\\sqrt{\\sum_{n=1}^{m} (A_{n} - \\bar{A})^2 \\times \\sum_{n=1}^{m} (B_{n} - \\bar{B})^2}} $$"; + var legendItemsHTML = "Legende zur Formel"; + + legendItemsHTML+="
$r$: Kontinuität (Korrelationskoeffizient nach Pearson bei linearer Regression über die betrachtete Zeitspanne)"; + legendItemsHTML+="
$m$ = " + $scope.numberOfTemporalItems + " konsekutive vergangene " + $scope.temporalOption.displayName; + legendItemsHTML+="
$A_{n}$ = aufeinander folgende " + $scope.temporalOption.displayName; + legendItemsHTML+="
$\\bar{A}$ = arithmetisches Mittel der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML+="
$B_{n}$ = Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML+="
$\\bar{B}$ = arithmetisches Mittel der Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML+="
$B$ = Indikator '" + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]'"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.js index 3fa4cd4af..6ae54e0fc 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptContinuity', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-continuity.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.js.map new file mode 100644 index 000000000..8a3541720 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-continuity.module.js","sourceRoot":"","sources":["script-continuity.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.ts new file mode 100644 index 000000000..3fa4cd4af --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/continuity/script-continuity.module.ts @@ -0,0 +1 @@ +angular.module('scriptContinuity', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.js index bc3b06943..d524ddd76 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.js @@ -1,141 +1,112 @@ +"use strict"; angular.module('scriptDivision').component('scriptDivision', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptDivisionController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_divide.js"; - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.refIndicatorSelection = undefined; - $scope.refIndicatorSelection_old = undefined; - - $scope.compIndicatorSelection = undefined; - $scope.compIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicators = "COMPUTATION_ID_numerator"; - $scope.parameterDescription_computationIndicators = "Indikatoren-ID des Dividenden."; - $scope.parameterDefaultValue_computationIndicators = undefined; - $scope.parameterNumericMinValue_computationIndicators = 0; - $scope.parameterNumericMaxValue_computationIndicators = 1; - - $scope.parameterName_referenceIndicator = "COMPUTATION_ID_denominator"; - $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; - $scope.parameterDefaultValue_referenceIndicator = undefined; - $scope.parameterNumericMinValue_referenceIndicator = 0; - $scope.parameterNumericMaxValue_referenceIndicator = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.refIndicatorSelection_old){ - kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); - } - kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); - - $scope.refIndicatorSelection_old = refIndicatorSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetRefIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.onChangeComputationIndicator = function(compIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.compIndicatorSelection_old){ - kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); - } - kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); - - $scope.compIndicatorSelection_old = compIndicatorSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetCompIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.resetRefIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); - $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); - }; - - $scope.resetCompIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); - $scope.parameterDefaultValue_computationIndicators = $scope.compIndicatorSelection.indicatorId; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - - if($scope.refIndicatorSelection && $scope.compIndicatorSelection){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Berechnung gemäß Formel
$ \\frac{A}{B} $"; - var legendItemsHTML = "Legende zur Formel"; - - legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; - legendItemsHTML+="
$B$: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - } - }; - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptDivisionController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_divide.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicators = "COMPUTATION_ID_numerator"; + $scope.parameterDescription_computationIndicators = "Indikatoren-ID des Dividenden."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + $scope.parameterName_referenceIndicator = "COMPUTATION_ID_denominator"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeReferenceIndicator = function (refIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.refIndicatorSelection_old) { + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + $scope.refIndicatorSelection_old = refIndicatorSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeComputationIndicator = function (compIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.compIndicatorSelection_old) { + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + $scope.compIndicatorSelection_old = compIndicatorSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetCompIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetRefIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + $scope.resetCompIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.compIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + $scope.resetComputationFormulaAndLegend = function () { + if ($scope.refIndicatorSelection && $scope.compIndicatorSelection) { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Berechnung gemäß Formel
$ \\frac{A}{B} $"; + var legendItemsHTML = "Legende zur Formel"; + legendItemsHTML += "
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML += "
$B$: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + } + }; + } + ] }); +//# sourceMappingURL=script-division.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.js.map new file mode 100644 index 000000000..0a80df400 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-division.component.js","sourceRoot":"","sources":["script-division.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.ts new file mode 100644 index 000000000..bc3b06943 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.component.ts @@ -0,0 +1,141 @@ +angular.module('scriptDivision').component('scriptDivision', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptDivisionController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_divide.js"; + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicators = "COMPUTATION_ID_numerator"; + $scope.parameterDescription_computationIndicators = "Indikatoren-ID des Dividenden."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + + $scope.parameterName_referenceIndicator = "COMPUTATION_ID_denominator"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.refIndicatorSelection_old){ + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + + $scope.refIndicatorSelection_old = refIndicatorSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.onChangeComputationIndicator = function(compIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.compIndicatorSelection_old){ + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + + $scope.compIndicatorSelection_old = compIndicatorSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetCompIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.resetRefIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + + $scope.resetCompIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.compIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + + if($scope.refIndicatorSelection && $scope.compIndicatorSelection){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Berechnung gemäß Formel
$ \\frac{A}{B} $"; + var legendItemsHTML = "Legende zur Formel"; + + legendItemsHTML+="
$A$: " + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]"; + legendItemsHTML+="
$B$: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + } + }; + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.js index 81e538e41..00b080c28 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptDivision', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-division.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.js.map new file mode 100644 index 000000000..a5440d7e3 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-division.module.js","sourceRoot":"","sources":["script-division.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.ts new file mode 100644 index 000000000..81e538e41 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/division/script-division.module.ts @@ -0,0 +1 @@ +angular.module('scriptDivision', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.js index cdb824b21..f9882f162 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.js @@ -1,185 +1,144 @@ +"use strict"; angular.module('scriptGeneric').component('scriptGeneric', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptGenericController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - /* POST BODY - { - "scriptCodeBase64": "scriptCodeBase64", - "requiredIndicatorIds": [ - "requiredIndicatorIds", - "requiredIndicatorIds" - ], - "variableProcessParameters": [ - { - "minParameterValueForNumericInputs": 6.027456183070403, - "maxParameterValueForNumericInputs": 0.8008281904610115, - "defaultValue": "defaultValue", - "dataType": "string", - "name": "name", - "description": "description" - }, - { - "minParameterValueForNumericInputs": 6.027456183070403, - "maxParameterValueForNumericInputs": 0.8008281904610115, - "defaultValue": "defaultValue", - "dataType": "string", - "name": "name", - "description": "description" - } - ], - "associatedIndicatorId": "associatedIndicatorId", - "name": "name", - "description": "description", - "requiredGeoresourceIds": [ - "requiredGeoresourceIds", - "requiredGeoresourceIds" - ] - } - */ - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.parameterName_tmp = undefined; - $scope.parameterDescription_tmp = undefined; - $scope.parameterDefaultValue_tmp = undefined; - $scope.parameterNumericMinValue_tmp = 0; - $scope.parameterNumericMaxValue_tmp = 1; - - $scope.scriptCode_readableString_forPreview = undefined; - - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - }; - - $scope.init(); - - $scope.onChangeParameterDataType = function(){ - $scope.parameterDefaultValue_tmp = undefined; - - if($scope.parameterDataType_tmp.apiName === 'boolean'){ - $scope.parameterDefaultValue_tmp = false; - } - }; - - $scope.onChangeDefaultValue = function (value) { - $scope.parameterDefaultValue_tmp = value; - }; - - $scope.onChangeNumericMinValue = function (value) { - $scope.parameterNumericMinValue_tmp = value; - }; - - $scope.onChangeNumericMaxValue = function (value) { - $scope.parameterNumericMaxValue_tmp = value; - }; - - $scope.onAddScriptParameter = function () { - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_tmp, $scope.parameterDescription_tmp, $scope.parameterDataType_tmp, $scope.parameterDefaultValue_tmp, $scope.parameterNumericMinValue_tmp, $scope.parameterNumericMaxValue_tmp); - - $scope.resetScriptParameterForm(); - }; - - $scope.resetScriptParameterForm = function () { - $scope.parameterName_tmp = undefined; - $scope.parameterDescription_tmp = undefined; - $scope.parameterDefaultValue_tmp = undefined; - $scope.parameterNumericMinValue_tmp = 0; - $scope.parameterNumericMaxValue_tmp = 1; - }; - - $scope.onImportScriptCodeFile = function(){ - - $scope.indicatorMetadataImportError = ""; - - $("#scriptCodeImportFile").files = []; - - // trigger file chooser - $("#scriptCodeImportFile").click(); - - }; - - $(document).on("change", "#scriptCodeImportFile" ,function(){ - - // get the file - var file = document.getElementById('scriptCodeImportFile').files[0]; - $scope.parseScriptCodeFromFile(file); - }); - - var fileStringIncludesScriptKeywords = function(string){ - var keywords = ["KmHelper", "computeIndicator", "aggregateIndicator", "module.exports.computeIndicator"]; - - var hasAllKeywords = true; - - for (const keyword of keywords) { - if (!string.includes(keyword) ){ - hasAllKeywords = false; - break; - } - } - - return hasAllKeywords; - }; - - $scope.parseScriptCodeFromFile = function(file){ - - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - if (event.target.result == null || event.target.result == undefined || !fileStringIncludesScriptKeywords(event.target.result)){ - console.error("Uploaded Script Code File is null or does not follow script template."); - $scope.indicatorScriptCodeImportError = "Uploaded Script Code File is null or does not follow script template."; - $("#scriptAddScriptCodeImportErrorAlert").show(); - - $scope.$digest(); - return; - } - - kommonitorScriptHelperService.scriptCode_readableString = event.target.result; - $scope.scriptCode_readableString_forPreview = event.target.result; - - $scope.$digest(); - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMetadataFile = function(event){ - // $scope.geoJsonString = event.target.result; - $scope.metadataImportSettings = JSON.parse(event.target.result); - - if(! $scope.metadataImportSettings.metadata){ - console.error("uploaded Metadata File cannot be parsed - wrong structure."); - $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; - $("#indicatorAddMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.$digest(); - }; - - $scope.hideScriptCodeErrorAlert = function(){ - $("#scriptAddScriptCodeImportErrorAlert").hide(); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptGenericController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + /* POST BODY + { + "scriptCodeBase64": "scriptCodeBase64", + "requiredIndicatorIds": [ + "requiredIndicatorIds", + "requiredIndicatorIds" + ], + "variableProcessParameters": [ + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + }, + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + } + ], + "associatedIndicatorId": "associatedIndicatorId", + "name": "name", + "description": "description", + "requiredGeoresourceIds": [ + "requiredGeoresourceIds", + "requiredGeoresourceIds" + ] + } + */ + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.parameterName_tmp = undefined; + $scope.parameterDescription_tmp = undefined; + $scope.parameterDefaultValue_tmp = undefined; + $scope.parameterNumericMinValue_tmp = 0; + $scope.parameterNumericMaxValue_tmp = 1; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + }; + $scope.init(); + $scope.onChangeParameterDataType = function () { + $scope.parameterDefaultValue_tmp = undefined; + if ($scope.parameterDataType_tmp.apiName === 'boolean') { + $scope.parameterDefaultValue_tmp = false; + } + }; + $scope.onChangeDefaultValue = function (value) { + $scope.parameterDefaultValue_tmp = value; + }; + $scope.onChangeNumericMinValue = function (value) { + $scope.parameterNumericMinValue_tmp = value; + }; + $scope.onChangeNumericMaxValue = function (value) { + $scope.parameterNumericMaxValue_tmp = value; + }; + $scope.onAddScriptParameter = function () { + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_tmp, $scope.parameterDescription_tmp, $scope.parameterDataType_tmp, $scope.parameterDefaultValue_tmp, $scope.parameterNumericMinValue_tmp, $scope.parameterNumericMaxValue_tmp); + $scope.resetScriptParameterForm(); + }; + $scope.resetScriptParameterForm = function () { + $scope.parameterName_tmp = undefined; + $scope.parameterDescription_tmp = undefined; + $scope.parameterDefaultValue_tmp = undefined; + $scope.parameterNumericMinValue_tmp = 0; + $scope.parameterNumericMaxValue_tmp = 1; + }; + $scope.onImportScriptCodeFile = function () { + $scope.indicatorMetadataImportError = ""; + $("#scriptCodeImportFile").files = []; + // trigger file chooser + $("#scriptCodeImportFile").click(); + }; + $(document).on("change", "#scriptCodeImportFile", function () { + // get the file + var file = document.getElementById('scriptCodeImportFile').files[0]; + $scope.parseScriptCodeFromFile(file); + }); + var fileStringIncludesScriptKeywords = function (string) { + var keywords = ["KmHelper", "computeIndicator", "aggregateIndicator", "module.exports.computeIndicator"]; + var hasAllKeywords = true; + for (const keyword of keywords) { + if (!string.includes(keyword)) { + hasAllKeywords = false; + break; + } + } + return hasAllKeywords; + }; + $scope.parseScriptCodeFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + if (event.target.result == null || event.target.result == undefined || !fileStringIncludesScriptKeywords(event.target.result)) { + console.error("Uploaded Script Code File is null or does not follow script template."); + $scope.indicatorScriptCodeImportError = "Uploaded Script Code File is null or does not follow script template."; + $("#scriptAddScriptCodeImportErrorAlert").show(); + $scope.$digest(); + return; + } + kommonitorScriptHelperService.scriptCode_readableString = event.target.result; + $scope.scriptCode_readableString_forPreview = event.target.result; + $scope.$digest(); + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMetadataFile = function (event) { + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + if (!$scope.metadataImportSettings.metadata) { + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorAddMetadataImportErrorAlert").show(); + $scope.$digest(); + } + $scope.$digest(); + }; + $scope.hideScriptCodeErrorAlert = function () { + $("#scriptAddScriptCodeImportErrorAlert").hide(); + }; + } + ] }); +//# sourceMappingURL=script-generic.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.js.map new file mode 100644 index 000000000..b4f18d8f1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-generic.component.js","sourceRoot":"","sources":["script-generic.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.ts new file mode 100644 index 000000000..cdb824b21 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.component.ts @@ -0,0 +1,185 @@ +angular.module('scriptGeneric').component('scriptGeneric', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptGenericController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + /* POST BODY + { + "scriptCodeBase64": "scriptCodeBase64", + "requiredIndicatorIds": [ + "requiredIndicatorIds", + "requiredIndicatorIds" + ], + "variableProcessParameters": [ + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + }, + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + } + ], + "associatedIndicatorId": "associatedIndicatorId", + "name": "name", + "description": "description", + "requiredGeoresourceIds": [ + "requiredGeoresourceIds", + "requiredGeoresourceIds" + ] + } + */ + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.parameterName_tmp = undefined; + $scope.parameterDescription_tmp = undefined; + $scope.parameterDefaultValue_tmp = undefined; + $scope.parameterNumericMinValue_tmp = 0; + $scope.parameterNumericMaxValue_tmp = 1; + + $scope.scriptCode_readableString_forPreview = undefined; + + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + }; + + $scope.init(); + + $scope.onChangeParameterDataType = function(){ + $scope.parameterDefaultValue_tmp = undefined; + + if($scope.parameterDataType_tmp.apiName === 'boolean'){ + $scope.parameterDefaultValue_tmp = false; + } + }; + + $scope.onChangeDefaultValue = function (value) { + $scope.parameterDefaultValue_tmp = value; + }; + + $scope.onChangeNumericMinValue = function (value) { + $scope.parameterNumericMinValue_tmp = value; + }; + + $scope.onChangeNumericMaxValue = function (value) { + $scope.parameterNumericMaxValue_tmp = value; + }; + + $scope.onAddScriptParameter = function () { + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_tmp, $scope.parameterDescription_tmp, $scope.parameterDataType_tmp, $scope.parameterDefaultValue_tmp, $scope.parameterNumericMinValue_tmp, $scope.parameterNumericMaxValue_tmp); + + $scope.resetScriptParameterForm(); + }; + + $scope.resetScriptParameterForm = function () { + $scope.parameterName_tmp = undefined; + $scope.parameterDescription_tmp = undefined; + $scope.parameterDefaultValue_tmp = undefined; + $scope.parameterNumericMinValue_tmp = 0; + $scope.parameterNumericMaxValue_tmp = 1; + }; + + $scope.onImportScriptCodeFile = function(){ + + $scope.indicatorMetadataImportError = ""; + + $("#scriptCodeImportFile").files = []; + + // trigger file chooser + $("#scriptCodeImportFile").click(); + + }; + + $(document).on("change", "#scriptCodeImportFile" ,function(){ + + // get the file + var file = document.getElementById('scriptCodeImportFile').files[0]; + $scope.parseScriptCodeFromFile(file); + }); + + var fileStringIncludesScriptKeywords = function(string){ + var keywords = ["KmHelper", "computeIndicator", "aggregateIndicator", "module.exports.computeIndicator"]; + + var hasAllKeywords = true; + + for (const keyword of keywords) { + if (!string.includes(keyword) ){ + hasAllKeywords = false; + break; + } + } + + return hasAllKeywords; + }; + + $scope.parseScriptCodeFromFile = function(file){ + + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + if (event.target.result == null || event.target.result == undefined || !fileStringIncludesScriptKeywords(event.target.result)){ + console.error("Uploaded Script Code File is null or does not follow script template."); + $scope.indicatorScriptCodeImportError = "Uploaded Script Code File is null or does not follow script template."; + $("#scriptAddScriptCodeImportErrorAlert").show(); + + $scope.$digest(); + return; + } + + kommonitorScriptHelperService.scriptCode_readableString = event.target.result; + $scope.scriptCode_readableString_forPreview = event.target.result; + + $scope.$digest(); + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMetadataFile = function(event){ + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + + if(! $scope.metadataImportSettings.metadata){ + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.indicatorMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("indicatorsAddMetadataPre").innerHTML = $scope.indicatorMetadataStructure_pretty; + $("#indicatorAddMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.$digest(); + }; + + $scope.hideScriptCodeErrorAlert = function(){ + $("#scriptAddScriptCodeImportErrorAlert").hide(); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.js index 18d19871b..c1d3e75fd 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptGeneric', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-generic.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.js.map new file mode 100644 index 000000000..bddec29db --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-generic.module.js","sourceRoot":"","sources":["script-generic.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.ts new file mode 100644 index 000000000..18d19871b --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/generic/script-generic.module.ts @@ -0,0 +1 @@ +angular.module('scriptGeneric', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.js index 6c27cb22a..944f8ad0a 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.js @@ -1,188 +1,158 @@ +"use strict"; angular.module('scriptGeoresourceStatistics').component('scriptGeoresourceStatistics', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorCacheHelperService', - function ScriptGeoresourceStatisticsController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorCacheHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_georesource_miscStatistics.js"; - - $scope.propertySchema = {}; - $scope.numericPropertyOptions = undefined; - - $scope.compOptions = [ - { - "apiName": "MIN", - "displayName": "Minimum", - }, - { - "apiName": "MAX", - "displayName": "Maximum", - }, - { - "apiName": "MEAN", - "displayName": "Arithmetisches Mittel", - }, - { - "apiName": "MEDIAN", - "displayName": "Median", - }, - { - "apiName": "SUM", - "displayName": "Summe", - }, - { - "apiName": "STANDARD_DEVIATION", - "displayName": "Standardabweichung", - } - ]; - - $scope.georesourceSelection = undefined; - $scope.georesourceSelection_old = undefined; - - // parameter for georesource dataset - $scope.parameterName_computationGeoresource = "compGeoId"; - $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; - $scope.parameterDefaultValue_computationGeoresource = undefined; - $scope.parameterNumericMinValue_computationGeoresource = 0; - $scope.parameterNumericMaxValue_computationGeoresource = 1; - - // parameter for object property name - $scope.parameterName_computationProperty = "compProp"; - $scope.parameterDescription_computationProperty = "Georessourcen Attributname."; - $scope.parameterDefaultValue_computationProperty = undefined; - $scope.parameterNumericMinValue_computationProperty = 0; - $scope.parameterNumericMaxValue_computationProperty = 1; - - // parameter for computation method - $scope.parameterName_computationMethod = "compMeth"; - $scope.parameterDescription_computationMethod = "Statistische Berechnungsmethode."; - $scope.parameterDefaultValue_computationMethod = undefined; - $scope.parameterNumericMinValue_computationMethod = 0; - $scope.parameterNumericMaxValue_computationMethod = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeGeoresource = function(georesourceSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.georesourceSelection_old){ - kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); - } - kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); - - $scope.georesourceSelection_old = georesourceSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetGeoresourceParameter(); - $scope.resetNumericPropertyOptions(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.resetNumericPropertyOptions = function(){ - $scope.propertySchema = {}; - kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) - .then((schema) => { - for (var prop in schema) { - if (schema[prop] === 'Integer' || schema[prop] === 'Double') { - $scope.propertySchema[prop] = schema[prop]; - } - } - $scope.numericPropertyOptions = Object.keys($scope.propertySchema); - }); - }; - - $scope.onChangeNumericPropertyName = function(){ - $scope.resetScriptParameter_objectPropertyName(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangeComputationOption = function(){ - $scope.resetScriptParameter_computationMethod(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter_computationGeoresource = function(georesourceMetadata){ - - return georesourceMetadata.georesourceId; - }; - - $scope.resetGeoresourceParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); - $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); - }; - - $scope.resetScriptParameter_objectPropertyName = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationProperty); - $scope.parameterDefaultValue_computationProperty = $scope.numericPropertyName; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationProperty, $scope.parameterDescription_computationProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationProperty, $scope.parameterNumericMinValue_computationProperty, $scope.parameterNumericMaxValue_computationProperty); - }; - - $scope.resetScriptParameter_computationMethod = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationMethod); - $scope.parameterDefaultValue_computationMethod = $scope.compMethod.apiName; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationMethod, $scope.parameterDescription_computationMethod, $scope.parameterDataType, $scope.parameterDefaultValue_computationMethod, $scope.parameterNumericMinValue_computationMethod, $scope.parameterNumericMaxValue_computationMethod); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Geodatenanalyse: Statistische Berechnung '" + $scope.compMethod.displayName + "' anhand Objekteigenschaft '" + $scope.numericPropertyName + "' für alle Punktobjekte des Datensatzes G1 innerhalb des jeweiligen Raumeinheits-Features"; - var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - }; - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorCacheHelperService', + function ScriptGeoresourceStatisticsController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorCacheHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_georesource_miscStatistics.js"; + $scope.propertySchema = {}; + $scope.numericPropertyOptions = undefined; + $scope.compOptions = [ + { + "apiName": "MIN", + "displayName": "Minimum", + }, + { + "apiName": "MAX", + "displayName": "Maximum", + }, + { + "apiName": "MEAN", + "displayName": "Arithmetisches Mittel", + }, + { + "apiName": "MEDIAN", + "displayName": "Median", + }, + { + "apiName": "SUM", + "displayName": "Summe", + }, + { + "apiName": "STANDARD_DEVIATION", + "displayName": "Standardabweichung", + } + ]; + $scope.georesourceSelection = undefined; + $scope.georesourceSelection_old = undefined; + // parameter for georesource dataset + $scope.parameterName_computationGeoresource = "compGeoId"; + $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; + $scope.parameterDefaultValue_computationGeoresource = undefined; + $scope.parameterNumericMinValue_computationGeoresource = 0; + $scope.parameterNumericMaxValue_computationGeoresource = 1; + // parameter for object property name + $scope.parameterName_computationProperty = "compProp"; + $scope.parameterDescription_computationProperty = "Georessourcen Attributname."; + $scope.parameterDefaultValue_computationProperty = undefined; + $scope.parameterNumericMinValue_computationProperty = 0; + $scope.parameterNumericMaxValue_computationProperty = 1; + // parameter for computation method + $scope.parameterName_computationMethod = "compMeth"; + $scope.parameterDescription_computationMethod = "Statistische Berechnungsmethode."; + $scope.parameterDefaultValue_computationMethod = undefined; + $scope.parameterNumericMinValue_computationMethod = 0; + $scope.parameterNumericMaxValue_computationMethod = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeGeoresource = function (georesourceSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.georesourceSelection_old) { + kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); + } + kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); + $scope.georesourceSelection_old = georesourceSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetGeoresourceParameter(); + $scope.resetNumericPropertyOptions(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetNumericPropertyOptions = function () { + $scope.propertySchema = {}; + kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) + .then((schema) => { + for (var prop in schema) { + if (schema[prop] === 'Integer' || schema[prop] === 'Double') { + $scope.propertySchema[prop] = schema[prop]; + } + } + $scope.numericPropertyOptions = Object.keys($scope.propertySchema); + }); + }; + $scope.onChangeNumericPropertyName = function () { + $scope.resetScriptParameter_objectPropertyName(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeComputationOption = function () { + $scope.resetScriptParameter_computationMethod(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter_computationGeoresource = function (georesourceMetadata) { + return georesourceMetadata.georesourceId; + }; + $scope.resetGeoresourceParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); + $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); + }; + $scope.resetScriptParameter_objectPropertyName = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationProperty); + $scope.parameterDefaultValue_computationProperty = $scope.numericPropertyName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationProperty, $scope.parameterDescription_computationProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationProperty, $scope.parameterNumericMinValue_computationProperty, $scope.parameterNumericMaxValue_computationProperty); + }; + $scope.resetScriptParameter_computationMethod = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationMethod); + $scope.parameterDefaultValue_computationMethod = $scope.compMethod.apiName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationMethod, $scope.parameterDescription_computationMethod, $scope.parameterDataType, $scope.parameterDefaultValue_computationMethod, $scope.parameterNumericMinValue_computationMethod, $scope.parameterNumericMaxValue_computationMethod); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Geodatenanalyse: Statistische Berechnung '" + $scope.compMethod.displayName + "' anhand Objekteigenschaft '" + $scope.numericPropertyName + "' für alle Punktobjekte des Datensatzes G1 innerhalb des jeweiligen Raumeinheits-Features"; + var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + } + ] }); +//# sourceMappingURL=script-georesource-statistics.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.js.map new file mode 100644 index 000000000..5badddc20 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-georesource-statistics.component.js","sourceRoot":"","sources":["script-georesource-statistics.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.ts new file mode 100644 index 000000000..6c27cb22a --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.component.ts @@ -0,0 +1,188 @@ +angular.module('scriptGeoresourceStatistics').component('scriptGeoresourceStatistics', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorCacheHelperService', + function ScriptGeoresourceStatisticsController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorCacheHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_georesource_miscStatistics.js"; + + $scope.propertySchema = {}; + $scope.numericPropertyOptions = undefined; + + $scope.compOptions = [ + { + "apiName": "MIN", + "displayName": "Minimum", + }, + { + "apiName": "MAX", + "displayName": "Maximum", + }, + { + "apiName": "MEAN", + "displayName": "Arithmetisches Mittel", + }, + { + "apiName": "MEDIAN", + "displayName": "Median", + }, + { + "apiName": "SUM", + "displayName": "Summe", + }, + { + "apiName": "STANDARD_DEVIATION", + "displayName": "Standardabweichung", + } + ]; + + $scope.georesourceSelection = undefined; + $scope.georesourceSelection_old = undefined; + + // parameter for georesource dataset + $scope.parameterName_computationGeoresource = "compGeoId"; + $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; + $scope.parameterDefaultValue_computationGeoresource = undefined; + $scope.parameterNumericMinValue_computationGeoresource = 0; + $scope.parameterNumericMaxValue_computationGeoresource = 1; + + // parameter for object property name + $scope.parameterName_computationProperty = "compProp"; + $scope.parameterDescription_computationProperty = "Georessourcen Attributname."; + $scope.parameterDefaultValue_computationProperty = undefined; + $scope.parameterNumericMinValue_computationProperty = 0; + $scope.parameterNumericMaxValue_computationProperty = 1; + + // parameter for computation method + $scope.parameterName_computationMethod = "compMeth"; + $scope.parameterDescription_computationMethod = "Statistische Berechnungsmethode."; + $scope.parameterDefaultValue_computationMethod = undefined; + $scope.parameterNumericMinValue_computationMethod = 0; + $scope.parameterNumericMaxValue_computationMethod = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeGeoresource = function(georesourceSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.georesourceSelection_old){ + kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); + } + kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); + + $scope.georesourceSelection_old = georesourceSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetGeoresourceParameter(); + $scope.resetNumericPropertyOptions(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.resetNumericPropertyOptions = function(){ + $scope.propertySchema = {}; + kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) + .then((schema) => { + for (var prop in schema) { + if (schema[prop] === 'Integer' || schema[prop] === 'Double') { + $scope.propertySchema[prop] = schema[prop]; + } + } + $scope.numericPropertyOptions = Object.keys($scope.propertySchema); + }); + }; + + $scope.onChangeNumericPropertyName = function(){ + $scope.resetScriptParameter_objectPropertyName(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangeComputationOption = function(){ + $scope.resetScriptParameter_computationMethod(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter_computationGeoresource = function(georesourceMetadata){ + + return georesourceMetadata.georesourceId; + }; + + $scope.resetGeoresourceParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); + $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); + }; + + $scope.resetScriptParameter_objectPropertyName = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationProperty); + $scope.parameterDefaultValue_computationProperty = $scope.numericPropertyName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationProperty, $scope.parameterDescription_computationProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationProperty, $scope.parameterNumericMinValue_computationProperty, $scope.parameterNumericMaxValue_computationProperty); + }; + + $scope.resetScriptParameter_computationMethod = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationMethod); + $scope.parameterDefaultValue_computationMethod = $scope.compMethod.apiName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationMethod, $scope.parameterDescription_computationMethod, $scope.parameterDataType, $scope.parameterDefaultValue_computationMethod, $scope.parameterNumericMinValue_computationMethod, $scope.parameterNumericMaxValue_computationMethod); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Geodatenanalyse: Statistische Berechnung '" + $scope.compMethod.displayName + "' anhand Objekteigenschaft '" + $scope.numericPropertyName + "' für alle Punktobjekte des Datensatzes G1 innerhalb des jeweiligen Raumeinheits-Features"; + var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.js index 7404c4fe5..bf3d16565 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptGeoresourceStatistics', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'kommonitorCacheHelper']); +//# sourceMappingURL=script-georesource-statistics.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.js.map new file mode 100644 index 000000000..2b36049a5 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-georesource-statistics.module.js","sourceRoot":"","sources":["script-georesource-statistics.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,6BAA6B,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,uBAAuB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.ts new file mode 100644 index 000000000..7404c4fe5 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceStatistics/script-georesource-statistics.module.ts @@ -0,0 +1 @@ +angular.module('scriptGeoresourceStatistics', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'kommonitorCacheHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.js index 5abd48406..516b69e2d 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.js @@ -1,304 +1,270 @@ +"use strict"; angular.module('scriptGeoresourceSubsetShare').component('scriptGeoresourceSubsetShare', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - 'kommonitorCacheHelperService', - function ScriptPointsInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, - __env, $timeout, kommonitorCacheHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_georesource_share_byPropertyValue.js"; - - $scope.propertySchema = {}; - $scope.propertyOptions = undefined; - $scope.propertyValueOptions = undefined; - - $scope.georesourceSelection = undefined; - $scope.georesourceSelection_old = undefined; - - // parameter for georesource dataset - $scope.parameterName_computationGeoresource = "compGeoId"; - $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; - $scope.parameterDefaultValue_computationGeoresource = undefined; - $scope.parameterNumericMinValue_computationGeoresource = 0; - $scope.parameterNumericMaxValue_computationGeoresource = 1; - - // parameter for object property name - $scope.parameterName_computationFilterProperty = "compFilterProp"; - $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; - $scope.parameterDefaultValue_computationFilterProperty = undefined; - $scope.parameterNumericMinValue_computationFilterProperty = 0; - $scope.parameterNumericMaxValue_computationFilterProperty = 1; - - // parameter for logical operator - $scope.parameterName_computationFilterOperator = "compFilterOperator"; - $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; - $scope.parameterDefaultValue_computationFilterOperator = undefined; - $scope.parameterNumericMinValue_computationFilterOperator = 0; - $scope.parameterNumericMaxValue_computationFilterOperator = 1; - - // parameter for property value - $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; - $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; - $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; - $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; - $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; - - // parameter for property value - $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; - $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - $scope.propertyValueSelection = []; - - $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; - $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; - $scope.dropdownEvents = { - onSelectionChanged: function() { - $scope.onChangePropertyValue(); - } - }; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeGeoresource = function(georesourceSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.georesourceSelection_old){ - kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); - } - kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); - - $scope.georesourceSelection_old = georesourceSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetGeoresourceParameter(); - $scope.resetPropertyOptions(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangePropertyName = function(){ - $scope.resetScriptParameter_filterPropertyName(); - $scope.resetComputationFormulaAndLegend(); - $scope.filterOperatorOptions(); - $scope.resetPropertyValueOptions(); - if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { - $scope.propertyValueSelection = []; - } - }; - - $scope.onChangeOperatorOption = function(){ - if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { - $scope.propertyValueSelection = []; - } - $scope.resetScriptParameter_operator(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangePropertyValue = function(){ - console.log("auswahl"); - $scope.resetScriptParameter_filterPropertyValue(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter_computationGeoresource = function(georesourceMetadata){ - - return georesourceMetadata.georesourceId; - }; - - $scope.resetGeoresourceParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); - $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); - }; - - $scope.resetPropertyOptions = function(){ - kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) - .then((schema) => { - for (var prop in schema) { - if (schema[prop] !== 'Date') { - $scope.propertySchema[prop] = schema[prop]; - } - } - $scope.propertyOptions = Object.keys($scope.propertySchema); - }); - }; - - $scope.resetScriptParameter_filterPropertyName = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); - $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); - }; - - $scope.filterOperatorOptions = function(){ - if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String"){ - $scope.operatorOptions = [ - { - "apiName": "Equal", - "displayName": "gleich (=)", - }, - { - "apiName": "Unequal", - "displayName": "ungleich (!=)", - }, - { - "apiName": "Contains", - "displayName": "enthält (kommaseparierte Liste)", - } - ]; - } else { - $scope.operatorOptions = [ - { - "apiName": "Equal", - "displayName": "gleich (=)", - }, - { - "apiName": "Greater_than", - "displayName": "größer als (>)", - }, - { - "apiName": "Greater_than_or_equal", - "displayName": "größer als oder gleich (>=)", - }, - { - "apiName": "Less_than", - "displayName": "kleiner als (<)", - }, - { - "apiName": "Less_than_or_equal", - "displayName": "kleiner als oder gleich (<=)", - }, - { - "apiName": "Unequal", - "displayName": "ungleich (!=)", - }, - { - "apiName": "Range", - "displayName": "Wertebereich (>=untere Grenze & { - var data = dataTable; - var tmpArray = data.map(item => { - let value = item[$scope.parameterDefaultValue_computationFilterProperty]; - return value; - }); - if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { - // sort strings - $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); - } else { - // sort numbers - $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function(a,b){ - return a - b; - }); - } - }); - }; - - $scope.filterPropertyValueRange_toOptions = function() { - return function(item) { - if (item > $scope.propertyValueRange_from) { - return true; - } - return false; - }; - }; - - $scope.resetScriptParameter_filterPropertyValue = function() { - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); - if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { - $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; - } else { - $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); - } - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - var formulaHTML = ""; - if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Auswahlkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; - if ($scope.operator.apiName === "Range") { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Auswahlkriterium: '" + $scope.propertyName + "' im Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; - } - if ($scope.operator.apiName === "Contains") { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; - } - } - else { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature"; - } - var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - }; - - $scope.onChangePropertyValueRange_range = function() { - $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; - $scope.resetScriptParameter_filterPropertyValue(); - $scope.resetComputationFormulaAndLegend(); - } - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + 'kommonitorCacheHelperService', + function ScriptPointsInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorCacheHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_georesource_share_byPropertyValue.js"; + $scope.propertySchema = {}; + $scope.propertyOptions = undefined; + $scope.propertyValueOptions = undefined; + $scope.georesourceSelection = undefined; + $scope.georesourceSelection_old = undefined; + // parameter for georesource dataset + $scope.parameterName_computationGeoresource = "compGeoId"; + $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; + $scope.parameterDefaultValue_computationGeoresource = undefined; + $scope.parameterNumericMinValue_computationGeoresource = 0; + $scope.parameterNumericMaxValue_computationGeoresource = 1; + // parameter for object property name + $scope.parameterName_computationFilterProperty = "compFilterProp"; + $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; + $scope.parameterDefaultValue_computationFilterProperty = undefined; + $scope.parameterNumericMinValue_computationFilterProperty = 0; + $scope.parameterNumericMaxValue_computationFilterProperty = 1; + // parameter for logical operator + $scope.parameterName_computationFilterOperator = "compFilterOperator"; + $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; + $scope.parameterDefaultValue_computationFilterOperator = undefined; + $scope.parameterNumericMinValue_computationFilterOperator = 0; + $scope.parameterNumericMaxValue_computationFilterOperator = 1; + // parameter for property value + $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; + $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; + $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; + $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; + $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; + // parameter for property value + $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; + $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + $scope.propertyValueSelection = []; + $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; + $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; + $scope.dropdownEvents = { + onSelectionChanged: function () { + $scope.onChangePropertyValue(); + } + }; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeGeoresource = function (georesourceSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.georesourceSelection_old) { + kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); + } + kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); + $scope.georesourceSelection_old = georesourceSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetGeoresourceParameter(); + $scope.resetPropertyOptions(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangePropertyName = function () { + $scope.resetScriptParameter_filterPropertyName(); + $scope.resetComputationFormulaAndLegend(); + $scope.filterOperatorOptions(); + $scope.resetPropertyValueOptions(); + if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { + $scope.propertyValueSelection = []; + } + }; + $scope.onChangeOperatorOption = function () { + if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { + $scope.propertyValueSelection = []; + } + $scope.resetScriptParameter_operator(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangePropertyValue = function () { + console.log("auswahl"); + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter_computationGeoresource = function (georesourceMetadata) { + return georesourceMetadata.georesourceId; + }; + $scope.resetGeoresourceParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); + $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); + }; + $scope.resetPropertyOptions = function () { + kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) + .then((schema) => { + for (var prop in schema) { + if (schema[prop] !== 'Date') { + $scope.propertySchema[prop] = schema[prop]; + } + } + $scope.propertyOptions = Object.keys($scope.propertySchema); + }); + }; + $scope.resetScriptParameter_filterPropertyName = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); + $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); + }; + $scope.filterOperatorOptions = function () { + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String") { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Contains", + "displayName": "enthält (kommaseparierte Liste)", + } + ]; + } + else { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Greater_than", + "displayName": "größer als (>)", + }, + { + "apiName": "Greater_than_or_equal", + "displayName": "größer als oder gleich (>=)", + }, + { + "apiName": "Less_than", + "displayName": "kleiner als (<)", + }, + { + "apiName": "Less_than_or_equal", + "displayName": "kleiner als oder gleich (<=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Range", + "displayName": "Wertebereich (>=untere Grenze & { + var data = dataTable; + var tmpArray = data.map(item => { + let value = item[$scope.parameterDefaultValue_computationFilterProperty]; + return value; + }); + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { + // sort strings + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); + } + else { + // sort numbers + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function (a, b) { + return a - b; + }); + } + }); + }; + $scope.filterPropertyValueRange_toOptions = function () { + return function (item) { + if (item > $scope.propertyValueRange_from) { + return true; + } + return false; + }; + }; + $scope.resetScriptParameter_filterPropertyValue = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); + if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; + } + else { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = ""; + if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Auswahlkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; + if ($scope.operator.apiName === "Range") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Auswahlkriterium: '" + $scope.propertyName + "' im Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; + } + if ($scope.operator.apiName === "Contains") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; + } + } + else { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature"; + } + var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.onChangePropertyValueRange_range = function () { + $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + } + ] }); +//# sourceMappingURL=script-georesource-subset-share.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.js.map new file mode 100644 index 000000000..72720a63a --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-georesource-subset-share.component.js","sourceRoot":"","sources":["script-georesource-subset-share.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.ts new file mode 100644 index 000000000..5abd48406 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.component.ts @@ -0,0 +1,304 @@ +angular.module('scriptGeoresourceSubsetShare').component('scriptGeoresourceSubsetShare', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + 'kommonitorCacheHelperService', + function ScriptPointsInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, + __env, $timeout, kommonitorCacheHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_georesource_share_byPropertyValue.js"; + + $scope.propertySchema = {}; + $scope.propertyOptions = undefined; + $scope.propertyValueOptions = undefined; + + $scope.georesourceSelection = undefined; + $scope.georesourceSelection_old = undefined; + + // parameter for georesource dataset + $scope.parameterName_computationGeoresource = "compGeoId"; + $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; + $scope.parameterDefaultValue_computationGeoresource = undefined; + $scope.parameterNumericMinValue_computationGeoresource = 0; + $scope.parameterNumericMaxValue_computationGeoresource = 1; + + // parameter for object property name + $scope.parameterName_computationFilterProperty = "compFilterProp"; + $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; + $scope.parameterDefaultValue_computationFilterProperty = undefined; + $scope.parameterNumericMinValue_computationFilterProperty = 0; + $scope.parameterNumericMaxValue_computationFilterProperty = 1; + + // parameter for logical operator + $scope.parameterName_computationFilterOperator = "compFilterOperator"; + $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; + $scope.parameterDefaultValue_computationFilterOperator = undefined; + $scope.parameterNumericMinValue_computationFilterOperator = 0; + $scope.parameterNumericMaxValue_computationFilterOperator = 1; + + // parameter for property value + $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; + $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; + $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; + $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; + $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; + + // parameter for property value + $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; + $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + $scope.propertyValueSelection = []; + + $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; + $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; + $scope.dropdownEvents = { + onSelectionChanged: function() { + $scope.onChangePropertyValue(); + } + }; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeGeoresource = function(georesourceSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.georesourceSelection_old){ + kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); + } + kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); + + $scope.georesourceSelection_old = georesourceSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetGeoresourceParameter(); + $scope.resetPropertyOptions(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangePropertyName = function(){ + $scope.resetScriptParameter_filterPropertyName(); + $scope.resetComputationFormulaAndLegend(); + $scope.filterOperatorOptions(); + $scope.resetPropertyValueOptions(); + if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { + $scope.propertyValueSelection = []; + } + }; + + $scope.onChangeOperatorOption = function(){ + if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { + $scope.propertyValueSelection = []; + } + $scope.resetScriptParameter_operator(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangePropertyValue = function(){ + console.log("auswahl"); + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter_computationGeoresource = function(georesourceMetadata){ + + return georesourceMetadata.georesourceId; + }; + + $scope.resetGeoresourceParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); + $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); + }; + + $scope.resetPropertyOptions = function(){ + kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) + .then((schema) => { + for (var prop in schema) { + if (schema[prop] !== 'Date') { + $scope.propertySchema[prop] = schema[prop]; + } + } + $scope.propertyOptions = Object.keys($scope.propertySchema); + }); + }; + + $scope.resetScriptParameter_filterPropertyName = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); + $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); + }; + + $scope.filterOperatorOptions = function(){ + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String"){ + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Contains", + "displayName": "enthält (kommaseparierte Liste)", + } + ]; + } else { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Greater_than", + "displayName": "größer als (>)", + }, + { + "apiName": "Greater_than_or_equal", + "displayName": "größer als oder gleich (>=)", + }, + { + "apiName": "Less_than", + "displayName": "kleiner als (<)", + }, + { + "apiName": "Less_than_or_equal", + "displayName": "kleiner als oder gleich (<=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Range", + "displayName": "Wertebereich (>=untere Grenze & { + var data = dataTable; + var tmpArray = data.map(item => { + let value = item[$scope.parameterDefaultValue_computationFilterProperty]; + return value; + }); + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { + // sort strings + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); + } else { + // sort numbers + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function(a,b){ + return a - b; + }); + } + }); + }; + + $scope.filterPropertyValueRange_toOptions = function() { + return function(item) { + if (item > $scope.propertyValueRange_from) { + return true; + } + return false; + }; + }; + + $scope.resetScriptParameter_filterPropertyValue = function() { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); + if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; + } else { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = ""; + if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Auswahlkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; + if ($scope.operator.apiName === "Range") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Auswahlkriterium: '" + $scope.propertyName + "' im Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; + } + if ($scope.operator.apiName === "Contains") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; + } + } + else { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Prozentualer Anteil der Auswahl an allen Punkten des Datensatzes G1 pro Raumeinheits-Feature"; + } + var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + + $scope.onChangePropertyValueRange_range = function() { + $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + } + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.js index ca3b7a035..0674707fe 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.js @@ -1,2 +1,4 @@ -angular.module('scriptGeoresourceSubsetShare', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'angularjs-dropdown-multiselect', +"use strict"; +angular.module('scriptGeoresourceSubsetShare', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'angularjs-dropdown-multiselect', 'kommonitorCacheHelper']); +//# sourceMappingURL=script-georesource-subset-share.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.js.map new file mode 100644 index 000000000..63ddbfff2 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-georesource-subset-share.module.js","sourceRoot":"","sources":["script-georesource-subset-share.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,8BAA8B,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,gCAAgC;IAChI,uBAAuB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.ts new file mode 100644 index 000000000..ca3b7a035 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/georesourceSubsetShare/script-georesource-subset-share.module.ts @@ -0,0 +1,2 @@ +angular.module('scriptGeoresourceSubsetShare', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'angularjs-dropdown-multiselect', + 'kommonitorCacheHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.js index 982dbb032..6bad4008f 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.js @@ -1,235 +1,183 @@ +"use strict"; angular.module('scriptHeadlineIndicator').component('scriptHeadlineIndicator', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptHeadlineIndicatorController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_headline_indicator.js"; - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.baseIndicators = []; - - $scope.polarityOptions = [ - { - "apiName": "regular", - "displayName": "normal [(value - min) / (max - min)]" - }, - { - "apiName": "inverted", - "displayName": "invertiert [1 - ((value - min) / (max - min))]" - } - ]; - - $scope.tmpIndicatorPolarity = $scope.polarityOptions[0]; - - $scope.aggregationOptions = [ - { - "apiName": "geomean", - "displayName": "Geometrisches Mittel" - }, - { - "apiName": "mean", - "displayName": "Arithmetrisches Mittel" - }, - { - "apiName": "min", - "displayName": "Minimum" - } - ]; - - $scope.aggregationOption = $scope.aggregationOptions[0]; - - $scope.fixProcessDescription = "Berechnung: Verknüpfung der (Basis-)Indikatoren zu einem Leitindikator durch Verkettung der Berechnungsschritte rank, Min-Max-Normalisierung (normal/invertiert), Aggregation (geometrisches" - + "Mittel, Mittelwert oder Minimalwert)
" - + "Eine Normierung der (Basis-)Indikatoren wird durch die Vergabe von Rangplätzen erreicht. Hierbei werden die Wertausprägungen aller Raumeinheiten für jeden (Basis-)Indikator in eine Rangfolge gebracht. Die Raumeinheit mit der inhaltlich am schlechtesten zu wertenden " - + "Ausprägung erhält dabei den Rang 1, wohingegen die Raumeinheit mit der besten Wertausprägung den " - + "höchsten Rang (n = Anzahl der Raumeinheiten) erhält. Um einen standardisierten Wertebereich zu erzeugen, " - + "werden die Werte der (Basis-)Indikator noch vor der Aggregation auf eine Skala von null bis 1 " - + "normiert, wobei der schlechteste Wert jeweils eine null erhält und der beste Wert eine 1 (Min/Max-Normierung). Anschließend können die Werte dann mit Hilfe des geeigneten Aggregationsverfahrens " - + "(geometrisches Mittel, Mittelwert oder Minimalwert) zum Leitindikator 1. Ordnung verknüpft werden. "; - - - - - - - - $scope.parameterName_compArray = "COMPUTATION_ID_ARRAY"; - $scope.parameterDescription_compArray = "Komma-separierte Liste aller Indikatoren-IDs zur Leitindikatorbildung."; - $scope.parameterDefaultValue_compArray = undefined; - $scope.parameterNumericMinValue_compArray = 0; - $scope.parameterNumericMaxValue_compArray = 1; - - $scope.parameterName_polArray = "COMPUTATION_POLARITY_ARRAY"; - $scope.parameterDescription_polArray = "Komma-separierte Liste aller Min-Max-Polaritäten der zugehörigen Indikatoren zur Leitindikatorbildung. Die Reihenfolge muss der Reihenfolge der Indikatoren-IDs des Parameters 'COMPUTATION_ID_ARRAY' entsprechen."; - $scope.parameterDefaultValue_polArray = 'regular'; - $scope.parameterNumericMinValue_polArray = 0; - $scope.parameterNumericMaxValue_polArray = 1; - - $scope.parameterName_aggregationOption = "AGGREGATION_METHOD"; - $scope.parameterDescription_aggregationOption = "Angabe der Aggregationsmethode zur Leitindikatorbildung. Standard ist das geometrische Mittel."; - $scope.parameterDefaultValue_aggregationOption = "geomean"; - $scope.parameterNumericMinValue_aggregationOption = 0; - $scope.parameterNumericMaxValue_aggregationOption = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.generateParameterValue_compArray = function(requiredIndicatorsArray){ - - var result=""; - for (let index = 0; index < requiredIndicatorsArray.length; index++) { - const indicatorMetadata = requiredIndicatorsArray[index]; - result+=indicatorMetadata.indicatorId; - if(index < requiredIndicatorsArray.length - 1){ - result+=","; - } - } - - return result; - }; - - $scope.generateParameterValue_polArray = function(requiredIndicatorsArray){ - - var result=""; - for (let index = 0; index < requiredIndicatorsArray.length; index++) { - const indicatorMetadata = requiredIndicatorsArray[index]; - result+=indicatorMetadata.polarity.apiName; - if(index < requiredIndicatorsArray.length - 1){ - result+=","; - } - } - - return result; - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - $scope.parameterDefaultValue_compArray = $scope.generateParameterValue_compArray($scope.baseIndicators); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_compArray, $scope.parameterDescription_compArray, $scope.parameterDataType, $scope.parameterDefaultValue_compArray, $scope.parameterNumericMinValue_compArray, $scope.parameterNumericMaxValue_compArray); - $scope.parameterDefaultValue_polArray = $scope.generateParameterValue_polArray($scope.baseIndicators); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_polArray, $scope.parameterDescription_polArray, $scope.parameterDataType, $scope.parameterDefaultValue_polArray, $scope.parameterNumericMinValue_polArray, $scope.parameterNumericMaxValue_polArray); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_aggregationOption, $scope.parameterDescription_aggregationOption, $scope.parameterDataType, $scope.aggregationOption.apiName, $scope.parameterNumericMinValue_aggregationOption, $scope.parameterNumericMaxValue_aggregationOption); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Berechnung durch Verkettung der Schritte $rank$, $Min-Max-Normalisierung$ und $Aggregation$ für alle Eingangsdaten
"; - var legendItemsHTML = "Eingehende Daten zur Leitindikatorberechnung:
"; - - var aggregationMethodHTML = "Aggregationsmethode: " + $scope.aggregationOption.displayName; - - formulaHTML += "$ "; - - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const indicatorMetadata = $scope.baseIndicators[index]; - var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); - - // we can use TEX code as we use MathJax library - legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; - if(index < $scope.baseIndicators.length - 1){ - legendItemsHTML+="
"; - } - } - - formulaHTML += " $"; - - kommonitorScriptHelperService.scriptFormulaHTML = legendItemsHTML + "

" + formulaHTML + "

" + aggregationMethodHTML; - - }; - - $scope.addBaseIndicator = function(tmpIndicatorSelection){ - - tmpIndicatorSelection.polarity = $scope.tmpIndicatorPolarity; - - kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); - $scope.baseIndicators.push(tmpIndicatorSelection); - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - $scope.removeBaseIndicator = function(baseIndicator){ - kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); - - var i; - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const element = $scope.baseIndicators[index]; - - if(baseIndicator.indicatorId == element.indicatorId){ - i = index; - break; - } - } - $scope.baseIndicators.splice(i, 1); - - //reset the one and only parameter in this case each time a base indicator is removed - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptHeadlineIndicatorController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_headline_indicator.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.baseIndicators = []; + $scope.polarityOptions = [ + { + "apiName": "regular", + "displayName": "normal [(value - min) / (max - min)]" + }, + { + "apiName": "inverted", + "displayName": "invertiert [1 - ((value - min) / (max - min))]" + } + ]; + $scope.tmpIndicatorPolarity = $scope.polarityOptions[0]; + $scope.aggregationOptions = [ + { + "apiName": "geomean", + "displayName": "Geometrisches Mittel" + }, + { + "apiName": "mean", + "displayName": "Arithmetrisches Mittel" + }, + { + "apiName": "min", + "displayName": "Minimum" + } + ]; + $scope.aggregationOption = $scope.aggregationOptions[0]; + $scope.fixProcessDescription = "Berechnung: Verknüpfung der (Basis-)Indikatoren zu einem Leitindikator durch Verkettung der Berechnungsschritte rank, Min-Max-Normalisierung (normal/invertiert), Aggregation (geometrisches" + + "Mittel, Mittelwert oder Minimalwert)
" + + "Eine Normierung der (Basis-)Indikatoren wird durch die Vergabe von Rangplätzen erreicht. Hierbei werden die Wertausprägungen aller Raumeinheiten für jeden (Basis-)Indikator in eine Rangfolge gebracht. Die Raumeinheit mit der inhaltlich am schlechtesten zu wertenden " + + "Ausprägung erhält dabei den Rang 1, wohingegen die Raumeinheit mit der besten Wertausprägung den " + + "höchsten Rang (n = Anzahl der Raumeinheiten) erhält. Um einen standardisierten Wertebereich zu erzeugen, " + + "werden die Werte der (Basis-)Indikator noch vor der Aggregation auf eine Skala von null bis 1 " + + "normiert, wobei der schlechteste Wert jeweils eine null erhält und der beste Wert eine 1 (Min/Max-Normierung). Anschließend können die Werte dann mit Hilfe des geeigneten Aggregationsverfahrens " + + "(geometrisches Mittel, Mittelwert oder Minimalwert) zum Leitindikator 1. Ordnung verknüpft werden. "; + $scope.parameterName_compArray = "COMPUTATION_ID_ARRAY"; + $scope.parameterDescription_compArray = "Komma-separierte Liste aller Indikatoren-IDs zur Leitindikatorbildung."; + $scope.parameterDefaultValue_compArray = undefined; + $scope.parameterNumericMinValue_compArray = 0; + $scope.parameterNumericMaxValue_compArray = 1; + $scope.parameterName_polArray = "COMPUTATION_POLARITY_ARRAY"; + $scope.parameterDescription_polArray = "Komma-separierte Liste aller Min-Max-Polaritäten der zugehörigen Indikatoren zur Leitindikatorbildung. Die Reihenfolge muss der Reihenfolge der Indikatoren-IDs des Parameters 'COMPUTATION_ID_ARRAY' entsprechen."; + $scope.parameterDefaultValue_polArray = 'regular'; + $scope.parameterNumericMinValue_polArray = 0; + $scope.parameterNumericMaxValue_polArray = 1; + $scope.parameterName_aggregationOption = "AGGREGATION_METHOD"; + $scope.parameterDescription_aggregationOption = "Angabe der Aggregationsmethode zur Leitindikatorbildung. Standard ist das geometrische Mittel."; + $scope.parameterDefaultValue_aggregationOption = "geomean"; + $scope.parameterNumericMinValue_aggregationOption = 0; + $scope.parameterNumericMaxValue_aggregationOption = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.generateParameterValue_compArray = function (requiredIndicatorsArray) { + var result = ""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result += indicatorMetadata.indicatorId; + if (index < requiredIndicatorsArray.length - 1) { + result += ","; + } + } + return result; + }; + $scope.generateParameterValue_polArray = function (requiredIndicatorsArray) { + var result = ""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result += indicatorMetadata.polarity.apiName; + if (index < requiredIndicatorsArray.length - 1) { + result += ","; + } + } + return result; + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue_compArray = $scope.generateParameterValue_compArray($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_compArray, $scope.parameterDescription_compArray, $scope.parameterDataType, $scope.parameterDefaultValue_compArray, $scope.parameterNumericMinValue_compArray, $scope.parameterNumericMaxValue_compArray); + $scope.parameterDefaultValue_polArray = $scope.generateParameterValue_polArray($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_polArray, $scope.parameterDescription_polArray, $scope.parameterDataType, $scope.parameterDefaultValue_polArray, $scope.parameterNumericMinValue_polArray, $scope.parameterNumericMaxValue_polArray); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_aggregationOption, $scope.parameterDescription_aggregationOption, $scope.parameterDataType, $scope.aggregationOption.apiName, $scope.parameterNumericMinValue_aggregationOption, $scope.parameterNumericMaxValue_aggregationOption); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Berechnung durch Verkettung der Schritte $rank$, $Min-Max-Normalisierung$ und $Aggregation$ für alle Eingangsdaten
"; + var legendItemsHTML = "Eingehende Daten zur Leitindikatorberechnung:
"; + var aggregationMethodHTML = "Aggregationsmethode: " + $scope.aggregationOption.displayName; + formulaHTML += "$ "; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + // we can use TEX code as we use MathJax library + legendItemsHTML += "$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if (index < $scope.baseIndicators.length - 1) { + legendItemsHTML += "
"; + } + } + formulaHTML += " $"; + kommonitorScriptHelperService.scriptFormulaHTML = legendItemsHTML + "

" + formulaHTML + "

" + aggregationMethodHTML; + }; + $scope.addBaseIndicator = function (tmpIndicatorSelection) { + tmpIndicatorSelection.polarity = $scope.tmpIndicatorPolarity; + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + $scope.removeBaseIndicator = function (baseIndicator) { + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + if (baseIndicator.indicatorId == element.indicatorId) { + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + } + ] }); +//# sourceMappingURL=script-headline-indicator.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.js.map new file mode 100644 index 000000000..9f24f317c --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-headline-indicator.component.js","sourceRoot":"","sources":["script-headline-indicator.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.ts new file mode 100644 index 000000000..982dbb032 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.component.ts @@ -0,0 +1,235 @@ +angular.module('scriptHeadlineIndicator').component('scriptHeadlineIndicator', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptHeadlineIndicatorController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_headline_indicator.js"; + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.baseIndicators = []; + + $scope.polarityOptions = [ + { + "apiName": "regular", + "displayName": "normal [(value - min) / (max - min)]" + }, + { + "apiName": "inverted", + "displayName": "invertiert [1 - ((value - min) / (max - min))]" + } + ]; + + $scope.tmpIndicatorPolarity = $scope.polarityOptions[0]; + + $scope.aggregationOptions = [ + { + "apiName": "geomean", + "displayName": "Geometrisches Mittel" + }, + { + "apiName": "mean", + "displayName": "Arithmetrisches Mittel" + }, + { + "apiName": "min", + "displayName": "Minimum" + } + ]; + + $scope.aggregationOption = $scope.aggregationOptions[0]; + + $scope.fixProcessDescription = "Berechnung: Verknüpfung der (Basis-)Indikatoren zu einem Leitindikator durch Verkettung der Berechnungsschritte rank, Min-Max-Normalisierung (normal/invertiert), Aggregation (geometrisches" + + "Mittel, Mittelwert oder Minimalwert)
" + + "Eine Normierung der (Basis-)Indikatoren wird durch die Vergabe von Rangplätzen erreicht. Hierbei werden die Wertausprägungen aller Raumeinheiten für jeden (Basis-)Indikator in eine Rangfolge gebracht. Die Raumeinheit mit der inhaltlich am schlechtesten zu wertenden " + + "Ausprägung erhält dabei den Rang 1, wohingegen die Raumeinheit mit der besten Wertausprägung den " + + "höchsten Rang (n = Anzahl der Raumeinheiten) erhält. Um einen standardisierten Wertebereich zu erzeugen, " + + "werden die Werte der (Basis-)Indikator noch vor der Aggregation auf eine Skala von null bis 1 " + + "normiert, wobei der schlechteste Wert jeweils eine null erhält und der beste Wert eine 1 (Min/Max-Normierung). Anschließend können die Werte dann mit Hilfe des geeigneten Aggregationsverfahrens " + + "(geometrisches Mittel, Mittelwert oder Minimalwert) zum Leitindikator 1. Ordnung verknüpft werden. "; + + + + + + + + $scope.parameterName_compArray = "COMPUTATION_ID_ARRAY"; + $scope.parameterDescription_compArray = "Komma-separierte Liste aller Indikatoren-IDs zur Leitindikatorbildung."; + $scope.parameterDefaultValue_compArray = undefined; + $scope.parameterNumericMinValue_compArray = 0; + $scope.parameterNumericMaxValue_compArray = 1; + + $scope.parameterName_polArray = "COMPUTATION_POLARITY_ARRAY"; + $scope.parameterDescription_polArray = "Komma-separierte Liste aller Min-Max-Polaritäten der zugehörigen Indikatoren zur Leitindikatorbildung. Die Reihenfolge muss der Reihenfolge der Indikatoren-IDs des Parameters 'COMPUTATION_ID_ARRAY' entsprechen."; + $scope.parameterDefaultValue_polArray = 'regular'; + $scope.parameterNumericMinValue_polArray = 0; + $scope.parameterNumericMaxValue_polArray = 1; + + $scope.parameterName_aggregationOption = "AGGREGATION_METHOD"; + $scope.parameterDescription_aggregationOption = "Angabe der Aggregationsmethode zur Leitindikatorbildung. Standard ist das geometrische Mittel."; + $scope.parameterDefaultValue_aggregationOption = "geomean"; + $scope.parameterNumericMinValue_aggregationOption = 0; + $scope.parameterNumericMaxValue_aggregationOption = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.generateParameterValue_compArray = function(requiredIndicatorsArray){ + + var result=""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result+=indicatorMetadata.indicatorId; + if(index < requiredIndicatorsArray.length - 1){ + result+=","; + } + } + + return result; + }; + + $scope.generateParameterValue_polArray = function(requiredIndicatorsArray){ + + var result=""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result+=indicatorMetadata.polarity.apiName; + if(index < requiredIndicatorsArray.length - 1){ + result+=","; + } + } + + return result; + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue_compArray = $scope.generateParameterValue_compArray($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_compArray, $scope.parameterDescription_compArray, $scope.parameterDataType, $scope.parameterDefaultValue_compArray, $scope.parameterNumericMinValue_compArray, $scope.parameterNumericMaxValue_compArray); + $scope.parameterDefaultValue_polArray = $scope.generateParameterValue_polArray($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_polArray, $scope.parameterDescription_polArray, $scope.parameterDataType, $scope.parameterDefaultValue_polArray, $scope.parameterNumericMinValue_polArray, $scope.parameterNumericMaxValue_polArray); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_aggregationOption, $scope.parameterDescription_aggregationOption, $scope.parameterDataType, $scope.aggregationOption.apiName, $scope.parameterNumericMinValue_aggregationOption, $scope.parameterNumericMaxValue_aggregationOption); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Berechnung durch Verkettung der Schritte $rank$, $Min-Max-Normalisierung$ und $Aggregation$ für alle Eingangsdaten
"; + var legendItemsHTML = "Eingehende Daten zur Leitindikatorberechnung:
"; + + var aggregationMethodHTML = "Aggregationsmethode: " + $scope.aggregationOption.displayName; + + formulaHTML += "$ "; + + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + + // we can use TEX code as we use MathJax library + legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if(index < $scope.baseIndicators.length - 1){ + legendItemsHTML+="
"; + } + } + + formulaHTML += " $"; + + kommonitorScriptHelperService.scriptFormulaHTML = legendItemsHTML + "

" + formulaHTML + "

" + aggregationMethodHTML; + + }; + + $scope.addBaseIndicator = function(tmpIndicatorSelection){ + + tmpIndicatorSelection.polarity = $scope.tmpIndicatorPolarity; + + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + $scope.removeBaseIndicator = function(baseIndicator){ + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + + if(baseIndicator.indicatorId == element.indicatorId){ + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.js index 5438cb0d7..e8ea277a9 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptHeadlineIndicator', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-headline-indicator.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.js.map new file mode 100644 index 000000000..3210e0d96 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-headline-indicator.module.js","sourceRoot":"","sources":["script-headline-indicator.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.ts new file mode 100644 index 000000000..5438cb0d7 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/headlineIndicator/script-headline-indicator.module.ts @@ -0,0 +1 @@ +angular.module('scriptHeadlineIndicator', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.js index ac37951d5..881fc187f 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.js @@ -1,304 +1,269 @@ +"use strict"; angular.module('scriptLineSegmentInPolygon').component('scriptLineSegmentInPolygon', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - 'kommonitorCacheHelperService', - function ScriptLineSegmentInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, - $http, __env, $timeout, kommonitorCacheHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js"; - - $scope.propertySchema = {}; - $scope.propertyOptions = undefined; - $scope.propertyValueOptions = undefined; - - $scope.georesourceSelection = undefined; - $scope.georesourceSelection_old = undefined; - - // parameter for georesource dataset - $scope.parameterName_computationGeoresource = "compGeoId"; - $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Liniendatensatzes."; - $scope.parameterDefaultValue_computationGeoresource = undefined; - $scope.parameterNumericMinValue_computationGeoresource = 0; - $scope.parameterNumericMaxValue_computationGeoresource = 1; - - // parameter for object property name - $scope.parameterName_computationFilterProperty = "compFilterProp"; - $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; - $scope.parameterDefaultValue_computationFilterProperty = undefined; - $scope.parameterNumericMinValue_computationFilterProperty = 0; - $scope.parameterNumericMaxValue_computationFilterProperty = 1; - - // parameter for logical operator - $scope.parameterName_computationFilterOperator = "compFilterOperator"; - $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; - $scope.parameterDefaultValue_computationFilterOperator = undefined; - $scope.parameterNumericMinValue_computationFilterOperator = 0; - $scope.parameterNumericMaxValue_computationFilterOperator = 1; - - // parameter for property value - $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; - $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; - $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; - $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; - $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; - - // parameter for property value - $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; - $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - $scope.propertyValueSelection = []; - - $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; - $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; - $scope.dropdownEvents = { - onSelectionChanged: function() { - $scope.onChangePropertyValue(); - } - }; - - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeGeoresource = function(georesourceSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.georesourceSelection_old){ - kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); - } - kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); - - $scope.georesourceSelection_old = georesourceSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetGeoresourceParameter(); - $scope.resetPropertyOptions(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangePropertyName = function(){ - $scope.resetScriptParameter_filterPropertyName(); - $scope.resetComputationFormulaAndLegend(); - $scope.filterOperatorOptions(); - $scope.resetPropertyValueOptions(); - if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { - $scope.propertyValueSelection = []; - } - }; - - $scope.onChangeOperatorOption = function(){ - if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { - $scope.propertyValueSelection = []; - } - $scope.resetScriptParameter_operator(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangePropertyValue = function(){ - $scope.resetScriptParameter_filterPropertyValue(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter_computationGeoresource = function(georesourceMetadata){ - - return georesourceMetadata.georesourceId; - }; - - $scope.resetGeoresourceParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); - $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); - }; - - $scope.resetPropertyOptions = function(){ - kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) - .then((schema) => { - for (var prop in schema) { - if (schema[prop] !== 'Date') { - $scope.propertySchema[prop] = schema[prop]; - } - } - $scope.propertyOptions = Object.keys($scope.propertySchema); - }); - }; - - $scope.resetScriptParameter_filterPropertyName = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); - $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); - }; - - $scope.filterOperatorOptions = function(){ - if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String"){ - $scope.operatorOptions = [ - { - "apiName": "Equal", - "displayName": "gleich (=)", - }, - { - "apiName": "Unequal", - "displayName": "ungleich (!=)", - }, - { - "apiName": "Contains", - "displayName": "enthält (kommaseparierte Liste)", - } - ]; - } else { - $scope.operatorOptions = [ - { - "apiName": "Equal", - "displayName": "gleich (=)", - }, - { - "apiName": "Greater_than", - "displayName": "größer als (>)", - }, - { - "apiName": "Greater_than_or_equal", - "displayName": "größer als oder gleich (>=)", - }, - { - "apiName": "Less_than", - "displayName": "kleiner als (<)", - }, - { - "apiName": "Less_than_or_equal", - "displayName": "kleiner als oder gleich (<=)", - }, - { - "apiName": "Unequal", - "displayName": "ungleich (!=)", - }, - { - "apiName": "Range", - "displayName": "Wertebereich (>=untere Grenze & { - var data = dataTable; - var tmpArray = data.map(item => { - let value = item[$scope.parameterDefaultValue_computationFilterProperty]; - return value; - }); - if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { - // sort strings - $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); - } else { - // sort numbers - $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function(a,b){ - return a - b; - }); - } - }); - }; - - $scope.filterPropertyValueRange_toOptions = function() { - return function(item) { - if (item > $scope.propertyValueRange_from) { - return true; - } - return false; - }; - }; - - $scope.resetScriptParameter_filterPropertyValue = function() { - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); - if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { - $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; - } else { - $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); - } - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - var formulaHTML = ""; - if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; - if ($scope.operator.apiName === "Range") { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' im " + "Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; - } - if ($scope.operator.apiName === "Contains") { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; - } - } - else { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature"; - } - var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - }; - - $scope.onChangePropertyValueRange_range = function() { - $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; - $scope.resetScriptParameter_filterPropertyValue(); - $scope.resetComputationFormulaAndLegend(); - }; - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + 'kommonitorCacheHelperService', + function ScriptLineSegmentInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorCacheHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js"; + $scope.propertySchema = {}; + $scope.propertyOptions = undefined; + $scope.propertyValueOptions = undefined; + $scope.georesourceSelection = undefined; + $scope.georesourceSelection_old = undefined; + // parameter for georesource dataset + $scope.parameterName_computationGeoresource = "compGeoId"; + $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Liniendatensatzes."; + $scope.parameterDefaultValue_computationGeoresource = undefined; + $scope.parameterNumericMinValue_computationGeoresource = 0; + $scope.parameterNumericMaxValue_computationGeoresource = 1; + // parameter for object property name + $scope.parameterName_computationFilterProperty = "compFilterProp"; + $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; + $scope.parameterDefaultValue_computationFilterProperty = undefined; + $scope.parameterNumericMinValue_computationFilterProperty = 0; + $scope.parameterNumericMaxValue_computationFilterProperty = 1; + // parameter for logical operator + $scope.parameterName_computationFilterOperator = "compFilterOperator"; + $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; + $scope.parameterDefaultValue_computationFilterOperator = undefined; + $scope.parameterNumericMinValue_computationFilterOperator = 0; + $scope.parameterNumericMaxValue_computationFilterOperator = 1; + // parameter for property value + $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; + $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; + $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; + $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; + $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; + // parameter for property value + $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; + $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + $scope.propertyValueSelection = []; + $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; + $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; + $scope.dropdownEvents = { + onSelectionChanged: function () { + $scope.onChangePropertyValue(); + } + }; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeGeoresource = function (georesourceSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.georesourceSelection_old) { + kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); + } + kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); + $scope.georesourceSelection_old = georesourceSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetGeoresourceParameter(); + $scope.resetPropertyOptions(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangePropertyName = function () { + $scope.resetScriptParameter_filterPropertyName(); + $scope.resetComputationFormulaAndLegend(); + $scope.filterOperatorOptions(); + $scope.resetPropertyValueOptions(); + if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { + $scope.propertyValueSelection = []; + } + }; + $scope.onChangeOperatorOption = function () { + if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { + $scope.propertyValueSelection = []; + } + $scope.resetScriptParameter_operator(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangePropertyValue = function () { + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter_computationGeoresource = function (georesourceMetadata) { + return georesourceMetadata.georesourceId; + }; + $scope.resetGeoresourceParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); + $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); + }; + $scope.resetPropertyOptions = function () { + kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) + .then((schema) => { + for (var prop in schema) { + if (schema[prop] !== 'Date') { + $scope.propertySchema[prop] = schema[prop]; + } + } + $scope.propertyOptions = Object.keys($scope.propertySchema); + }); + }; + $scope.resetScriptParameter_filterPropertyName = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); + $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); + }; + $scope.filterOperatorOptions = function () { + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String") { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Contains", + "displayName": "enthält (kommaseparierte Liste)", + } + ]; + } + else { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Greater_than", + "displayName": "größer als (>)", + }, + { + "apiName": "Greater_than_or_equal", + "displayName": "größer als oder gleich (>=)", + }, + { + "apiName": "Less_than", + "displayName": "kleiner als (<)", + }, + { + "apiName": "Less_than_or_equal", + "displayName": "kleiner als oder gleich (<=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Range", + "displayName": "Wertebereich (>=untere Grenze & { + var data = dataTable; + var tmpArray = data.map(item => { + let value = item[$scope.parameterDefaultValue_computationFilterProperty]; + return value; + }); + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { + // sort strings + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); + } + else { + // sort numbers + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function (a, b) { + return a - b; + }); + } + }); + }; + $scope.filterPropertyValueRange_toOptions = function () { + return function (item) { + if (item > $scope.propertyValueRange_from) { + return true; + } + return false; + }; + }; + $scope.resetScriptParameter_filterPropertyValue = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); + if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; + } + else { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = ""; + if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; + if ($scope.operator.apiName === "Range") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' im " + "Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; + } + if ($scope.operator.apiName === "Contains") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; + } + } + else { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature"; + } + var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.onChangePropertyValueRange_range = function () { + $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + } + ] }); +//# sourceMappingURL=script-line-segment-in-polygon.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.js.map new file mode 100644 index 000000000..68ece5160 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-line-segment-in-polygon.component.js","sourceRoot":"","sources":["script-line-segment-in-polygon.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.ts new file mode 100644 index 000000000..ac37951d5 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.component.ts @@ -0,0 +1,304 @@ +angular.module('scriptLineSegmentInPolygon').component('scriptLineSegmentInPolygon', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + 'kommonitorCacheHelperService', + function ScriptLineSegmentInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, + $http, __env, $timeout, kommonitorCacheHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js"; + + $scope.propertySchema = {}; + $scope.propertyOptions = undefined; + $scope.propertyValueOptions = undefined; + + $scope.georesourceSelection = undefined; + $scope.georesourceSelection_old = undefined; + + // parameter for georesource dataset + $scope.parameterName_computationGeoresource = "compGeoId"; + $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Liniendatensatzes."; + $scope.parameterDefaultValue_computationGeoresource = undefined; + $scope.parameterNumericMinValue_computationGeoresource = 0; + $scope.parameterNumericMaxValue_computationGeoresource = 1; + + // parameter for object property name + $scope.parameterName_computationFilterProperty = "compFilterProp"; + $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; + $scope.parameterDefaultValue_computationFilterProperty = undefined; + $scope.parameterNumericMinValue_computationFilterProperty = 0; + $scope.parameterNumericMaxValue_computationFilterProperty = 1; + + // parameter for logical operator + $scope.parameterName_computationFilterOperator = "compFilterOperator"; + $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; + $scope.parameterDefaultValue_computationFilterOperator = undefined; + $scope.parameterNumericMinValue_computationFilterOperator = 0; + $scope.parameterNumericMaxValue_computationFilterOperator = 1; + + // parameter for property value + $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; + $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; + $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; + $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; + $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; + + // parameter for property value + $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; + $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + $scope.propertyValueSelection = []; + + $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; + $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; + $scope.dropdownEvents = { + onSelectionChanged: function() { + $scope.onChangePropertyValue(); + } + }; + + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeGeoresource = function(georesourceSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.georesourceSelection_old){ + kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); + } + kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); + + $scope.georesourceSelection_old = georesourceSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetGeoresourceParameter(); + $scope.resetPropertyOptions(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangePropertyName = function(){ + $scope.resetScriptParameter_filterPropertyName(); + $scope.resetComputationFormulaAndLegend(); + $scope.filterOperatorOptions(); + $scope.resetPropertyValueOptions(); + if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { + $scope.propertyValueSelection = []; + } + }; + + $scope.onChangeOperatorOption = function(){ + if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { + $scope.propertyValueSelection = []; + } + $scope.resetScriptParameter_operator(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangePropertyValue = function(){ + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter_computationGeoresource = function(georesourceMetadata){ + + return georesourceMetadata.georesourceId; + }; + + $scope.resetGeoresourceParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); + $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); + }; + + $scope.resetPropertyOptions = function(){ + kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) + .then((schema) => { + for (var prop in schema) { + if (schema[prop] !== 'Date') { + $scope.propertySchema[prop] = schema[prop]; + } + } + $scope.propertyOptions = Object.keys($scope.propertySchema); + }); + }; + + $scope.resetScriptParameter_filterPropertyName = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); + $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); + }; + + $scope.filterOperatorOptions = function(){ + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String"){ + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Contains", + "displayName": "enthält (kommaseparierte Liste)", + } + ]; + } else { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Greater_than", + "displayName": "größer als (>)", + }, + { + "apiName": "Greater_than_or_equal", + "displayName": "größer als oder gleich (>=)", + }, + { + "apiName": "Less_than", + "displayName": "kleiner als (<)", + }, + { + "apiName": "Less_than_or_equal", + "displayName": "kleiner als oder gleich (<=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Range", + "displayName": "Wertebereich (>=untere Grenze & { + var data = dataTable; + var tmpArray = data.map(item => { + let value = item[$scope.parameterDefaultValue_computationFilterProperty]; + return value; + }); + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { + // sort strings + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); + } else { + // sort numbers + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function(a,b){ + return a - b; + }); + } + }); + }; + + $scope.filterPropertyValueRange_toOptions = function() { + return function(item) { + if (item > $scope.propertyValueRange_from) { + return true; + } + return false; + }; + }; + + $scope.resetScriptParameter_filterPropertyValue = function() { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); + if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; + } else { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = ""; + if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; + if ($scope.operator.apiName === "Range") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' im " + "Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; + } + if ($scope.operator.apiName === "Contains") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; + } + } + else { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Summierte Linienlänge des Datensatzes G1 pro Raumeinheits-Feature"; + } + var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + + $scope.onChangePropertyValueRange_range = function() { + $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.js index c904b4158..687b5a2a8 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.js @@ -1,2 +1,4 @@ +"use strict"; angular.module('scriptLineSegmentInPolygon', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'angularjs-dropdown-multiselect', 'kommonitorCacheHelper']); +//# sourceMappingURL=script-line-segment-in-polygon.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.js.map new file mode 100644 index 000000000..87440f8e2 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-line-segment-in-polygon.module.js","sourceRoot":"","sources":["script-line-segment-in-polygon.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,gCAAgC;IAC9H,uBAAuB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.ts new file mode 100644 index 000000000..c904b4158 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/lineSegmentInPolygon/script-line-segment-in-polygon.module.ts @@ -0,0 +1,2 @@ +angular.module('scriptLineSegmentInPolygon', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'angularjs-dropdown-multiselect', + 'kommonitorCacheHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.js index 0ae39dc08..bb8af6c89 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.js @@ -1,159 +1,125 @@ +"use strict"; angular.module('scriptMultiplication').component('scriptMultiplication', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptMultiplicationController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_multiply.js"; - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.baseIndicators = []; - - $scope.parameterName = "COMPUTATION_ID"; - $scope.parameterDescription = "Komma-separierte Liste aller Indikatoren-IDs zur Multiplikation."; - $scope.parameterDefaultValue = undefined; - $scope.parameterNumericMinValue = 0; - $scope.parameterNumericMaxValue = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.generateParameterValue = function(requiredIndicatorsArray){ - - var result=""; - for (let index = 0; index < requiredIndicatorsArray.length; index++) { - const indicatorMetadata = requiredIndicatorsArray[index]; - result+=indicatorMetadata.indicatorId; - if(index < requiredIndicatorsArray.length - 1){ - result+=","; - } - } - - return result; - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - $scope.parameterDefaultValue = $scope.generateParameterValue($scope.baseIndicators); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName, $scope.parameterDescription, $scope.parameterDataType, $scope.parameterDefaultValue, $scope.parameterNumericMinValue, $scope.parameterNumericMaxValue); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Berechnung gemäß Formel
"; - var legendItemsHTML = "Legende zur Formel
"; - - formulaHTML += "$ "; - - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const indicatorMetadata = $scope.baseIndicators[index]; - var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); - - // we can use TEX code as we use MathJax library - formulaHTML+=letterValue; - legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; - if(index < $scope.baseIndicators.length - 1){ - formulaHTML+=" \\times "; - legendItemsHTML+="
"; - } - } - - formulaHTML += " $"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - $scope.addBaseIndicator = function(tmpIndicatorSelection){ - - kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); - $scope.baseIndicators.push(tmpIndicatorSelection); - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - $scope.removeBaseIndicator = function(baseIndicator){ - kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); - - var i; - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const element = $scope.baseIndicators[index]; - - if(baseIndicator.indicatorId == element.indicatorId){ - i = index; - break; - } - } - $scope.baseIndicators.splice(i, 1); - - //reset the one and only parameter in this case each time a base indicator is removed - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptMultiplicationController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_multiply.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.baseIndicators = []; + $scope.parameterName = "COMPUTATION_ID"; + $scope.parameterDescription = "Komma-separierte Liste aller Indikatoren-IDs zur Multiplikation."; + $scope.parameterDefaultValue = undefined; + $scope.parameterNumericMinValue = 0; + $scope.parameterNumericMaxValue = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.generateParameterValue = function (requiredIndicatorsArray) { + var result = ""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result += indicatorMetadata.indicatorId; + if (index < requiredIndicatorsArray.length - 1) { + result += ","; + } + } + return result; + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue = $scope.generateParameterValue($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName, $scope.parameterDescription, $scope.parameterDataType, $scope.parameterDefaultValue, $scope.parameterNumericMinValue, $scope.parameterNumericMaxValue); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + formulaHTML += "$ "; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + // we can use TEX code as we use MathJax library + formulaHTML += letterValue; + legendItemsHTML += "$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if (index < $scope.baseIndicators.length - 1) { + formulaHTML += " \\times "; + legendItemsHTML += "
"; + } + } + formulaHTML += " $"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.addBaseIndicator = function (tmpIndicatorSelection) { + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + $scope.removeBaseIndicator = function (baseIndicator) { + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + if (baseIndicator.indicatorId == element.indicatorId) { + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + } + ] }); +//# sourceMappingURL=script-multiplication.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.js.map new file mode 100644 index 000000000..ac80d20e7 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-multiplication.component.js","sourceRoot":"","sources":["script-multiplication.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.ts new file mode 100644 index 000000000..0ae39dc08 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.component.ts @@ -0,0 +1,159 @@ +angular.module('scriptMultiplication').component('scriptMultiplication', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptMultiplicationController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_multiply.js"; + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.baseIndicators = []; + + $scope.parameterName = "COMPUTATION_ID"; + $scope.parameterDescription = "Komma-separierte Liste aller Indikatoren-IDs zur Multiplikation."; + $scope.parameterDefaultValue = undefined; + $scope.parameterNumericMinValue = 0; + $scope.parameterNumericMaxValue = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.generateParameterValue = function(requiredIndicatorsArray){ + + var result=""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result+=indicatorMetadata.indicatorId; + if(index < requiredIndicatorsArray.length - 1){ + result+=","; + } + } + + return result; + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue = $scope.generateParameterValue($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName, $scope.parameterDescription, $scope.parameterDataType, $scope.parameterDefaultValue, $scope.parameterNumericMinValue, $scope.parameterNumericMaxValue); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + + formulaHTML += "$ "; + + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + + // we can use TEX code as we use MathJax library + formulaHTML+=letterValue; + legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if(index < $scope.baseIndicators.length - 1){ + formulaHTML+=" \\times "; + legendItemsHTML+="
"; + } + } + + formulaHTML += " $"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + $scope.addBaseIndicator = function(tmpIndicatorSelection){ + + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + $scope.removeBaseIndicator = function(baseIndicator){ + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + + if(baseIndicator.indicatorId == element.indicatorId){ + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.js index 1a2334421..d9d09fdec 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptMultiplication', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-multiplication.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.js.map new file mode 100644 index 000000000..b5601c876 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-multiplication.module.js","sourceRoot":"","sources":["script-multiplication.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.ts new file mode 100644 index 000000000..1a2334421 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/multiplication/script-multiplication.module.ts @@ -0,0 +1 @@ +angular.module('scriptMultiplication', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.js index 022662deb..36060ad12 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.js @@ -1,190 +1,149 @@ +"use strict"; angular.module('scriptPercentage').component('scriptPercentage', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptPercentagetroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_percentage.js"; - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.baseIndicators = []; - - $scope.refIndicatorSelection = undefined; - $scope.refIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicators = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; - $scope.parameterDefaultValue_computationIndicators = undefined; - $scope.parameterNumericMinValue_computationIndicators = 0; - $scope.parameterNumericMaxValue_computationIndicators = 1; - - $scope.parameterName_referenceIndicator = "REFERENCE_ID"; - $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; - $scope.parameterDefaultValue_referenceIndicator = undefined; - $scope.parameterNumericMinValue_referenceIndicator = 0; - $scope.parameterNumericMaxValue_referenceIndicator = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); - kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); - - $scope.refIndicatorSelection_old = refIndicatorSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetRefIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.resetScriptParameter_computationIndicators = function(requiredIndicatorsArray){ - - var result=""; - for (let index = 0; index < requiredIndicatorsArray.length; index++) { - const indicatorMetadata = requiredIndicatorsArray[index]; - result+=indicatorMetadata.indicatorId; - if(index < requiredIndicatorsArray.length - 1){ - result+=","; - } - } - - return result; - }; - - $scope.resetComputationIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); - $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); - }; - - $scope.resetRefIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); - $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Berechnung gemäß Formel
"; - var legendItemsHTML = "Legende zur Formel
"; - - // referenceIndicator - formulaHTML+="$$ \\frac{ "; - - // baseIndicators / computationIndicators - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const indicatorMetadata = $scope.baseIndicators[index]; - var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); - - // we can use TEX code as we use MathJax library - formulaHTML+=letterValue; - legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; - if(index < $scope.baseIndicators.length - 1){ - formulaHTML+=" + "; - legendItemsHTML+="
"; - } - } - - formulaHTML += "}{ I_{ref}} \\times 100 $$"; - legendItemsHTML+="
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - $scope.addBaseIndicator = function(tmpIndicatorSelection){ - - kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); - $scope.baseIndicators.push(tmpIndicatorSelection); - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetComputationIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - $scope.removeBaseIndicator = function(baseIndicator){ - kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); - - var i; - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const element = $scope.baseIndicators[index]; - - if(baseIndicator.indicatorId == element.indicatorId){ - i = index; - break; - } - } - $scope.baseIndicators.splice(i, 1); - - //reset the one and only parameter in this case each time a base indicator is removed - $scope.resetComputationIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptPercentagetroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_percentage.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.baseIndicators = []; + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicators = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + $scope.parameterName_referenceIndicator = "REFERENCE_ID"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeReferenceIndicator = function (refIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + $scope.refIndicatorSelection_old = refIndicatorSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter_computationIndicators = function (requiredIndicatorsArray) { + var result = ""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result += indicatorMetadata.indicatorId; + if (index < requiredIndicatorsArray.length - 1) { + result += ","; + } + } + return result; + }; + $scope.resetComputationIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + $scope.resetRefIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + // referenceIndicator + formulaHTML += "$$ \\frac{ "; + // baseIndicators / computationIndicators + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + // we can use TEX code as we use MathJax library + formulaHTML += letterValue; + legendItemsHTML += "$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if (index < $scope.baseIndicators.length - 1) { + formulaHTML += " + "; + legendItemsHTML += "
"; + } + } + formulaHTML += "}{ I_{ref}} \\times 100 $$"; + legendItemsHTML += "
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.addBaseIndicator = function (tmpIndicatorSelection) { + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + $scope.removeBaseIndicator = function (baseIndicator) { + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + if (baseIndicator.indicatorId == element.indicatorId) { + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + } + ] }); +//# sourceMappingURL=script-percentage.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.js.map new file mode 100644 index 000000000..20832b506 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-percentage.component.js","sourceRoot":"","sources":["script-percentage.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.ts new file mode 100644 index 000000000..022662deb --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.component.ts @@ -0,0 +1,190 @@ +angular.module('scriptPercentage').component('scriptPercentage', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptPercentagetroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_percentage.js"; + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.baseIndicators = []; + + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicators = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + + $scope.parameterName_referenceIndicator = "REFERENCE_ID"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + + $scope.refIndicatorSelection_old = refIndicatorSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.resetScriptParameter_computationIndicators = function(requiredIndicatorsArray){ + + var result=""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result+=indicatorMetadata.indicatorId; + if(index < requiredIndicatorsArray.length - 1){ + result+=","; + } + } + + return result; + }; + + $scope.resetComputationIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + + $scope.resetRefIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + + // referenceIndicator + formulaHTML+="$$ \\frac{ "; + + // baseIndicators / computationIndicators + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + + // we can use TEX code as we use MathJax library + formulaHTML+=letterValue; + legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if(index < $scope.baseIndicators.length - 1){ + formulaHTML+=" + "; + legendItemsHTML+="
"; + } + } + + formulaHTML += "}{ I_{ref}} \\times 100 $$"; + legendItemsHTML+="
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + $scope.addBaseIndicator = function(tmpIndicatorSelection){ + + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + $scope.removeBaseIndicator = function(baseIndicator){ + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + + if(baseIndicator.indicatorId == element.indicatorId){ + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.js index 638b0f202..82d524e12 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptPercentage', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-percentage.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.js.map new file mode 100644 index 000000000..cf2d65a13 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-percentage.module.js","sourceRoot":"","sources":["script-percentage.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.ts new file mode 100644 index 000000000..638b0f202 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/percentage/script-percentage.module.ts @@ -0,0 +1 @@ +angular.module('scriptPercentage', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.js index 72f4147ea..0378952d1 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.js @@ -1,304 +1,269 @@ +"use strict"; angular.module('scriptPointsInPolygon').component('scriptPointsInPolygon', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - 'kommonitorCacheHelperService', - function ScriptPointsInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, - $http, __env, $timeout, kommonitorCacheHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js"; - - $scope.propertySchema = {}; - $scope.propertyOptions = undefined; - $scope.propertyValueOptions = undefined; - - $scope.georesourceSelection = undefined; - $scope.georesourceSelection_old = undefined; - - // parameter for georesource dataset - $scope.parameterName_computationGeoresource = "compGeoId"; - $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; - $scope.parameterDefaultValue_computationGeoresource = undefined; - $scope.parameterNumericMinValue_computationGeoresource = 0; - $scope.parameterNumericMaxValue_computationGeoresource = 1; - - // parameter for object property name - $scope.parameterName_computationFilterProperty = "compFilterProp"; - $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; - $scope.parameterDefaultValue_computationFilterProperty = undefined; - $scope.parameterNumericMinValue_computationFilterProperty = 0; - $scope.parameterNumericMaxValue_computationFilterProperty = 1; - - // parameter for logical operator - $scope.parameterName_computationFilterOperator = "compFilterOperator"; - $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; - $scope.parameterDefaultValue_computationFilterOperator = undefined; - $scope.parameterNumericMinValue_computationFilterOperator = 0; - $scope.parameterNumericMaxValue_computationFilterOperator = 1; - - // parameter for property value - $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; - $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; - $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; - $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; - $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; - - // parameter for property value - $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; - $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - $scope.propertyValueSelection = []; - - $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; - $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; - $scope.dropdownEvents = { - onSelectionChanged: function() { - $scope.onChangePropertyValue(); - } - }; - - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeGeoresource = function(georesourceSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.georesourceSelection_old){ - kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); - } - kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); - - $scope.georesourceSelection_old = georesourceSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetGeoresourceParameter(); - $scope.resetPropertyOptions(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangePropertyName = function(){ - $scope.resetScriptParameter_filterPropertyName(); - $scope.resetComputationFormulaAndLegend(); - $scope.filterOperatorOptions(); - $scope.resetPropertyValueOptions(); - if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { - $scope.propertyValueSelection = []; - } - }; - - $scope.onChangeOperatorOption = function(){ - if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { - $scope.propertyValueSelection = []; - } - $scope.resetScriptParameter_operator(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangePropertyValue = function(){ - $scope.resetScriptParameter_filterPropertyValue(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter_computationGeoresource = function(georesourceMetadata){ - - return georesourceMetadata.georesourceId; - }; - - $scope.resetGeoresourceParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); - $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); - }; - - $scope.resetPropertyOptions = function(){ - kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) - .then((schema) => { - for (var prop in schema) { - if (schema[prop] !== 'Date') { - $scope.propertySchema[prop] = schema[prop]; - } - } - $scope.propertyOptions = Object.keys($scope.propertySchema); - }); - }; - - $scope.resetScriptParameter_filterPropertyName = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); - $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); - }; - - $scope.filterOperatorOptions = function(){ - if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String"){ - $scope.operatorOptions = [ - { - "apiName": "Equal", - "displayName": "gleich (=)", - }, - { - "apiName": "Unequal", - "displayName": "ungleich (!=)", - }, - { - "apiName": "Contains", - "displayName": "enthält (kommaseparierte Liste)", - } - ]; - } else { - $scope.operatorOptions = [ - { - "apiName": "Equal", - "displayName": "gleich (=)", - }, - { - "apiName": "Greater_than", - "displayName": "größer als (>)", - }, - { - "apiName": "Greater_than_or_equal", - "displayName": "größer als oder gleich (>=)", - }, - { - "apiName": "Less_than", - "displayName": "kleiner als (<)", - }, - { - "apiName": "Less_than_or_equal", - "displayName": "kleiner als oder gleich (<=)", - }, - { - "apiName": "Unequal", - "displayName": "ungleich (!=)", - }, - { - "apiName": "Range", - "displayName": "Wertebereich (>=untere Grenze & { - var data = dataTable; - var tmpArray = data.map(item => { - let value = item[$scope.parameterDefaultValue_computationFilterProperty]; - return value; - }); - if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { - // sort strings - $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); - } else { - // sort numbers - $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function(a,b){ - return a - b; - }); - } - }); - }; - - $scope.filterPropertyValueRange_toOptions = function() { - return function(item) { - if (item > $scope.propertyValueRange_from) { - return true; - } - return false; - }; - }; - - $scope.resetScriptParameter_filterPropertyValue = function() { - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); - if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { - $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; - } else { - $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); - } - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - var formulaHTML = ""; - if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; - if ($scope.operator.apiName === "Range") { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' im " + "Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; - } - if ($scope.operator.apiName === "Contains") { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; - } - } - else { - formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature"; - } - var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - }; - - $scope.onChangePropertyValueRange_range = function() { - $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; - $scope.resetScriptParameter_filterPropertyValue(); - $scope.resetComputationFormulaAndLegend(); - }; - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + 'kommonitorCacheHelperService', + function ScriptPointsInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorCacheHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js"; + $scope.propertySchema = {}; + $scope.propertyOptions = undefined; + $scope.propertyValueOptions = undefined; + $scope.georesourceSelection = undefined; + $scope.georesourceSelection_old = undefined; + // parameter for georesource dataset + $scope.parameterName_computationGeoresource = "compGeoId"; + $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; + $scope.parameterDefaultValue_computationGeoresource = undefined; + $scope.parameterNumericMinValue_computationGeoresource = 0; + $scope.parameterNumericMaxValue_computationGeoresource = 1; + // parameter for object property name + $scope.parameterName_computationFilterProperty = "compFilterProp"; + $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; + $scope.parameterDefaultValue_computationFilterProperty = undefined; + $scope.parameterNumericMinValue_computationFilterProperty = 0; + $scope.parameterNumericMaxValue_computationFilterProperty = 1; + // parameter for logical operator + $scope.parameterName_computationFilterOperator = "compFilterOperator"; + $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; + $scope.parameterDefaultValue_computationFilterOperator = undefined; + $scope.parameterNumericMinValue_computationFilterOperator = 0; + $scope.parameterNumericMaxValue_computationFilterOperator = 1; + // parameter for property value + $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; + $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; + $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; + $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; + $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; + // parameter for property value + $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; + $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + $scope.propertyValueSelection = []; + $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; + $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; + $scope.dropdownEvents = { + onSelectionChanged: function () { + $scope.onChangePropertyValue(); + } + }; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeGeoresource = function (georesourceSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.georesourceSelection_old) { + kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); + } + kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); + $scope.georesourceSelection_old = georesourceSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetGeoresourceParameter(); + $scope.resetPropertyOptions(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangePropertyName = function () { + $scope.resetScriptParameter_filterPropertyName(); + $scope.resetComputationFormulaAndLegend(); + $scope.filterOperatorOptions(); + $scope.resetPropertyValueOptions(); + if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { + $scope.propertyValueSelection = []; + } + }; + $scope.onChangeOperatorOption = function () { + if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { + $scope.propertyValueSelection = []; + } + $scope.resetScriptParameter_operator(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangePropertyValue = function () { + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter_computationGeoresource = function (georesourceMetadata) { + return georesourceMetadata.georesourceId; + }; + $scope.resetGeoresourceParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); + $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); + }; + $scope.resetPropertyOptions = function () { + kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) + .then((schema) => { + for (var prop in schema) { + if (schema[prop] !== 'Date') { + $scope.propertySchema[prop] = schema[prop]; + } + } + $scope.propertyOptions = Object.keys($scope.propertySchema); + }); + }; + $scope.resetScriptParameter_filterPropertyName = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); + $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); + }; + $scope.filterOperatorOptions = function () { + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String") { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Contains", + "displayName": "enthält (kommaseparierte Liste)", + } + ]; + } + else { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Greater_than", + "displayName": "größer als (>)", + }, + { + "apiName": "Greater_than_or_equal", + "displayName": "größer als oder gleich (>=)", + }, + { + "apiName": "Less_than", + "displayName": "kleiner als (<)", + }, + { + "apiName": "Less_than_or_equal", + "displayName": "kleiner als oder gleich (<=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Range", + "displayName": "Wertebereich (>=untere Grenze & { + var data = dataTable; + var tmpArray = data.map(item => { + let value = item[$scope.parameterDefaultValue_computationFilterProperty]; + return value; + }); + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { + // sort strings + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); + } + else { + // sort numbers + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function (a, b) { + return a - b; + }); + } + }); + }; + $scope.filterPropertyValueRange_toOptions = function () { + return function (item) { + if (item > $scope.propertyValueRange_from) { + return true; + } + return false; + }; + }; + $scope.resetScriptParameter_filterPropertyValue = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); + if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; + } + else { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = ""; + if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; + if ($scope.operator.apiName === "Range") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' im " + "Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; + } + if ($scope.operator.apiName === "Contains") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; + } + } + else { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature"; + } + var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.onChangePropertyValueRange_range = function () { + $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + } + ] }); +//# sourceMappingURL=script-points-in-polygon.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.js.map new file mode 100644 index 000000000..f186d336b --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-points-in-polygon.component.js","sourceRoot":"","sources":["script-points-in-polygon.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.ts new file mode 100644 index 000000000..72f4147ea --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.component.ts @@ -0,0 +1,304 @@ +angular.module('scriptPointsInPolygon').component('scriptPointsInPolygon', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + 'kommonitorCacheHelperService', + function ScriptPointsInPolygonController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, + $http, __env, $timeout, kommonitorCacheHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js"; + + $scope.propertySchema = {}; + $scope.propertyOptions = undefined; + $scope.propertyValueOptions = undefined; + + $scope.georesourceSelection = undefined; + $scope.georesourceSelection_old = undefined; + + // parameter for georesource dataset + $scope.parameterName_computationGeoresource = "compGeoId"; + $scope.parameterDescription_computationGeoresource = "Georessourcen ID des Punktdatensatzes."; + $scope.parameterDefaultValue_computationGeoresource = undefined; + $scope.parameterNumericMinValue_computationGeoresource = 0; + $scope.parameterNumericMaxValue_computationGeoresource = 1; + + // parameter for object property name + $scope.parameterName_computationFilterProperty = "compFilterProp"; + $scope.parameterDescription_computationFilterProperty = "Georessourcen Attributname."; + $scope.parameterDefaultValue_computationFilterProperty = undefined; + $scope.parameterNumericMinValue_computationFilterProperty = 0; + $scope.parameterNumericMaxValue_computationFilterProperty = 1; + + // parameter for logical operator + $scope.parameterName_computationFilterOperator = "compFilterOperator"; + $scope.parameterDescription_computationFilterOperator = "Vergleichsoperator"; + $scope.parameterDefaultValue_computationFilterOperator = undefined; + $scope.parameterNumericMinValue_computationFilterOperator = 0; + $scope.parameterNumericMaxValue_computationFilterOperator = 1; + + // parameter for property value + $scope.parameterName_computationFilterPropertyValue = "compFilterPropVal"; + $scope.parameterDescription_computationFilterPropertyValue = "Filterwert."; + $scope.parameterDefaultValue_computationFilterPropertyValue = undefined; + $scope.parameterNumericMinValue_computationFilterPropertyValue = 0; + $scope.parameterNumericMaxValue_computationFilterPropertyValue = 1; + + // parameter for property value + $scope.parameterDefaultValue_computationFilterPropertyValueRange_from = undefined; + $scope.parameterDefaultValue_computationFilterPropertyValueRange_to = undefined; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + $scope.propertyValueSelection = []; + + $scope.dropdownTranslations = kommonitorDataExchangeService.multiselectDropdownTranslations; + $scope.dropdownSettings = kommonitorDataExchangeService.multiselectDropdownSettings; + $scope.dropdownEvents = { + onSelectionChanged: function() { + $scope.onChangePropertyValue(); + } + }; + + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeGeoresource = function(georesourceSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.georesourceSelection_old){ + kommonitorScriptHelperService.removeBaseGeoresource($scope.georesourceSelection_old); + } + kommonitorScriptHelperService.addBaseGeoresource(georesourceSelection); + + $scope.georesourceSelection_old = georesourceSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetGeoresourceParameter(); + $scope.resetPropertyOptions(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangePropertyName = function(){ + $scope.resetScriptParameter_filterPropertyName(); + $scope.resetComputationFormulaAndLegend(); + $scope.filterOperatorOptions(); + $scope.resetPropertyValueOptions(); + if ($scope.parameterDefaultValue_computationFilterOperator === 'Contains') { + $scope.propertyValueSelection = []; + } + }; + + $scope.onChangeOperatorOption = function(){ + if ($scope.parameterDefaultValue_computationFilterOperator !== 'Contains') { + $scope.propertyValueSelection = []; + } + $scope.resetScriptParameter_operator(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangePropertyValue = function(){ + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter_computationGeoresource = function(georesourceMetadata){ + + return georesourceMetadata.georesourceId; + }; + + $scope.resetGeoresourceParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationGeoresource); + $scope.parameterDefaultValue_computationGeoresource = $scope.resetScriptParameter_computationGeoresource($scope.georesourceSelection); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationGeoresource, $scope.parameterDescription_computationGeoresource, $scope.parameterDataType, $scope.parameterDefaultValue_computationGeoresource, $scope.parameterNumericMinValue_computationGeoresource, $scope.parameterNumericMaxValue_computationGeoresource); + }; + + $scope.resetPropertyOptions = function(){ + kommonitorCacheHelperService.fetchSingleGeoresourceSchema($scope.parameterDefaultValue_computationGeoresource) + .then((schema) => { + for (var prop in schema) { + if (schema[prop] !== 'Date') { + $scope.propertySchema[prop] = schema[prop]; + } + } + $scope.propertyOptions = Object.keys($scope.propertySchema); + }); + }; + + $scope.resetScriptParameter_filterPropertyName = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterProperty); + $scope.parameterDefaultValue_computationFilterProperty = $scope.propertyName; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterProperty, $scope.parameterDescription_computationFilterProperty, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterProperty, $scope.parameterNumericMinValue_computationFilterProperty, $scope.parameterNumericMaxValue_computationFilterProperty); + }; + + $scope.filterOperatorOptions = function(){ + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String"){ + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Contains", + "displayName": "enthält (kommaseparierte Liste)", + } + ]; + } else { + $scope.operatorOptions = [ + { + "apiName": "Equal", + "displayName": "gleich (=)", + }, + { + "apiName": "Greater_than", + "displayName": "größer als (>)", + }, + { + "apiName": "Greater_than_or_equal", + "displayName": "größer als oder gleich (>=)", + }, + { + "apiName": "Less_than", + "displayName": "kleiner als (<)", + }, + { + "apiName": "Less_than_or_equal", + "displayName": "kleiner als oder gleich (<=)", + }, + { + "apiName": "Unequal", + "displayName": "ungleich (!=)", + }, + { + "apiName": "Range", + "displayName": "Wertebereich (>=untere Grenze & { + var data = dataTable; + var tmpArray = data.map(item => { + let value = item[$scope.parameterDefaultValue_computationFilterProperty]; + return value; + }); + if ($scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "String" || $scope.propertySchema[$scope.parameterDefaultValue_computationFilterProperty] === "Boolean") { + // sort strings + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(); + } else { + // sort numbers + $scope.propertyValueOptions = Array.from(new Set(tmpArray)).sort(function(a,b){ + return a - b; + }); + } + }); + }; + + $scope.filterPropertyValueRange_toOptions = function() { + return function(item) { + if (item > $scope.propertyValueRange_from) { + return true; + } + return false; + }; + }; + + $scope.resetScriptParameter_filterPropertyValue = function() { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationFilterPropertyValue); + if ($scope.parameterDefaultValue_computationFilterOperator !== "Contains") { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValue; + } else { + $scope.parameterDefaultValue_computationFilterPropertyValue = $scope.propertyValueSelection.join(); + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationFilterPropertyValue, $scope.parameterDescription_computationFilterPropertyValue, $scope.parameterDataType, $scope.parameterDefaultValue_computationFilterPropertyValue, $scope.parameterNumericMinValue_computationFilterPropertyValue, $scope.parameterNumericMaxValue_computationFilterPropertyValue); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = ""; + if ($scope.propertyName !== undefined && $scope.operator && $scope.operator.apiName !== undefined && ($scope.propertyValue != undefined || $scope.propertyValueSelection != undefined)) { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' '" + $scope.operator.displayName + "' '" + $scope.propertyValue + "'"; + if ($scope.operator.apiName === "Range") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' im " + "Wertebereich von '>=" + $scope.propertyValueRange_from + " bis <" + $scope.propertyValueRange_to + "'"; + } + if ($scope.operator.apiName === "Contains") { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature
Filterkriterium: '" + $scope.propertyName + "' 'enthält' '" + $scope.propertyValueSelection + "'"; + } + } + else { + formulaHTML = "Berechnung gemäß Geodatenanalyse
Anzahl Punkte des Datensatzes G1 pro Raumeinheits-Feature"; + } + var legendItemsHTML = "Legende zur Geodatenanalyse
G1: " + $scope.georesourceSelection.datasetName; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + + $scope.onChangePropertyValueRange_range = function() { + $scope.propertyValue = $scope.propertyValueRange_from + "-" + $scope.propertyValueRange_to; + $scope.resetScriptParameter_filterPropertyValue(); + $scope.resetComputationFormulaAndLegend(); + }; + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.js index 82baac84c..f5c4f3755 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.js @@ -1,2 +1,4 @@ +"use strict"; angular.module('scriptPointsInPolygon', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'angularjs-dropdown-multiselect', 'kommonitorCacheHelper']); +//# sourceMappingURL=script-points-in-polygon.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.js.map new file mode 100644 index 000000000..3279a339d --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-points-in-polygon.module.js","sourceRoot":"","sources":["script-points-in-polygon.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,gCAAgC;IACzH,uBAAuB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.ts new file mode 100644 index 000000000..82baac84c --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/pointsInPolygon/script-points-in-polygon.module.ts @@ -0,0 +1,2 @@ +angular.module('scriptPointsInPolygon', ['kommonitorDataExchange', 'kommonitorScriptHelper', 'angularjs-dropdown-multiselect', + 'kommonitorCacheHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.js index e3dd7411a..e11c90000 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.js @@ -1,190 +1,149 @@ +"use strict"; angular.module('scriptPromille').component('scriptPromille', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptPromilleController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_promille.js"; - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.baseIndicators = []; - - $scope.refIndicatorSelection = undefined; - $scope.refIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicators = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; - $scope.parameterDefaultValue_computationIndicators = undefined; - $scope.parameterNumericMinValue_computationIndicators = 0; - $scope.parameterNumericMaxValue_computationIndicators = 1; - - $scope.parameterName_referenceIndicator = "REFERENCE_ID"; - $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; - $scope.parameterDefaultValue_referenceIndicator = undefined; - $scope.parameterNumericMinValue_referenceIndicator = 0; - $scope.parameterNumericMaxValue_referenceIndicator = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); - kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); - - $scope.refIndicatorSelection_old = refIndicatorSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetRefIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.resetScriptParameter_computationIndicators = function(requiredIndicatorsArray){ - - var result=""; - for (let index = 0; index < requiredIndicatorsArray.length; index++) { - const indicatorMetadata = requiredIndicatorsArray[index]; - result+=indicatorMetadata.indicatorId; - if(index < requiredIndicatorsArray.length - 1){ - result+=","; - } - } - - return result; - }; - - $scope.resetComputationIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); - $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); - }; - - $scope.resetRefIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); - $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Berechnung gemäß Formel
"; - var legendItemsHTML = "Legende zur Formel
"; - - // referenceIndicator - formulaHTML+="$$ \\frac{ "; - - // baseIndicators / computationIndicators - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const indicatorMetadata = $scope.baseIndicators[index]; - var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); - - // we can use TEX code as we use MathJax library - formulaHTML+=letterValue; - legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; - if(index < $scope.baseIndicators.length - 1){ - formulaHTML+=" + "; - legendItemsHTML+="
"; - } - } - - formulaHTML += "}{ I_{ref}} \\times 1000 $$"; - legendItemsHTML+="
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - $scope.addBaseIndicator = function(tmpIndicatorSelection){ - - kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); - $scope.baseIndicators.push(tmpIndicatorSelection); - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetComputationIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - $timeout(() => { - $scope.$digest(); - }); - }; - - $scope.removeBaseIndicator = function(baseIndicator){ - kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); - - var i; - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const element = $scope.baseIndicators[index]; - - if(baseIndicator.indicatorId == element.indicatorId){ - i = index; - break; - } - } - $scope.baseIndicators.splice(i, 1); - - //reset the one and only parameter in this case each time a base indicator is removed - $scope.resetComputationIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptPromilleController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_promille.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.baseIndicators = []; + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicators = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + $scope.parameterName_referenceIndicator = "REFERENCE_ID"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeReferenceIndicator = function (refIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + $scope.refIndicatorSelection_old = refIndicatorSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter_computationIndicators = function (requiredIndicatorsArray) { + var result = ""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result += indicatorMetadata.indicatorId; + if (index < requiredIndicatorsArray.length - 1) { + result += ","; + } + } + return result; + }; + $scope.resetComputationIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + $scope.resetRefIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + // referenceIndicator + formulaHTML += "$$ \\frac{ "; + // baseIndicators / computationIndicators + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + // we can use TEX code as we use MathJax library + formulaHTML += letterValue; + legendItemsHTML += "$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if (index < $scope.baseIndicators.length - 1) { + formulaHTML += " + "; + legendItemsHTML += "
"; + } + } + formulaHTML += "}{ I_{ref}} \\times 1000 $$"; + legendItemsHTML += "
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.addBaseIndicator = function (tmpIndicatorSelection) { + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + $timeout(() => { + $scope.$digest(); + }); + }; + $scope.removeBaseIndicator = function (baseIndicator) { + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + if (baseIndicator.indicatorId == element.indicatorId) { + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + } + ] }); +//# sourceMappingURL=script-promille.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.js.map new file mode 100644 index 000000000..889107a66 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-promille.component.js","sourceRoot":"","sources":["script-promille.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.ts new file mode 100644 index 000000000..e3dd7411a --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.component.ts @@ -0,0 +1,190 @@ +angular.module('scriptPromille').component('scriptPromille', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptPromilleController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_promille.js"; + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.baseIndicators = []; + + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicators = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + + $scope.parameterName_referenceIndicator = "REFERENCE_ID"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + + $scope.refIndicatorSelection_old = refIndicatorSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.resetScriptParameter_computationIndicators = function(requiredIndicatorsArray){ + + var result=""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result+=indicatorMetadata.indicatorId; + if(index < requiredIndicatorsArray.length - 1){ + result+=","; + } + } + + return result; + }; + + $scope.resetComputationIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + + $scope.resetRefIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + + // referenceIndicator + formulaHTML+="$$ \\frac{ "; + + // baseIndicators / computationIndicators + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + + // we can use TEX code as we use MathJax library + formulaHTML+=letterValue; + legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if(index < $scope.baseIndicators.length - 1){ + formulaHTML+=" + "; + legendItemsHTML+="
"; + } + } + + formulaHTML += "}{ I_{ref}} \\times 1000 $$"; + legendItemsHTML+="
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + $scope.addBaseIndicator = function(tmpIndicatorSelection){ + + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + $timeout(() => { + $scope.$digest(); + }); + }; + + $scope.removeBaseIndicator = function(baseIndicator){ + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + + if(baseIndicator.indicatorId == element.indicatorId){ + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.js index 0992f07fe..857361eb9 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptPromille', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-promille.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.js.map new file mode 100644 index 000000000..13c5c8a19 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-promille.module.js","sourceRoot":"","sources":["script-promille.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.ts new file mode 100644 index 000000000..0992f07fe --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/promille/script-promille.module.ts @@ -0,0 +1 @@ +angular.module('scriptPromille', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.js index a6479dd81..d18e88264 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.js @@ -1,190 +1,149 @@ +"use strict"; angular.module('scriptShare').component('scriptShare', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptSharetroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_share.js"; - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.baseIndicators = []; - - $scope.refIndicatorSelection = undefined; - $scope.refIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicators = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; - $scope.parameterDefaultValue_computationIndicators = undefined; - $scope.parameterNumericMinValue_computationIndicators = 0; - $scope.parameterNumericMaxValue_computationIndicators = 1; - - $scope.parameterName_referenceIndicator = "REFERENCE_ID"; - $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; - $scope.parameterDefaultValue_referenceIndicator = undefined; - $scope.parameterNumericMinValue_referenceIndicator = 0; - $scope.parameterNumericMaxValue_referenceIndicator = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); - kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); - - $scope.refIndicatorSelection_old = refIndicatorSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetRefIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.resetScriptParameter_computationIndicators = function(requiredIndicatorsArray){ - - var result=""; - for (let index = 0; index < requiredIndicatorsArray.length; index++) { - const indicatorMetadata = requiredIndicatorsArray[index]; - result+=indicatorMetadata.indicatorId; - if(index < requiredIndicatorsArray.length - 1){ - result+=","; - } - } - - return result; - }; - - $scope.resetComputationIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); - $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); - }; - - $scope.resetRefIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); - $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Berechnung gemäß Formel
"; - var legendItemsHTML = "Legende zur Formel
"; - - // referenceIndicator - formulaHTML+="$$ \\frac{ "; - - // baseIndicators / computationIndicators - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const indicatorMetadata = $scope.baseIndicators[index]; - var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); - - // we can use TEX code as we use MathJax library - formulaHTML+=letterValue; - legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; - if(index < $scope.baseIndicators.length - 1){ - formulaHTML+=" + "; - legendItemsHTML+="
"; - } - } - - formulaHTML += "}{ I_{ref}} $$"; - legendItemsHTML+="
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - $scope.addBaseIndicator = function(tmpIndicatorSelection){ - - kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); - $scope.baseIndicators.push(tmpIndicatorSelection); - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetComputationIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - $scope.removeBaseIndicator = function(baseIndicator){ - kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); - - var i; - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const element = $scope.baseIndicators[index]; - - if(baseIndicator.indicatorId == element.indicatorId){ - i = index; - break; - } - } - $scope.baseIndicators.splice(i, 1); - - //reset the one and only parameter in this case each time a base indicator is removed - $scope.resetComputationIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptSharetroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_share.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.baseIndicators = []; + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicators = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + $scope.parameterName_referenceIndicator = "REFERENCE_ID"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeReferenceIndicator = function (refIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + $scope.refIndicatorSelection_old = refIndicatorSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter_computationIndicators = function (requiredIndicatorsArray) { + var result = ""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result += indicatorMetadata.indicatorId; + if (index < requiredIndicatorsArray.length - 1) { + result += ","; + } + } + return result; + }; + $scope.resetComputationIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + $scope.resetRefIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + // referenceIndicator + formulaHTML += "$$ \\frac{ "; + // baseIndicators / computationIndicators + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + // we can use TEX code as we use MathJax library + formulaHTML += letterValue; + legendItemsHTML += "$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if (index < $scope.baseIndicators.length - 1) { + formulaHTML += " + "; + legendItemsHTML += "
"; + } + } + formulaHTML += "}{ I_{ref}} $$"; + legendItemsHTML += "
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.addBaseIndicator = function (tmpIndicatorSelection) { + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + $scope.removeBaseIndicator = function (baseIndicator) { + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + if (baseIndicator.indicatorId == element.indicatorId) { + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + } + ] }); +//# sourceMappingURL=script-share.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.js.map new file mode 100644 index 000000000..02bbf9986 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-share.component.js","sourceRoot":"","sources":["script-share.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.ts new file mode 100644 index 000000000..a6479dd81 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.component.ts @@ -0,0 +1,190 @@ +angular.module('scriptShare').component('scriptShare', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptSharetroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_share.js"; + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.baseIndicators = []; + + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicators = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Dividenden Indikatoren-IDs."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + + $scope.parameterName_referenceIndicator = "REFERENCE_ID"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Divisors."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + + $scope.refIndicatorSelection_old = refIndicatorSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.resetScriptParameter_computationIndicators = function(requiredIndicatorsArray){ + + var result=""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result+=indicatorMetadata.indicatorId; + if(index < requiredIndicatorsArray.length - 1){ + result+=","; + } + } + + return result; + }; + + $scope.resetComputationIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + + $scope.resetRefIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + + // referenceIndicator + formulaHTML+="$$ \\frac{ "; + + // baseIndicators / computationIndicators + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + + // we can use TEX code as we use MathJax library + formulaHTML+=letterValue; + legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if(index < $scope.baseIndicators.length - 1){ + formulaHTML+=" + "; + legendItemsHTML+="
"; + } + } + + formulaHTML += "}{ I_{ref}} $$"; + legendItemsHTML+="
$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + $scope.addBaseIndicator = function(tmpIndicatorSelection){ + + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + $scope.removeBaseIndicator = function(baseIndicator){ + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + + if(baseIndicator.indicatorId == element.indicatorId){ + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.js index 444f83598..0bf1c3f6f 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptShare', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-share.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.js.map new file mode 100644 index 000000000..06fefcae9 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-share.module.js","sourceRoot":"","sources":["script-share.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.ts new file mode 100644 index 000000000..444f83598 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/share/script-share.module.ts @@ -0,0 +1 @@ +angular.module('scriptShare', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.js index 89ebc04ce..f1be5e7c7 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.js @@ -1,190 +1,149 @@ +"use strict"; angular.module('scriptSubtract').component('scriptSubtract', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptSubtractontroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_subtract.js"; - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.baseIndicators = []; - - $scope.refIndicatorSelection = undefined; - $scope.refIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicators = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Subtrahenden Indikatoren-IDs."; - $scope.parameterDefaultValue_computationIndicators = undefined; - $scope.parameterNumericMinValue_computationIndicators = 0; - $scope.parameterNumericMaxValue_computationIndicators = 1; - - $scope.parameterName_referenceIndicator = "REFERENCE_ID"; - $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Minuenden."; - $scope.parameterDefaultValue_referenceIndicator = undefined; - $scope.parameterNumericMinValue_referenceIndicator = 0; - $scope.parameterNumericMaxValue_referenceIndicator = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); - kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); - - $scope.refIndicatorSelection_old = refIndicatorSelection; - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetRefIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.resetScriptParameter_computationIndicators = function(requiredIndicatorsArray){ - - var result=""; - for (let index = 0; index < requiredIndicatorsArray.length; index++) { - const indicatorMetadata = requiredIndicatorsArray[index]; - result+=indicatorMetadata.indicatorId; - if(index < requiredIndicatorsArray.length - 1){ - result+=","; - } - } - - return result; - }; - - $scope.resetComputationIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); - $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); - }; - - $scope.resetRefIndicatorParameter = function(){ - kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); - $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Berechnung gemäß Formel
"; - var legendItemsHTML = "Legende zur Formel
"; - - // referenceIndicator - formulaHTML+="$ I_{ref} - ("; - legendItemsHTML+="$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; - - // baseIndicators / computationIndicators - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const indicatorMetadata = $scope.baseIndicators[index]; - var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); - - // we can use TEX code as we use MathJax library - formulaHTML+=letterValue; - legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; - if(index < $scope.baseIndicators.length - 1){ - formulaHTML+=" + "; - legendItemsHTML+="
"; - } - } - - formulaHTML += ") $"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - $scope.addBaseIndicator = function(tmpIndicatorSelection){ - - kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); - $scope.baseIndicators.push(tmpIndicatorSelection); - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetComputationIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - $scope.removeBaseIndicator = function(baseIndicator){ - kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); - - var i; - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const element = $scope.baseIndicators[index]; - - if(baseIndicator.indicatorId == element.indicatorId){ - i = index; - break; - } - } - $scope.baseIndicators.splice(i, 1); - - //reset the one and only parameter in this case each time a base indicator is removed - $scope.resetComputationIndicatorParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptSubtractontroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_subtract.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.baseIndicators = []; + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicators = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Subtrahenden Indikatoren-IDs."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + $scope.parameterName_referenceIndicator = "REFERENCE_ID"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Minuenden."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeReferenceIndicator = function (refIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + $scope.refIndicatorSelection_old = refIndicatorSelection; + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter_computationIndicators = function (requiredIndicatorsArray) { + var result = ""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result += indicatorMetadata.indicatorId; + if (index < requiredIndicatorsArray.length - 1) { + result += ","; + } + } + return result; + }; + $scope.resetComputationIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + $scope.resetRefIndicatorParameter = function () { + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + // referenceIndicator + formulaHTML += "$ I_{ref} - ("; + legendItemsHTML += "$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; + // baseIndicators / computationIndicators + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + // we can use TEX code as we use MathJax library + formulaHTML += letterValue; + legendItemsHTML += "$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if (index < $scope.baseIndicators.length - 1) { + formulaHTML += " + "; + legendItemsHTML += "
"; + } + } + formulaHTML += ") $"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.addBaseIndicator = function (tmpIndicatorSelection) { + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + $scope.removeBaseIndicator = function (baseIndicator) { + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + if (baseIndicator.indicatorId == element.indicatorId) { + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + } + ] }); +//# sourceMappingURL=script-subtract.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.js.map new file mode 100644 index 000000000..15c9161a9 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-subtract.component.js","sourceRoot":"","sources":["script-subtract.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.ts new file mode 100644 index 000000000..89ebc04ce --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.component.ts @@ -0,0 +1,190 @@ +angular.module('scriptSubtract').component('scriptSubtract', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptSubtractontroller(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_subtract.js"; + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.baseIndicators = []; + + $scope.refIndicatorSelection = undefined; + $scope.refIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicators = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicators = "Komma-separierte Liste aller Subtrahenden Indikatoren-IDs."; + $scope.parameterDefaultValue_computationIndicators = undefined; + $scope.parameterNumericMinValue_computationIndicators = 0; + $scope.parameterNumericMaxValue_computationIndicators = 1; + + $scope.parameterName_referenceIndicator = "REFERENCE_ID"; + $scope.parameterDescription_referenceIndicator = "Indikatoren-ID des Minuenden."; + $scope.parameterDefaultValue_referenceIndicator = undefined; + $scope.parameterNumericMinValue_referenceIndicator = 0; + $scope.parameterNumericMaxValue_referenceIndicator = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeReferenceIndicator = function(refIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + kommonitorScriptHelperService.removeBaseIndicator($scope.refIndicatorSelection_old); + kommonitorScriptHelperService.addBaseIndicator(refIndicatorSelection); + + $scope.refIndicatorSelection_old = refIndicatorSelection; + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetRefIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.resetScriptParameter_computationIndicators = function(requiredIndicatorsArray){ + + var result=""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result+=indicatorMetadata.indicatorId; + if(index < requiredIndicatorsArray.length - 1){ + result+=","; + } + } + + return result; + }; + + $scope.resetComputationIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_computationIndicators); + $scope.parameterDefaultValue_computationIndicators = $scope.resetScriptParameter_computationIndicators($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicators, $scope.parameterDescription_computationIndicators, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicators, $scope.parameterNumericMinValue_computationIndicators, $scope.parameterNumericMaxValue_computationIndicators); + }; + + $scope.resetRefIndicatorParameter = function(){ + kommonitorScriptHelperService.removeScriptParameter_byName($scope.parameterName_referenceIndicator); + $scope.parameterDefaultValue_referenceIndicator = $scope.refIndicatorSelection.indicatorId; + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_referenceIndicator, $scope.parameterDescription_referenceIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_referenceIndicator, $scope.parameterNumericMinValue_referenceIndicator, $scope.parameterNumericMaxValue_referenceIndicator); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + + // referenceIndicator + formulaHTML+="$ I_{ref} - ("; + legendItemsHTML+="$ I_{ref} $: " + $scope.refIndicatorSelection.indicatorName + " [" + $scope.refIndicatorSelection.unit + "]" + "
"; + + // baseIndicators / computationIndicators + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + + // we can use TEX code as we use MathJax library + formulaHTML+=letterValue; + legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if(index < $scope.baseIndicators.length - 1){ + formulaHTML+=" + "; + legendItemsHTML+="
"; + } + } + + formulaHTML += ") $"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + $scope.addBaseIndicator = function(tmpIndicatorSelection){ + + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + $scope.removeBaseIndicator = function(baseIndicator){ + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + + if(baseIndicator.indicatorId == element.indicatorId){ + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetComputationIndicatorParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.js index f517612fa..b9d1e6bf8 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptSubtract', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-subtract.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.js.map new file mode 100644 index 000000000..3f8f957c1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-subtract.module.js","sourceRoot":"","sources":["script-subtract.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.ts new file mode 100644 index 000000000..f517612fa --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/subtract/script-subtract.module.ts @@ -0,0 +1 @@ +angular.module('scriptSubtract', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.js index ca9e8b5fe..61d18f6b0 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.js @@ -1,159 +1,125 @@ +"use strict"; angular.module('scriptSum').component('scriptSum', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptSumController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_sum.js"; - - $scope.tmpIndicatorSelection = undefined; - $scope.tmpGeoresourceSelection = undefined; - - $scope.baseIndicators = []; - - $scope.parameterName = "COMPUTATION_ID"; - $scope.parameterDescription = "Komma-separierte Liste aller Indikatoren-IDs zur Summenbildung."; - $scope.parameterDefaultValue = undefined; - $scope.parameterNumericMinValue = 0; - $scope.parameterNumericMaxValue = 1; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.generateParameterValue = function(requiredIndicatorsArray){ - - var result=""; - for (let index = 0; index < requiredIndicatorsArray.length; index++) { - const indicatorMetadata = requiredIndicatorsArray[index]; - result+=indicatorMetadata.indicatorId; - if(index < requiredIndicatorsArray.length - 1){ - result+=","; - } - } - - return result; - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - $scope.parameterDefaultValue = $scope.generateParameterValue($scope.baseIndicators); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName, $scope.parameterDescription, $scope.parameterDataType, $scope.parameterDefaultValue, $scope.parameterNumericMinValue, $scope.parameterNumericMaxValue); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - var formulaHTML = "Berechnung gemäß Formel
"; - var legendItemsHTML = "Legende zur Formel
"; - - formulaHTML += "$ "; - - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const indicatorMetadata = $scope.baseIndicators[index]; - var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); - - // we can use TEX code as we use MathJax library - formulaHTML+=letterValue; - legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; - if(index < $scope.baseIndicators.length - 1){ - formulaHTML+=" + "; - legendItemsHTML+="
"; - } - } - - formulaHTML += " $"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - $scope.addBaseIndicator = function(tmpIndicatorSelection){ - - kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); - $scope.baseIndicators.push(tmpIndicatorSelection); - - //reset the one and only parameter in this case each time a base indicator is added - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - $scope.removeBaseIndicator = function(baseIndicator){ - kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); - - var i; - for (let index = 0; index < $scope.baseIndicators.length; index++) { - const element = $scope.baseIndicators[index]; - - if(baseIndicator.indicatorId == element.indicatorId){ - i = index; - break; - } - } - $scope.baseIndicators.splice(i, 1); - - //reset the one and only parameter in this case each time a base indicator is removed - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - setTimeout(() => { - $scope.$digest(); - }); - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptSumController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_sum.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + $scope.baseIndicators = []; + $scope.parameterName = "COMPUTATION_ID"; + $scope.parameterDescription = "Komma-separierte Liste aller Indikatoren-IDs zur Summenbildung."; + $scope.parameterDefaultValue = undefined; + $scope.parameterNumericMinValue = 0; + $scope.parameterNumericMaxValue = 1; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.generateParameterValue = function (requiredIndicatorsArray) { + var result = ""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result += indicatorMetadata.indicatorId; + if (index < requiredIndicatorsArray.length - 1) { + result += ","; + } + } + return result; + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue = $scope.generateParameterValue($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName, $scope.parameterDescription, $scope.parameterDataType, $scope.parameterDefaultValue, $scope.parameterNumericMinValue, $scope.parameterNumericMaxValue); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + formulaHTML += "$ "; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + // we can use TEX code as we use MathJax library + formulaHTML += letterValue; + legendItemsHTML += "$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if (index < $scope.baseIndicators.length - 1) { + formulaHTML += " + "; + legendItemsHTML += "
"; + } + } + formulaHTML += " $"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + $scope.addBaseIndicator = function (tmpIndicatorSelection) { + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + $scope.removeBaseIndicator = function (baseIndicator) { + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + if (baseIndicator.indicatorId == element.indicatorId) { + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + setTimeout(() => { + $scope.$digest(); + }); + }; + } + ] }); +//# sourceMappingURL=script-sum.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.js.map new file mode 100644 index 000000000..363f839b2 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-sum.component.js","sourceRoot":"","sources":["script-sum.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.ts new file mode 100644 index 000000000..ca9e8b5fe --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.component.ts @@ -0,0 +1,159 @@ +angular.module('scriptSum').component('scriptSum', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptSumController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_sum.js"; + + $scope.tmpIndicatorSelection = undefined; + $scope.tmpGeoresourceSelection = undefined; + + $scope.baseIndicators = []; + + $scope.parameterName = "COMPUTATION_ID"; + $scope.parameterDescription = "Komma-separierte Liste aller Indikatoren-IDs zur Summenbildung."; + $scope.parameterDefaultValue = undefined; + $scope.parameterNumericMinValue = 0; + $scope.parameterNumericMaxValue = 1; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.generateParameterValue = function(requiredIndicatorsArray){ + + var result=""; + for (let index = 0; index < requiredIndicatorsArray.length; index++) { + const indicatorMetadata = requiredIndicatorsArray[index]; + result+=indicatorMetadata.indicatorId; + if(index < requiredIndicatorsArray.length - 1){ + result+=","; + } + } + + return result; + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue = $scope.generateParameterValue($scope.baseIndicators); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName, $scope.parameterDescription, $scope.parameterDataType, $scope.parameterDefaultValue, $scope.parameterNumericMinValue, $scope.parameterNumericMaxValue); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + var formulaHTML = "Berechnung gemäß Formel
"; + var legendItemsHTML = "Legende zur Formel
"; + + formulaHTML += "$ "; + + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const indicatorMetadata = $scope.baseIndicators[index]; + var letterValue = kommonitorScriptHelperService.getAlphabetLetterFromNumber(index); + + // we can use TEX code as we use MathJax library + formulaHTML+=letterValue; + legendItemsHTML+="$" + letterValue + "$: " + indicatorMetadata.indicatorName + " [" + indicatorMetadata.unit + "]"; + if(index < $scope.baseIndicators.length - 1){ + formulaHTML+=" + "; + legendItemsHTML+="
"; + } + } + + formulaHTML += " $"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + $scope.addBaseIndicator = function(tmpIndicatorSelection){ + + kommonitorScriptHelperService.addBaseIndicator(tmpIndicatorSelection); + $scope.baseIndicators.push(tmpIndicatorSelection); + + //reset the one and only parameter in this case each time a base indicator is added + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + $scope.removeBaseIndicator = function(baseIndicator){ + kommonitorScriptHelperService.removeBaseIndicator(baseIndicator); + + var i; + for (let index = 0; index < $scope.baseIndicators.length; index++) { + const element = $scope.baseIndicators[index]; + + if(baseIndicator.indicatorId == element.indicatorId){ + i = index; + break; + } + } + $scope.baseIndicators.splice(i, 1); + + //reset the one and only parameter in this case each time a base indicator is removed + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + setTimeout(() => { + $scope.$digest(); + }); + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.js index aec049141..c3004e226 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptSum', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-sum.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.js.map new file mode 100644 index 000000000..6814b25f5 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-sum.module.js","sourceRoot":"","sources":["script-sum.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.ts new file mode 100644 index 000000000..aec049141 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/sum/script-sum.module.ts @@ -0,0 +1 @@ +angular.module('scriptSum', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.js index d9cb12976..7260d51dd 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.js @@ -1,153 +1,120 @@ +"use strict"; angular.module('scriptTrend').component('scriptTrend', { - templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.template.html", - controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', - function ScriptTrendController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_trend_nTemporalItems.js"; - - $scope.tmpIndicatorSelection = undefined; - - $scope.compIndicatorSelection = undefined; - $scope.compIndicatorSelection_old = undefined; - - $scope.parameterName_computationIndicator = "COMPUTATION_ID"; - $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; - $scope.parameterDefaultValue_computationIndicator = undefined; - $scope.parameterNumericMinValue_computationIndicator = 0; - $scope.parameterNumericMaxValue_computationIndicator = 1; - - $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; - - $scope.numberOfTemporalItems = 3; - - $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; - $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; - $scope.parameterDefaultValue_temporalOption = "YEARS"; - $scope.parameterNumericMinValue_temporalOption = 0; - $scope.parameterNumericMaxValue_temporalOption = 1; - - $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; - $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '3'."; - $scope.parameterDefaultValue_numTemporalItems = 3; - $scope.parameterNumericMinValue_numTemporalItems = 3; - $scope.parameterNumericMaxValue_numTemporalItems = 100000; - $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; - - /* - availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - */ - $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; - - $scope.scriptCode_readableString_forPreview = undefined; - $scope.scriptCodeDomElementId = "#scriptCodePreview"; - - $scope.scriptFormulaHTML = undefined; - - /* - * reset relevant things due to change of script type - */ - $scope.init = function(){ - kommonitorScriptHelperService.reset(); - - $scope.initFixedScriptCode(); - }; - - $scope.initFixedScriptCode = function(){ - $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { - $scope.scriptCode_readableString_forPreview = response.data; - kommonitorScriptHelperService.scriptCode_readableString = response.data; - $scope.scriptCode_readableString_forPreview = response.data; - - kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); - }); - }; - - $scope.init(); - - $scope.onChangeComputationIndicator = function(compIndicatorSelection){ - // remove previous refIndicator from requiredIndicators and add new one - if($scope.compIndicatorSelection_old){ - kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); - } - kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); - - $scope.compIndicatorSelection_old = compIndicatorSelection; - - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - - }; - - $scope.onChangeNumTemporalItems = function(){ - $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.onChangeTemporalOption = function(){ - $scope.resetScriptParameter(); - $scope.resetComputationFormulaAndLegend(); - }; - - $scope.resetScriptParameter = function(){ - kommonitorScriptHelperService.requiredScriptParameters_tmp = []; - - $scope.parameterDefaultValue_computationIndicator = undefined; - - if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ - $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; - } - - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); - kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); - }; - - $scope.resetComputationFormulaAndLegend = function(){ - kommonitorScriptHelperService.scriptFormulaHTML = ""; - - if (! $scope.compIndicatorSelection){ - return; - } - - var formulaHTML = "Berechnung gemäß Formel
$$ T = 100 \\times \\frac{b}{B_{1}} $$ wobei $$ b = \\frac{\\sum_{n=1}^{m}((A_{n} - \\bar{A}) \\times (B_{n} - \\bar{B}))}{\\sum_{n=1}^{m} (A_{n} - \\bar{A})^2} $$"; - var legendItemsHTML = "Legende zur Formel"; - - legendItemsHTML+="
$T$: Trend"; - legendItemsHTML+="
$m$ = " + $scope.numberOfTemporalItems + " konsekutive vergangene " + $scope.temporalOption.displayName; - legendItemsHTML+="
$A_{n}$ = aufeinander folgende " + $scope.temporalOption.displayName; - legendItemsHTML+="
$\\bar{A}$ = arithmetisches Mittel der aufeinander folgenden " + $scope.temporalOption.displayName; - legendItemsHTML+="
$B_{n}$ = Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; - legendItemsHTML+="
$\\bar{B}$ = arithmetisches Mittel der Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; - legendItemsHTML+="
$B$ = Indikator '" + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]" + "'"; - - kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; - - }; - - } - ] + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptTrendController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_trend_nTemporalItems.js"; + $scope.tmpIndicatorSelection = undefined; + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; + $scope.numberOfTemporalItems = 3; + $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; + $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; + $scope.parameterDefaultValue_temporalOption = "YEARS"; + $scope.parameterNumericMinValue_temporalOption = 0; + $scope.parameterNumericMaxValue_temporalOption = 1; + $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '3'."; + $scope.parameterDefaultValue_numTemporalItems = 3; + $scope.parameterNumericMinValue_numTemporalItems = 3; + $scope.parameterNumericMaxValue_numTemporalItems = 100000; + $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + $scope.scriptFormulaHTML = undefined; + /* + * reset relevant things due to change of script type + */ + $scope.init = function () { + kommonitorScriptHelperService.reset(); + $scope.initFixedScriptCode(); + }; + $scope.initFixedScriptCode = function () { + $http.get($scope.pathToScriptResource, { 'responseType': 'text' }).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + $scope.init(); + $scope.onChangeComputationIndicator = function (compIndicatorSelection) { + // remove previous refIndicator from requiredIndicators and add new one + if ($scope.compIndicatorSelection_old) { + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + $scope.compIndicatorSelection_old = compIndicatorSelection; + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeNumTemporalItems = function () { + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.onChangeTemporalOption = function () { + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + $scope.resetScriptParameter = function () { + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + $scope.parameterDefaultValue_computationIndicator = undefined; + if ($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId) { + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); + }; + $scope.resetComputationFormulaAndLegend = function () { + kommonitorScriptHelperService.scriptFormulaHTML = ""; + if (!$scope.compIndicatorSelection) { + return; + } + var formulaHTML = "Berechnung gemäß Formel
$$ T = 100 \\times \\frac{b}{B_{1}} $$ wobei $$ b = \\frac{\\sum_{n=1}^{m}((A_{n} - \\bar{A}) \\times (B_{n} - \\bar{B}))}{\\sum_{n=1}^{m} (A_{n} - \\bar{A})^2} $$"; + var legendItemsHTML = "Legende zur Formel"; + legendItemsHTML += "
$T$: Trend"; + legendItemsHTML += "
$m$ = " + $scope.numberOfTemporalItems + " konsekutive vergangene " + $scope.temporalOption.displayName; + legendItemsHTML += "
$A_{n}$ = aufeinander folgende " + $scope.temporalOption.displayName; + legendItemsHTML += "
$\\bar{A}$ = arithmetisches Mittel der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML += "
$B_{n}$ = Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML += "
$\\bar{B}$ = arithmetisches Mittel der Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML += "
$B$ = Indikator '" + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]" + "'"; + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + }; + } + ] }); +//# sourceMappingURL=script-trend.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.js.map new file mode 100644 index 000000000..87545d65c --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-trend.component.js","sourceRoot":"","sources":["script-trend.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.ts new file mode 100644 index 000000000..d9cb12976 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.component.ts @@ -0,0 +1,153 @@ +angular.module('scriptTrend').component('scriptTrend', { + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$timeout', + function ScriptTrendController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.pathToScriptResource = "./kommonitor-script-resources/km_indicator_trend_nTemporalItems.js"; + + $scope.tmpIndicatorSelection = undefined; + + $scope.compIndicatorSelection = undefined; + $scope.compIndicatorSelection_old = undefined; + + $scope.parameterName_computationIndicator = "COMPUTATION_ID"; + $scope.parameterDescription_computationIndicator = "Indikatoren-ID des Basisindikators."; + $scope.parameterDefaultValue_computationIndicator = undefined; + $scope.parameterNumericMinValue_computationIndicator = 0; + $scope.parameterNumericMaxValue_computationIndicator = 1; + + $scope.temporalOption = kommonitorScriptHelperService.temporalOptions[0]; + + $scope.numberOfTemporalItems = 3; + + $scope.parameterName_temporalOption = "TEMPORAL_TYPE"; + $scope.parameterDescription_temporalOption = "Angabe des Zeitbezug-Typs. Standard ist 'Jahre'."; + $scope.parameterDefaultValue_temporalOption = "YEARS"; + $scope.parameterNumericMinValue_temporalOption = 0; + $scope.parameterNumericMaxValue_temporalOption = 1; + + $scope.parameterName_numTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + $scope.parameterDescription_numTemporalItems = "Anzahl der Zeiteinheiten. Standard ist '3'."; + $scope.parameterDefaultValue_numTemporalItems = 3; + $scope.parameterNumericMinValue_numTemporalItems = 3; + $scope.parameterNumericMaxValue_numTemporalItems = 100000; + $scope.parameterDataType_numTemporalItems = kommonitorScriptHelperService.availableScriptDataTypes[3]; + + /* + availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + */ + $scope.parameterDataType = kommonitorScriptHelperService.availableScriptDataTypes[0]; + + $scope.scriptCode_readableString_forPreview = undefined; + $scope.scriptCodeDomElementId = "#scriptCodePreview"; + + $scope.scriptFormulaHTML = undefined; + + /* + * reset relevant things due to change of script type + */ + $scope.init = function(){ + kommonitorScriptHelperService.reset(); + + $scope.initFixedScriptCode(); + }; + + $scope.initFixedScriptCode = function(){ + $http.get($scope.pathToScriptResource, {'responseType': 'text'}).then(function (response) { + $scope.scriptCode_readableString_forPreview = response.data; + kommonitorScriptHelperService.scriptCode_readableString = response.data; + $scope.scriptCode_readableString_forPreview = response.data; + + kommonitorScriptHelperService.prettifyScriptCodePreview($scope.scriptCodeDomElementId); + }); + }; + + $scope.init(); + + $scope.onChangeComputationIndicator = function(compIndicatorSelection){ + // remove previous refIndicator from requiredIndicators and add new one + if($scope.compIndicatorSelection_old){ + kommonitorScriptHelperService.removeBaseIndicator($scope.compIndicatorSelection_old); + } + kommonitorScriptHelperService.addBaseIndicator(compIndicatorSelection); + + $scope.compIndicatorSelection_old = compIndicatorSelection; + + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + + }; + + $scope.onChangeNumTemporalItems = function(){ + $scope.numberOfTemporalItems = Math.round($scope.numberOfTemporalItems); + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.onChangeTemporalOption = function(){ + $scope.resetScriptParameter(); + $scope.resetComputationFormulaAndLegend(); + }; + + $scope.resetScriptParameter = function(){ + kommonitorScriptHelperService.requiredScriptParameters_tmp = []; + + $scope.parameterDefaultValue_computationIndicator = undefined; + + if($scope.compIndicatorSelection && $scope.compIndicatorSelection.indicatorId){ + $scope.parameterDefaultValue_computationIndicator = $scope.compIndicatorSelection.indicatorId; + } + + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_computationIndicator, $scope.parameterDescription_computationIndicator, $scope.parameterDataType, $scope.parameterDefaultValue_computationIndicator, $scope.parameterNumericMinValue_computationIndicator, $scope.parameterNumericMaxValue_computationIndicator); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_numTemporalItems, $scope.parameterDescription_numTemporalItems, $scope.parameterDataType_numTemporalItems, $scope.numberOfTemporalItems, $scope.parameterNumericMinValue_numTemporalItems, $scope.parameterNumericMaxValue_numTemporalItems); + kommonitorScriptHelperService.addScriptParameter($scope.parameterName_temporalOption, $scope.parameterDescription_temporalOption, $scope.parameterDataType, $scope.temporalOption.apiName, $scope.parameterNumericMinValue_temporalOption, $scope.parameterNumericMaxValue_temporalOption); + }; + + $scope.resetComputationFormulaAndLegend = function(){ + kommonitorScriptHelperService.scriptFormulaHTML = ""; + + if (! $scope.compIndicatorSelection){ + return; + } + + var formulaHTML = "Berechnung gemäß Formel
$$ T = 100 \\times \\frac{b}{B_{1}} $$ wobei $$ b = \\frac{\\sum_{n=1}^{m}((A_{n} - \\bar{A}) \\times (B_{n} - \\bar{B}))}{\\sum_{n=1}^{m} (A_{n} - \\bar{A})^2} $$"; + var legendItemsHTML = "Legende zur Formel"; + + legendItemsHTML+="
$T$: Trend"; + legendItemsHTML+="
$m$ = " + $scope.numberOfTemporalItems + " konsekutive vergangene " + $scope.temporalOption.displayName; + legendItemsHTML+="
$A_{n}$ = aufeinander folgende " + $scope.temporalOption.displayName; + legendItemsHTML+="
$\\bar{A}$ = arithmetisches Mittel der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML+="
$B_{n}$ = Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML+="
$\\bar{B}$ = arithmetisches Mittel der Indikatorenwerte der aufeinander folgenden " + $scope.temporalOption.displayName; + legendItemsHTML+="
$B$ = Indikator '" + $scope.compIndicatorSelection.indicatorName + " [" + $scope.compIndicatorSelection.unit + "]" + "'"; + + kommonitorScriptHelperService.scriptFormulaHTML = formulaHTML + "

" + legendItemsHTML; + + }; + + } + ] +}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.js index 771db93a0..e9ea07748 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptTrend', ['kommonitorDataExchange', 'kommonitorScriptHelper']); +//# sourceMappingURL=script-trend.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.js.map new file mode 100644 index 000000000..2a6affb8f --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-trend.module.js","sourceRoot":"","sources":["script-trend.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.ts new file mode 100644 index 000000000..771db93a0 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptAddModal/scriptDefinition/trend/script-trend.module.ts @@ -0,0 +1 @@ +angular.module('scriptTrend', ['kommonitorDataExchange', 'kommonitorScriptHelper']); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.js index 76be3f5f6..95fef3411 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.js @@ -1,124 +1,92 @@ +"use strict"; angular.module('scriptDeleteModal').component('scriptDeleteModal', { - templateUrl : "components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorScriptHelperService','$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function ScriptDeleteModalController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $q, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; - - $scope.datasetsToDelete = []; - - $scope.loadingData = false; - - $scope.successfullyDeletedDatasets = []; - $scope.failedDatasetsAndErrors = []; - - $scope.$on("onDeleteScripts", function (event, datasets) { - - $scope.datasetsToDelete = datasets; - - $scope.resetScriptsDeleteForm(); - - }); - - - $scope.resetScriptsDeleteForm = function(){ - - $scope.successfullyDeletedDatasets = []; - $scope.failedDatasetsAndErrors = []; - $("#scriptsDeleteSuccessAlert").hide(); - $("#scriptsDeleteErrorAlert").hide(); - }; - - $scope.deleteScripts = function(){ - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - $scope.loadingData = true; - - var deletePromises = []; - - $scope.datasetsToDelete.forEach(function(dataset){ - deletePromises.push($scope.getDeleteDatasetPromise(dataset)); - }); - - $q.all(deletePromises).then(async function successCallback(successArray) { - // - - if($scope.failedDatasetsAndErrors.length > 0){ - // error handling - $("#scriptsDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#scriptsDeleteSuccessAlert").show(); - // } - } - if($scope.successfullyDeletedDatasets.length > 0){ - $("#scriptsDeleteSuccessAlert").show(); - - // refresh script overview table - $rootScope.$broadcast("refreshScriptOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => dataset.scriptId)); - - // refresh all admin dashboard diagrams due to modified metadata - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - } - - $timeout(function(){ - - $scope.loadingData = false; - }); - }, function errorCallback(errorArray) { - - $("#scriptsDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#scriptsDeleteSuccessAlert").show(); - // } - - $rootScope.$broadcast("refreshScriptOverviewTable"); - $scope.loadingData = false; - }); - - }; - - $scope.getDeleteDatasetPromise = function(dataset){ - return $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/process-scripts/" + dataset.scriptId, - method: "DELETE" - }).then(function successCallback(response) { - $scope.successfullyDeletedDatasets.push(dataset); - - // remove entry from array - var index = -1; - - for(var i=0; i< kommonitorDataExchangeService.availableProcessScripts.length; i++){ - if(kommonitorDataExchangeService.availableProcessScripts[i].scriptId === dataset.scriptId){ - index = i; - break; - } - } - - if (index > -1) { - kommonitorDataExchangeService.availableProcessScripts.splice(index, 1); - } - - }, function errorCallback(error) { - if(error.data){ - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); - } - else{ - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); - } - - }); - }; - - $scope.hideSuccessAlert = function(){ - $("#scriptsDeleteSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#scriptsDeleteErrorAlert").hide(); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorScriptHelperService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function ScriptDeleteModalController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $q, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + $scope.datasetsToDelete = []; + $scope.loadingData = false; + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $scope.$on("onDeleteScripts", function (event, datasets) { + $scope.datasetsToDelete = datasets; + $scope.resetScriptsDeleteForm(); + }); + $scope.resetScriptsDeleteForm = function () { + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $("#scriptsDeleteSuccessAlert").hide(); + $("#scriptsDeleteErrorAlert").hide(); + }; + $scope.deleteScripts = function () { + // TODO verify input + // TODO Create and perform POST Request with loading screen + $scope.loadingData = true; + var deletePromises = []; + $scope.datasetsToDelete.forEach(function (dataset) { + deletePromises.push($scope.getDeleteDatasetPromise(dataset)); + }); + $q.all(deletePromises).then(async function successCallback(successArray) { + // + if ($scope.failedDatasetsAndErrors.length > 0) { + // error handling + $("#scriptsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#scriptsDeleteSuccessAlert").show(); + // } + } + if ($scope.successfullyDeletedDatasets.length > 0) { + $("#scriptsDeleteSuccessAlert").show(); + // refresh script overview table + $rootScope.$broadcast("refreshScriptOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => dataset.scriptId)); + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + } + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(errorArray) { + $("#scriptsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#scriptsDeleteSuccessAlert").show(); + // } + $rootScope.$broadcast("refreshScriptOverviewTable"); + $scope.loadingData = false; + }); + }; + $scope.getDeleteDatasetPromise = function (dataset) { + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/process-scripts/" + dataset.scriptId, + method: "DELETE" + }).then(function successCallback(response) { + $scope.successfullyDeletedDatasets.push(dataset); + // remove entry from array + var index = -1; + for (var i = 0; i < kommonitorDataExchangeService.availableProcessScripts.length; i++) { + if (kommonitorDataExchangeService.availableProcessScripts[i].scriptId === dataset.scriptId) { + index = i; + break; + } + } + if (index > -1) { + kommonitorDataExchangeService.availableProcessScripts.splice(index, 1); + } + }, function errorCallback(error) { + if (error.data) { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + $scope.hideSuccessAlert = function () { + $("#scriptsDeleteSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#scriptsDeleteErrorAlert").hide(); + }; + } + ] +}); +//# sourceMappingURL=script-delete-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.js.map new file mode 100644 index 000000000..8b669da8d --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-delete-modal.component.js","sourceRoot":"","sources":["script-delete-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.ts new file mode 100644 index 000000000..76be3f5f6 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.component.ts @@ -0,0 +1,124 @@ +angular.module('scriptDeleteModal').component('scriptDeleteModal', { + templateUrl : "components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorScriptHelperService','$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function ScriptDeleteModalController(kommonitorDataExchangeService, kommonitorScriptHelperService, $scope, $rootScope, $http, __env, $q, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorScriptHelperServiceInstance = kommonitorScriptHelperService; + + $scope.datasetsToDelete = []; + + $scope.loadingData = false; + + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + + $scope.$on("onDeleteScripts", function (event, datasets) { + + $scope.datasetsToDelete = datasets; + + $scope.resetScriptsDeleteForm(); + + }); + + + $scope.resetScriptsDeleteForm = function(){ + + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $("#scriptsDeleteSuccessAlert").hide(); + $("#scriptsDeleteErrorAlert").hide(); + }; + + $scope.deleteScripts = function(){ + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + $scope.loadingData = true; + + var deletePromises = []; + + $scope.datasetsToDelete.forEach(function(dataset){ + deletePromises.push($scope.getDeleteDatasetPromise(dataset)); + }); + + $q.all(deletePromises).then(async function successCallback(successArray) { + // + + if($scope.failedDatasetsAndErrors.length > 0){ + // error handling + $("#scriptsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#scriptsDeleteSuccessAlert").show(); + // } + } + if($scope.successfullyDeletedDatasets.length > 0){ + $("#scriptsDeleteSuccessAlert").show(); + + // refresh script overview table + $rootScope.$broadcast("refreshScriptOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => dataset.scriptId)); + + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + } + + $timeout(function(){ + + $scope.loadingData = false; + }); + }, function errorCallback(errorArray) { + + $("#scriptsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#scriptsDeleteSuccessAlert").show(); + // } + + $rootScope.$broadcast("refreshScriptOverviewTable"); + $scope.loadingData = false; + }); + + }; + + $scope.getDeleteDatasetPromise = function(dataset){ + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/process-scripts/" + dataset.scriptId, + method: "DELETE" + }).then(function successCallback(response) { + $scope.successfullyDeletedDatasets.push(dataset); + + // remove entry from array + var index = -1; + + for(var i=0; i< kommonitorDataExchangeService.availableProcessScripts.length; i++){ + if(kommonitorDataExchangeService.availableProcessScripts[i].scriptId === dataset.scriptId){ + index = i; + break; + } + } + + if (index > -1) { + kommonitorDataExchangeService.availableProcessScripts.splice(index, 1); + } + + }, function errorCallback(error) { + if(error.data){ + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else{ + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + + }); + }; + + $scope.hideSuccessAlert = function(){ + $("#scriptsDeleteSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#scriptsDeleteErrorAlert").hide(); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.js b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.js index 6008923b4..ad17d3978 100644 --- a/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.js +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('scriptDeleteModal', []); +//# sourceMappingURL=script-delete-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.js.map b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.js.map new file mode 100644 index 000000000..dcabeb6e9 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script-delete-modal.module.js","sourceRoot":"","sources":["script-delete-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.ts b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.ts new file mode 100644 index 000000000..6008923b4 --- /dev/null +++ b/app/components/kommonitorAdmin/adminScriptManagement/scriptDeleteModal/script-delete-modal.module.ts @@ -0,0 +1 @@ +angular.module('scriptDeleteModal', []); diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.js b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.js index 77c421b0a..b12209470 100644 --- a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.js +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.js @@ -1,164 +1,114 @@ +"use strict"; angular.module('adminSpatialUnitsManagement').component('adminSpatialUnitsManagement', { - templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', - function SpatialUnitsManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.loadingData = true; - - $scope.$on("initialMetadataLoadingCompleted", function (event) { - - - $timeout(function(){ - - $scope.initializeOrRefreshOverviewTable(); - }, 250); - - }); - - $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { - - $scope.loadingData = false; - - }); - - $scope.initializeOrRefreshOverviewTable = function(){ - $scope.loadingData = true; - - kommonitorDataGridHelperService.buildDataGrid_spatialUnits(kommonitorDataExchangeService.availableSpatialUnits); - - $timeout(function(){ - - $scope.loadingData = false; - }); - }; - - $scope.$on("refreshSpatialUnitOverviewTable", function (event, crudType, targetSpatialUnitId) { - $scope.loadingData = true; - $scope.refreshSpatialUnitOverviewTable(crudType, targetSpatialUnitId); - }); - - $scope.refreshSpatialUnitOverviewTable = function(crudType, targetSpatialUnitId){ - - if(! crudType || !targetSpatialUnitId){ - // refetch all metadata from spatial units to update table - kommonitorDataExchangeService.fetchSpatialUnitsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { - - $scope.initializeOrRefreshOverviewTable(); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(response) { - - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - } - else if(crudType && targetSpatialUnitId){ - if(crudType == "add"){ - kommonitorCacheHelperService.fetchSingleSpatialUnitMetadata(targetSpatialUnitId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - kommonitorDataExchangeService.addSingleSpatialUnitMetadata(data); - - $scope.initializeOrRefreshOverviewTable(); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(response) { - - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - } - else if(crudType == "edit"){ - kommonitorCacheHelperService.fetchSingleSpatialUnitMetadata(targetSpatialUnitId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { - - kommonitorDataExchangeService.replaceSingleSpatialUnitMetadata(data); - - $scope.initializeOrRefreshOverviewTable(); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(response) { - - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - } - else if(crudType == "delete"){ - // targetSpatialUnitId might be array in this case - if(targetSpatialUnitId && typeof targetSpatialUnitId == "string"){ - kommonitorDataExchangeService.deleteSingleSpatialUnitMetadata(targetSpatialUnitId); - - $scope.initializeOrRefreshOverviewTable(); - - $timeout(function(){ - - $scope.loadingData = false; - }); - } - - else if (targetSpatialUnitId && Array.isArray(targetSpatialUnitId)){ - for (const id of targetSpatialUnitId) { - kommonitorDataExchangeService.deleteSingleSpatialUnitMetadata(id); - } - $scope.initializeOrRefreshOverviewTable(); - - $timeout(function(){ - - $scope.loadingData = false; - }); - } - - } - } - - }; - - $scope.onChangeSelectDataset = function(spatialUnitDataset){ - console.log(spatialUnitDataset.spatialUnitLevel); - }; - - $scope.onClickDeleteDatasets = function(){ - $scope.loadingData = true; - - var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedSpatialUnitsMetadata(); - - // submit selected spatial units to modal controller - $rootScope.$broadcast("onDeleteSpatialUnits", markedEntriesForDeletion); - - $timeout(function(){ - - $scope.loadingData = false; - }); - }; - - $scope.onClickEditMetadata = function(spatialUnitDataset){ - // submit selected spatial unit to modal controller - $rootScope.$broadcast("onEditSpatialUnitMetadata", spatialUnitDataset); - }; - - $scope.onClickEditFeatures = function(spatialUnitDataset){ - // submit selected spatial unit to modal controller - $rootScope.$broadcast("onEditSpatialUnitFeatures", spatialUnitDataset); - }; - } -]}); + templateUrl: "components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function SpatialUnitsManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.loadingData = true; + $scope.$on("initialMetadataLoadingCompleted", function (event) { + $timeout(function () { + $scope.initializeOrRefreshOverviewTable(); + }, 250); + }); + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + $scope.loadingData = false; + }); + $scope.initializeOrRefreshOverviewTable = function () { + $scope.loadingData = true; + kommonitorDataGridHelperService.buildDataGrid_spatialUnits(kommonitorDataExchangeService.availableSpatialUnits); + $timeout(function () { + $scope.loadingData = false; + }); + }; + $scope.$on("refreshSpatialUnitOverviewTable", function (event, crudType, targetSpatialUnitId) { + $scope.loadingData = true; + $scope.refreshSpatialUnitOverviewTable(crudType, targetSpatialUnitId); + }); + $scope.refreshSpatialUnitOverviewTable = function (crudType, targetSpatialUnitId) { + if (!crudType || !targetSpatialUnitId) { + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchSpatialUnitsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + $scope.initializeOrRefreshOverviewTable(); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(response) { + $timeout(function () { + $scope.loadingData = false; + }); + }); + } + else if (crudType && targetSpatialUnitId) { + if (crudType == "add") { + kommonitorCacheHelperService.fetchSingleSpatialUnitMetadata(targetSpatialUnitId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + kommonitorDataExchangeService.addSingleSpatialUnitMetadata(data); + $scope.initializeOrRefreshOverviewTable(); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(response) { + $timeout(function () { + $scope.loadingData = false; + }); + }); + } + else if (crudType == "edit") { + kommonitorCacheHelperService.fetchSingleSpatialUnitMetadata(targetSpatialUnitId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + kommonitorDataExchangeService.replaceSingleSpatialUnitMetadata(data); + $scope.initializeOrRefreshOverviewTable(); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(response) { + $timeout(function () { + $scope.loadingData = false; + }); + }); + } + else if (crudType == "delete") { + // targetSpatialUnitId might be array in this case + if (targetSpatialUnitId && typeof targetSpatialUnitId == "string") { + kommonitorDataExchangeService.deleteSingleSpatialUnitMetadata(targetSpatialUnitId); + $scope.initializeOrRefreshOverviewTable(); + $timeout(function () { + $scope.loadingData = false; + }); + } + else if (targetSpatialUnitId && Array.isArray(targetSpatialUnitId)) { + for (const id of targetSpatialUnitId) { + kommonitorDataExchangeService.deleteSingleSpatialUnitMetadata(id); + } + $scope.initializeOrRefreshOverviewTable(); + $timeout(function () { + $scope.loadingData = false; + }); + } + } + } + }; + $scope.onChangeSelectDataset = function (spatialUnitDataset) { + console.log(spatialUnitDataset.spatialUnitLevel); + }; + $scope.onClickDeleteDatasets = function () { + $scope.loadingData = true; + var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedSpatialUnitsMetadata(); + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteSpatialUnits", markedEntriesForDeletion); + $timeout(function () { + $scope.loadingData = false; + }); + }; + $scope.onClickEditMetadata = function (spatialUnitDataset) { + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditSpatialUnitMetadata", spatialUnitDataset); + }; + $scope.onClickEditFeatures = function (spatialUnitDataset) { + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditSpatialUnitFeatures", spatialUnitDataset); + }; + } + ] +}); +//# sourceMappingURL=admin-spatial-units-management.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.js.map b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.js.map new file mode 100644 index 000000000..088547aa3 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-spatial-units-management.component.js","sourceRoot":"","sources":["admin-spatial-units-management.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.ts b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.ts new file mode 100644 index 000000000..77c421b0a --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.component.ts @@ -0,0 +1,164 @@ +angular.module('adminSpatialUnitsManagement').component('adminSpatialUnitsManagement', { + templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', 'kommonitorDataGridHelperService', '$scope', '$timeout', '$rootScope', '__env', '$http', + function SpatialUnitsManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, kommonitorDataGridHelperService, $scope, $timeout, $rootScope, __env, $http) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.loadingData = true; + + $scope.$on("initialMetadataLoadingCompleted", function (event) { + + + $timeout(function(){ + + $scope.initializeOrRefreshOverviewTable(); + }, 250); + + }); + + $scope.$on("initialMetadataLoadingFailed", function (event, errorArray) { + + $scope.loadingData = false; + + }); + + $scope.initializeOrRefreshOverviewTable = function(){ + $scope.loadingData = true; + + kommonitorDataGridHelperService.buildDataGrid_spatialUnits(kommonitorDataExchangeService.availableSpatialUnits); + + $timeout(function(){ + + $scope.loadingData = false; + }); + }; + + $scope.$on("refreshSpatialUnitOverviewTable", function (event, crudType, targetSpatialUnitId) { + $scope.loadingData = true; + $scope.refreshSpatialUnitOverviewTable(crudType, targetSpatialUnitId); + }); + + $scope.refreshSpatialUnitOverviewTable = function(crudType, targetSpatialUnitId){ + + if(! crudType || !targetSpatialUnitId){ + // refetch all metadata from spatial units to update table + kommonitorDataExchangeService.fetchSpatialUnitsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(response) { + + $scope.initializeOrRefreshOverviewTable(); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(response) { + + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + } + else if(crudType && targetSpatialUnitId){ + if(crudType == "add"){ + kommonitorCacheHelperService.fetchSingleSpatialUnitMetadata(targetSpatialUnitId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + kommonitorDataExchangeService.addSingleSpatialUnitMetadata(data); + + $scope.initializeOrRefreshOverviewTable(); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(response) { + + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + } + else if(crudType == "edit"){ + kommonitorCacheHelperService.fetchSingleSpatialUnitMetadata(targetSpatialUnitId, kommonitorDataExchangeService.currentKeycloakLoginRoles).then(function successCallback(data) { + + kommonitorDataExchangeService.replaceSingleSpatialUnitMetadata(data); + + $scope.initializeOrRefreshOverviewTable(); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(response) { + + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + } + else if(crudType == "delete"){ + // targetSpatialUnitId might be array in this case + if(targetSpatialUnitId && typeof targetSpatialUnitId == "string"){ + kommonitorDataExchangeService.deleteSingleSpatialUnitMetadata(targetSpatialUnitId); + + $scope.initializeOrRefreshOverviewTable(); + + $timeout(function(){ + + $scope.loadingData = false; + }); + } + + else if (targetSpatialUnitId && Array.isArray(targetSpatialUnitId)){ + for (const id of targetSpatialUnitId) { + kommonitorDataExchangeService.deleteSingleSpatialUnitMetadata(id); + } + $scope.initializeOrRefreshOverviewTable(); + + $timeout(function(){ + + $scope.loadingData = false; + }); + } + + } + } + + }; + + $scope.onChangeSelectDataset = function(spatialUnitDataset){ + console.log(spatialUnitDataset.spatialUnitLevel); + }; + + $scope.onClickDeleteDatasets = function(){ + $scope.loadingData = true; + + var markedEntriesForDeletion = kommonitorDataGridHelperService.getSelectedSpatialUnitsMetadata(); + + // submit selected spatial units to modal controller + $rootScope.$broadcast("onDeleteSpatialUnits", markedEntriesForDeletion); + + $timeout(function(){ + + $scope.loadingData = false; + }); + }; + + $scope.onClickEditMetadata = function(spatialUnitDataset){ + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditSpatialUnitMetadata", spatialUnitDataset); + }; + + $scope.onClickEditFeatures = function(spatialUnitDataset){ + // submit selected spatial unit to modal controller + $rootScope.$broadcast("onEditSpatialUnitFeatures", spatialUnitDataset); + }; + } +]}); diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.js b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.js index f51f6ab05..bf87c599d 100644 --- a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.js +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminSpatialUnitsManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorDataGridHelper']); +//# sourceMappingURL=admin-spatial-units-management.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.js.map b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.js.map new file mode 100644 index 000000000..6e55fef47 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-spatial-units-management.module.js","sourceRoot":"","sources":["admin-spatial-units-management.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,6BAA6B,EAAE,CAAC,wBAAwB,EAAE,uBAAuB,EAAE,0BAA0B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.ts b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.ts new file mode 100644 index 000000000..f51f6ab05 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/admin-spatial-units-management.module.ts @@ -0,0 +1 @@ +angular.module('adminSpatialUnitsManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'kommonitorDataGridHelper']); diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.js b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.js index a12a12da1..3651eb18d 100644 --- a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.js +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.js @@ -1,864 +1,686 @@ +"use strict"; angular.module('spatialUnitAddModal').component('spatialUnitAddModal', { - templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', '$scope', '$rootScope', - '$timeout', '$http', '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', - function SpatialUnitAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, - $scope, $rootScope, $timeout, $http, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - - /* POST BODY - { - "geoJsonString": "geoJsonString", - "metadata": { - "note": "note", - "literature": "literature", - "updateInterval": "ARBITRARY", - "sridEPSG": 0.8008281904610115, - "datasource": "datasource", - "contact": "contact", - "lastUpdate": "2000-01-23", - "description": "description", - "databasis": "databasis" - }, - "jsonSchema": "jsonSchema", - "nextLowerHierarchyLevel": "nextLowerHierarchyLevel", - "spatialUnitLevel": "spatialUnitLevel", - "periodOfValidity": { - "endDate": "2000-01-23", - "startDate": "2000-01-23" - }, - "nextUpperHierarchyLevel": "nextUpperHierarchyLevel" - } - */ - - //Date picker - $('#spatialUnitAddDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#spatialUnitAddDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#spatialUnitAddLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $scope.loadingData = false; - - $scope.spatialUnitMetadataStructure = { - "metadata": { - "note": "an optional note", - "literature": "optional text about literature", - "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", - "sridEPSG": 4326, - "datasource": "text about data source", - "contact": "text about contact details", - "lastUpdate": "YYYY-MM-DD", - "description": "description about spatial unit dataset", - "databasis": "text about data basis", - }, - "allowedRoles": ['roleId'], - "nextLowerHierarchyLevel": "Name of lower hierarchy level", - "spatialUnitLevel": "Name of spatial unit dataset", - "nextUpperHierarchyLevel": "Name of upper hierarchy level" - }; - - $scope.spatialUnitMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.spatialUnitMetadataStructure); - $scope.spatialUnitMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); - - $scope.metadataImportSettings; - $scope.spatialUnitMetadataImportError; - $scope.spatialUnitMetadataImportErrorAlert; - $scope.spatialUnitMappingConfigImportError; - - $scope.spatialUnitLevel = undefined; - $scope.spatialUnitLevelInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = undefined; - $scope.metadata.literature = undefined; - $scope.metadata.updateInterval = undefined; - $scope.metadata.sridEPSG = 4326; - $scope.metadata.datasource = undefined; - $scope.metadata.databasis = undefined; - $scope.metadata.contact = undefined; - $scope.metadata.lastUpdate = undefined; - $scope.metadata.description = undefined; - - $scope.roleManagementTableOptions = undefined; - - $scope.$on("availableRolesUpdate", function (event) { - refreshRoles(); - }); - - // make sure that initial fetching of availableRoles has happened - $scope.$on("initialMetadataLoadingCompleted", function (event) { - refreshRoles(); - }); - - function refreshRoles() { - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); - } - - $scope.nextLowerHierarchySpatialUnit = undefined; - $scope.nextUpperHierarchySpatialUnit = undefined; - $scope.hierarchyInvalid = false; - - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = undefined; - $scope.periodOfValidity.endDate = undefined; - $scope.periodOfValidityInvalid = false; - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.mimeType = undefined; - $scope.datasourceType = undefined; - $scope.spatialUnitDataSourceIdProperty = undefined; - $scope.spatialUnitDataSourceNameProperty = undefined; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - $scope.importerErrors = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.postBody_spatialUnits = undefined; - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_data = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - $scope.attributeMappings_adminView = []; - $scope.keepAttributes = true; - $scope.keepMissingValues = true; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - - $scope.resetSpatialUnitAddForm = function(){ - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $scope.spatialUnitLevel = undefined; - $scope.spatialUnitLevelInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = undefined; - $scope.metadata.literature = undefined; - $scope.metadata.updateInterval = undefined; - $scope.metadata.sridEPSG = 4326; - $scope.metadata.datasource = undefined; - $scope.metadata.databasis = undefined; - $scope.metadata.contact = undefined; - $scope.metadata.lastUpdate = undefined; - $scope.metadata.description = undefined; - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); - - $scope.nextLowerHierarchySpatialUnit = undefined; - $scope.nextUpperHierarchySpatialUnit = undefined; - $scope.hierarchyInvalid = false; - - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = undefined; - $scope.periodOfValidity.endDate = undefined; - $scope.periodOfValidityInvalid = false; - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.mimeType = undefined; - $scope.datasourceType = undefined; - $scope.spatialUnitDataSourceIdProperty = undefined; - $scope.spatialUnitDataSourceNameProperty = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.postBody_spatialUnits = undefined; - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_data = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - $scope.attributeMappings_adminView = []; - $scope.keepAttributes = true; - $scope.keepMissingValues = true; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.checkSpatialUnitName = function(){ - $scope.spatialUnitLevelInvalid = false; - kommonitorDataExchangeService.availableSpatialUnits.forEach(function(spatialUnit){ - if (spatialUnit.spatialUnitLevel === $scope.spatialUnitLevel){ - $scope.spatialUnitLevelInvalid = true; - return; - } - }); - }; - - $scope.checkPeriodOfValidity = function(){ - $scope.periodOfValidityInvalid = false; - if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate){ - var startDate = new Date($scope.periodOfValidity.startDate); - var endDate = new Date($scope.periodOfValidity.endDate); - - if ((startDate === endDate) || startDate > endDate){ - // failure - $scope.periodOfValidityInvalid = true; - } - } - }; - - $scope.checkSpatialUnitHierarchy = function(){ - - $scope.hierarchyInvalid = false; - - // smaller indices represent higher spatial units - // i.e. city districts will have a smaller index than building blocks - if($scope.nextLowerHierarchySpatialUnit && $scope.nextUpperHierarchySpatialUnit){ - var indexOfLowerHierarchyUnit; - var indexOfUpperHierarchyUnit; - - for(var i=0; i { - $scope.$digest(); - }, 250); - }; - - $scope.onClickEditAttributeMapping = function(attributeMappingEntry){ - $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; - $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; - $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickDeleteAttributeMapping = function(attributeMappingEntry){ - for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { - - if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName){ - // remove object - $scope.attributeMappings_adminView.splice(index, 1); - break; - } - } - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onChangeConverter = function(schema){ - $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; - $scope.mimeType = $scope.converter.mimeTypes[0]; - }; - - $scope.onChangeMimeType = function(mimeType){ - $scope.mimeType = mimeType; - }; - - $scope.buildImporterObjects = async function(){ - $scope.converterDefinition = $scope.buildConverterDefinition(); - $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - $scope.postBody_spatialUnits = $scope.buildPostBody_spatialUnits(); - - if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.postBody_spatialUnits){ - return false; - } - - return true; - }; - - $scope.buildConverterDefinition = function(){ - - return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_spatialUnitAdd_", $scope.schema, $scope.mimeType); - }; - - $scope.buildDatasourceTypeDefinition = async function(){ - try { - return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_spatialUnitAdd_', 'spatialUnitDataSourceInput'); - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#spatialUnitAddErrorAlert").show(); - $scope.loadingData = false; - setTimeout(() => { - $scope.$digest(); - }, 250); - return null; - } - }; - - $scope.buildPropertyMappingDefinition = function(){ - // arsion from is undefined currently - return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.spatialUnitDataSourceNameProperty, $scope.spatialUnitDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); - }; - - $scope.buildPostBody_spatialUnits = function(){ - var postBody = - { - "geoJsonString": "", // will be set by importer - "metadata": { - "note": $scope.metadata.note, - "literature": $scope.metadata.literature, - "updateInterval": $scope.metadata.updateInterval.apiName, - "sridEPSG": $scope.metadata.sridEPSG, - "datasource": $scope.metadata.datasource, - "contact": $scope.metadata.contact, - "lastUpdate": $scope.metadata.lastUpdate, - "description": $scope.metadata.description, - "databasis": $scope.metadata.databasis - }, - "jsonSchema": undefined, - "allowedRoles": [], - "nextLowerHierarchyLevel": $scope.nextLowerHierarchySpatialUnit ? $scope.nextLowerHierarchySpatialUnit.spatialUnitLevel : undefined, - "spatialUnitLevel": $scope.spatialUnitLevel, - "periodOfValidity": { - "endDate": $scope.periodOfValidity.endDate, - "startDate": $scope.periodOfValidity.startDate - }, - "nextUpperHierarchyLevel": $scope.nextUpperHierarchySpatialUnit ? $scope.nextUpperHierarchySpatialUnit.spatialUnitLevel : undefined - }; - - let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); - for (const roleId of roleIds) { - postBody.allowedRoles.push(roleId); - } - - return postBody; - }; - - $scope.addSpatialUnit = async function () { - - $timeout(function(){ - $scope.loadingData = true; - }); - - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - /* - now collect data and build request for importer - */ - - /* - if any required importer data is missing --> cancel request and highlight required errors - */ - var allDataSpecified = await $scope.buildImporterObjects(); - - if (!allDataSpecified) { - - $("#spatialUnitAddForm").validator("update"); - $("#spatialUnitAddForm").validator("validate"); - return; - } - else { - - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - var newSpatialUnitResponse_dryRun = undefined; - try { - newSpatialUnitResponse_dryRun = await kommonitorImporterHelperService.registerNewSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_spatialUnits, true); - - if(! kommonitorImporterHelperService.importerResponseContainsErrors(newSpatialUnitResponse_dryRun)){ - // all good, really execute the request to import data against data management API - var newSpatialUnitResponse = await kommonitorImporterHelperService.registerNewSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_spatialUnits, false); - - $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "add", kommonitorImporterHelperService.getIdFromImporterResponse(newSpatialUnitResponse)); - - // refresh all admin dashboard diagrams due to modified metadata - $timeout(function(){ - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - }, 500); - - - $scope.successMessagePart = $scope.postBody_spatialUnits.spatialUnitLevel; - $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(newSpatialUnitResponse); - - $("#spatialUnitAddSucessAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - else{ - // errors ocurred - // show them - $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newSpatialUnitResponse_dryRun); - - $("#spatialUnitAddErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - - } - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - if(newSpatialUnitResponse_dryRun){ - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newSpatialUnitResponse_dryRun); - } - - $("#spatialUnitAddErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - } - - }; - - $scope.onImportSpatialUnitAddMetadata = function(){ - - $scope.spatialUnitMetadataImportError = ""; - - $("#spatialUnitMetadataImportFile").files = []; - - // trigger file chooser - $("#spatialUnitMetadataImportFile").click(); - - }; - - $(document).on("change", "#spatialUnitMetadataImportFile" ,function(){ - - console.log("Importing SpatialUnit metadata for Add SpatialUnit Form"); - - // get the file - var file = document.getElementById('spatialUnitMetadataImportFile').files[0]; - $scope.parseMetadataFromFile(file); - }); - - $scope.parseMetadataFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMetadataFile(event); - } - catch(error){ - console.error(error); - console.error("Uploaded Metadata File cannot be parsed."); - $scope.spatialUnitMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; - document.getElementById("spatialUnitsAddMetadataPre").innerHTML = $scope.spatialUnitMetadataStructure_pretty; - $("#spatialUnitMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMetadataFile = function(event){ - // $scope.geoJsonString = event.target.result; - $scope.metadataImportSettings = JSON.parse(event.target.result); - - if(! $scope.metadataImportSettings.metadata){ - console.error("uploaded Metadata File cannot be parsed - wrong structure."); - $scope.spatialUnitMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("spatialUnitsAddMetadataPre").innerHTML = $scope.spatialUnitMetadataStructure_pretty; - $("#spatialUnitMetadataImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.metadata = {}; - $scope.metadata.note = $scope.metadataImportSettings.metadata.note; - $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; - kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ - if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ - $scope.metadata.updateInterval = option; - } - }); - $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; - $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; - $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; - $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; - // initialize date - $('#spatialUnitAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); - - $scope.metadata.description = $scope.metadataImportSettings.metadata.description; - $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; - - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); - - for(var i=0; i { + $scope.$digest(); + }, 250); + }; + $scope.checkSpatialUnitName = function () { + $scope.spatialUnitLevelInvalid = false; + kommonitorDataExchangeService.availableSpatialUnits.forEach(function (spatialUnit) { + if (spatialUnit.spatialUnitLevel === $scope.spatialUnitLevel) { + $scope.spatialUnitLevelInvalid = true; + return; + } + }); + }; + $scope.checkPeriodOfValidity = function () { + $scope.periodOfValidityInvalid = false; + if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate) { + var startDate = new Date($scope.periodOfValidity.startDate); + var endDate = new Date($scope.periodOfValidity.endDate); + if ((startDate === endDate) || startDate > endDate) { + // failure + $scope.periodOfValidityInvalid = true; + } + } + }; + $scope.checkSpatialUnitHierarchy = function () { + $scope.hierarchyInvalid = false; + // smaller indices represent higher spatial units + // i.e. city districts will have a smaller index than building blocks + if ($scope.nextLowerHierarchySpatialUnit && $scope.nextUpperHierarchySpatialUnit) { + var indexOfLowerHierarchyUnit; + var indexOfUpperHierarchyUnit; + for (var i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + var spatialUnit = kommonitorDataExchangeService.availableSpatialUnits[i]; + if (spatialUnit.spatialUnitLevel === $scope.nextLowerHierarchySpatialUnit.spatialUnitLevel) { + indexOfLowerHierarchyUnit = i; + } + if (spatialUnit.spatialUnitLevel === $scope.nextUpperHierarchySpatialUnit.spatialUnitLevel) { + indexOfUpperHierarchyUnit = i; + } + } + if ((indexOfLowerHierarchyUnit <= indexOfUpperHierarchyUnit)) { + // failure + $scope.hierarchyInvalid = true; + } + } + }; + $scope.onAddOrUpdateAttributeMapping = function () { + var tmpAttributeMapping_adminView = { + "sourceName": $scope.attributeMapping_sourceAttributeName, + "destinationName": $scope.attributeMapping_destinationAttributeName, + "dataType": $scope.attributeMapping_attributeType + }; + var processed = false; + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; + if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName) { + // replace object + $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; + processed = true; + break; + } + } + if (!processed) { + // new entry + $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); + } + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickEditAttributeMapping = function (attributeMappingEntry) { + $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; + $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; + $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickDeleteAttributeMapping = function (attributeMappingEntry) { + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName) { + // remove object + $scope.attributeMappings_adminView.splice(index, 1); + break; + } + } + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onChangeConverter = function (schema) { + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + $scope.onChangeMimeType = function (mimeType) { + $scope.mimeType = mimeType; + }; + $scope.buildImporterObjects = async function () { + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + $scope.postBody_spatialUnits = $scope.buildPostBody_spatialUnits(); + if (!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.postBody_spatialUnits) { + return false; + } + return true; + }; + $scope.buildConverterDefinition = function () { + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_spatialUnitAdd_", $scope.schema, $scope.mimeType); + }; + $scope.buildDatasourceTypeDefinition = async function () { + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_spatialUnitAdd_', 'spatialUnitDataSourceInput'); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#spatialUnitAddErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + return null; + } + }; + $scope.buildPropertyMappingDefinition = function () { + // arsion from is undefined currently + return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.spatialUnitDataSourceNameProperty, $scope.spatialUnitDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); + }; + $scope.buildPostBody_spatialUnits = function () { + var postBody = { + "geoJsonString": "", + "metadata": { + "note": $scope.metadata.note, + "literature": $scope.metadata.literature, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description, + "databasis": $scope.metadata.databasis + }, + "jsonSchema": undefined, + "allowedRoles": [], + "nextLowerHierarchyLevel": $scope.nextLowerHierarchySpatialUnit ? $scope.nextLowerHierarchySpatialUnit.spatialUnitLevel : undefined, + "spatialUnitLevel": $scope.spatialUnitLevel, + "periodOfValidity": { + "endDate": $scope.periodOfValidity.endDate, + "startDate": $scope.periodOfValidity.startDate + }, + "nextUpperHierarchyLevel": $scope.nextUpperHierarchySpatialUnit ? $scope.nextUpperHierarchySpatialUnit.spatialUnitLevel : undefined + }; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + postBody.allowedRoles.push(roleId); + } + return postBody; + }; + $scope.addSpatialUnit = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + /* + now collect data and build request for importer + */ + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + if (!allDataSpecified) { + $("#spatialUnitAddForm").validator("update"); + $("#spatialUnitAddForm").validator("validate"); + return; + } + else { + // TODO verify input + // TODO Create and perform POST Request with loading screen + var newSpatialUnitResponse_dryRun = undefined; + try { + newSpatialUnitResponse_dryRun = await kommonitorImporterHelperService.registerNewSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_spatialUnits, true); + if (!kommonitorImporterHelperService.importerResponseContainsErrors(newSpatialUnitResponse_dryRun)) { + // all good, really execute the request to import data against data management API + var newSpatialUnitResponse = await kommonitorImporterHelperService.registerNewSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_spatialUnits, false); + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "add", kommonitorImporterHelperService.getIdFromImporterResponse(newSpatialUnitResponse)); + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function () { + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + $scope.successMessagePart = $scope.postBody_spatialUnits.spatialUnitLevel; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(newSpatialUnitResponse); + $("#spatialUnitAddSucessAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + else { + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newSpatialUnitResponse_dryRun); + $("#spatialUnitAddErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if (newSpatialUnitResponse_dryRun) { + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newSpatialUnitResponse_dryRun); + } + $("#spatialUnitAddErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + }; + $scope.onImportSpatialUnitAddMetadata = function () { + $scope.spatialUnitMetadataImportError = ""; + $("#spatialUnitMetadataImportFile").files = []; + // trigger file chooser + $("#spatialUnitMetadataImportFile").click(); + }; + $(document).on("change", "#spatialUnitMetadataImportFile", function () { + console.log("Importing SpatialUnit metadata for Add SpatialUnit Form"); + // get the file + var file = document.getElementById('spatialUnitMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + $scope.parseMetadataFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMetadataFile(event); + } + catch (error) { + console.error(error); + console.error("Uploaded Metadata File cannot be parsed."); + $scope.spatialUnitMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("spatialUnitsAddMetadataPre").innerHTML = $scope.spatialUnitMetadataStructure_pretty; + $("#spatialUnitMetadataImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMetadataFile = function (event) { + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + if (!$scope.metadataImportSettings.metadata) { + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.spatialUnitMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("spatialUnitsAddMetadataPre").innerHTML = $scope.spatialUnitMetadataStructure_pretty; + $("#spatialUnitMetadataImportErrorAlert").show(); + $scope.$digest(); + } + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function (option) { + if (option.apiName === $scope.metadataImportSettings.metadata.updateInterval) { + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#spatialUnitAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + for (var i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + var spatialUnit = kommonitorDataExchangeService.availableSpatialUnits[i]; + if (spatialUnit.spatialUnitLevel === $scope.metadataImportSettings.nextLowerHierarchyLevel) { + $scope.nextLowerHierarchySpatialUnit = spatialUnit; + } + if (spatialUnit.spatialUnitLevel === $scope.metadataImportSettings.nextUpperHierarchyLevel) { + $scope.nextUpperHierarchySpatialUnit = spatialUnit; + } + } + $scope.spatialUnitLevel = $scope.metadataImportSettings.spatialUnitLevel; + $scope.$digest(); + }; + $scope.onExportSpatialUnitAddMetadataTemplate = function () { + var metadataJSON = JSON.stringify($scope.spatialUnitMetadataStructure); + var fileName = "Raumeinheit_Metadaten_Vorlage_Export.json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onExportSpatialUnitAddMetadata = function () { + var metadataExport = $scope.spatialUnitMetadataStructure; + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.spatialUnitLevel = $scope.spatialUnitLevel || ""; + metadataExport.allowedRoles = []; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + if ($scope.metadata.updateInterval) { + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + if ($scope.nextLowerHierarchySpatialUnit) { + metadataExport.nextLowerHierarchyLevel = $scope.nextLowerHierarchySpatialUnit.spatialUnitLevel; + } + else { + metadataExport.nextLowerHierarchyLevel = ""; + } + if ($scope.nextUpperHierarchySpatialUnit) { + metadataExport.nextUpperHierarchyLevel = $scope.nextUpperHierarchySpatialUnit.spatialUnitLevel; + } + else { + metadataExport.nextUpperHierarchyLevel = ""; + } + var name = $scope.spatialUnitLevel; + var metadataJSON = JSON.stringify(metadataExport); + var fileName = "Raumeinheit_Metadaten_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onImportSpatialUnitAddMappingConfig = function () { + $scope.spatialUnitMappingConfigImportError = ""; + $("#spatialUnitMappingConfigAddImportFile").files = []; + // trigger file chooser + $("#spatialUnitMappingConfigAddImportFile").click(); + }; + $(document).on("change", "#spatialUnitMappingConfigAddImportFile", function () { + console.log("Importing Importer Mapping Config for Add SpatialUnit Form"); + // get the file + var file = document.getElementById('spatialUnitMappingConfigAddImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + $scope.parseMappingConfigFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMappingConfigFile(event); + } + catch (error) { + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.spatialUnitMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("spatialUnitsAddMappingConfigPre").innerHTML = $scope.spatialUnitMappingConfigStructure_pretty; + $("#spatialUnitMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMappingConfigFile = function (event) { + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + if (!$scope.mappingConfigImportSettings.converter || !$scope.mappingConfigImportSettings.dataSource || !$scope.mappingConfigImportSettings.propertyMapping) { + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.spatialUnitMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("spatialUnitsAddMappingConfigPre").innerHTML = $scope.spatialUnitMappingConfigStructure_pretty; + $("#spatialUnitMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + $scope.converter = undefined; + for (var converter of kommonitorImporterHelperService.availableConverters) { + if (converter.name === $scope.mappingConfigImportSettings.converter.name) { + $scope.converter = converter; + break; + } + } + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema) { + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema) { + $scope.schema = schema; + } + } + } + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType) { + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType) { + $scope.mimeType = mimeType; + } + } + } + $scope.datasourceType = undefined; + for (var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes) { + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type) { + $scope.datasourceType = datasourceType; + break; + } + } + $scope.$digest(); + // converter parameters + if ($scope.converter) { + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_spatialUnitAdd_" + convParameter.name).val(convParameter.value); + } + } + // datasourceTypes parameters + if ($scope.datasourceType) { + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_spatialUnitAdd_" + dsParameter.name).val(dsParameter.value); + } + } + // property Mapping + $scope.spatialUnitDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; + $scope.spatialUnitDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; + $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; + $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; + $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; + $scope.attributeMappings_adminView = []; + for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { + var tmpEntry = { + "sourceName": attributeMapping.name, + "destinationName": attributeMapping.mappingName + }; + for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { + if (dataType.apiName === attributeMapping.type) { + tmpEntry.dataType = dataType; + } + } + $scope.attributeMappings_adminView.push(tmpEntry); + } + if ($scope.mappingConfigImportSettings.periodOfValidity) { + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; + $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; + $scope.periodOfValidityInvalid = false; + // update datePickers + if ($scope.periodOfValidity.startDate) { + $("#spatialUnitAddDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); + } + if ($scope.periodOfValidity.endDate) { + $("#spatialUnitAddDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); + } + } + $scope.$digest(); + }; + $scope.onExportSpatialUnitAddMappingConfig = async function () { + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + }; + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + var name = $scope.spatialUnitLevel; + var metadataJSON = JSON.stringify(mappingConfigExport); + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.hideSuccessAlert = function () { + $("#spatialUnitAddSucessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#spatialUnitAddErrorAlert").hide(); + }; + $scope.hideMetadataErrorAlert = function () { + $("#spatialUnitMetadataImportErrorAlert").hide(); + }; + $scope.hideMappingConfigErrorAlert = function () { + $("#spatialUnitMappingConfigImportErrorAlert").hide(); + }; + kommonitorMultiStepFormHelperService.registerClickHandler(); + } + ] +}); +//# sourceMappingURL=spatial-unit-add-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.js.map b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.js.map new file mode 100644 index 000000000..ba6729053 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spatial-unit-add-modal.component.js","sourceRoot":"","sources":["spatial-unit-add-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.ts b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.ts new file mode 100644 index 000000000..a12a12da1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.component.ts @@ -0,0 +1,864 @@ +angular.module('spatialUnitAddModal').component('spatialUnitAddModal', { + templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitAddModal/spatial-unit-add-modal.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorImporterHelperService', '$scope', '$rootScope', + '$timeout', '$http', '__env', 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', + function SpatialUnitAddModalController(kommonitorDataExchangeService, kommonitorImporterHelperService, + $scope, $rootScope, $timeout, $http, __env, kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + + /* POST BODY + { + "geoJsonString": "geoJsonString", + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "jsonSchema": "jsonSchema", + "nextLowerHierarchyLevel": "nextLowerHierarchyLevel", + "spatialUnitLevel": "spatialUnitLevel", + "periodOfValidity": { + "endDate": "2000-01-23", + "startDate": "2000-01-23" + }, + "nextUpperHierarchyLevel": "nextUpperHierarchyLevel" + } + */ + + //Date picker + $('#spatialUnitAddDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#spatialUnitAddDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#spatialUnitAddLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + + $scope.loadingData = false; + + $scope.spatialUnitMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "nextLowerHierarchyLevel": "Name of lower hierarchy level", + "spatialUnitLevel": "Name of spatial unit dataset", + "nextUpperHierarchyLevel": "Name of upper hierarchy level" + }; + + $scope.spatialUnitMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.spatialUnitMetadataStructure); + $scope.spatialUnitMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); + + $scope.metadataImportSettings; + $scope.spatialUnitMetadataImportError; + $scope.spatialUnitMetadataImportErrorAlert; + $scope.spatialUnitMappingConfigImportError; + + $scope.spatialUnitLevel = undefined; + $scope.spatialUnitLevelInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = 4326; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + + $scope.roleManagementTableOptions = undefined; + + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + + // make sure that initial fetching of availableRoles has happened + $scope.$on("initialMetadataLoadingCompleted", function (event) { + refreshRoles(); + }); + + function refreshRoles() { + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + } + + $scope.nextLowerHierarchySpatialUnit = undefined; + $scope.nextUpperHierarchySpatialUnit = undefined; + $scope.hierarchyInvalid = false; + + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.importerErrors = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.postBody_spatialUnits = undefined; + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + + $scope.resetSpatialUnitAddForm = function(){ + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $scope.spatialUnitLevel = undefined; + $scope.spatialUnitLevelInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = 4326; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, kommonitorDataExchangeService.getCurrentKomMonitorLoginRoleIds()); + + $scope.nextLowerHierarchySpatialUnit = undefined; + $scope.nextUpperHierarchySpatialUnit = undefined; + $scope.hierarchyInvalid = false; + + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.postBody_spatialUnits = undefined; + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.checkSpatialUnitName = function(){ + $scope.spatialUnitLevelInvalid = false; + kommonitorDataExchangeService.availableSpatialUnits.forEach(function(spatialUnit){ + if (spatialUnit.spatialUnitLevel === $scope.spatialUnitLevel){ + $scope.spatialUnitLevelInvalid = true; + return; + } + }); + }; + + $scope.checkPeriodOfValidity = function(){ + $scope.periodOfValidityInvalid = false; + if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate){ + var startDate = new Date($scope.periodOfValidity.startDate); + var endDate = new Date($scope.periodOfValidity.endDate); + + if ((startDate === endDate) || startDate > endDate){ + // failure + $scope.periodOfValidityInvalid = true; + } + } + }; + + $scope.checkSpatialUnitHierarchy = function(){ + + $scope.hierarchyInvalid = false; + + // smaller indices represent higher spatial units + // i.e. city districts will have a smaller index than building blocks + if($scope.nextLowerHierarchySpatialUnit && $scope.nextUpperHierarchySpatialUnit){ + var indexOfLowerHierarchyUnit; + var indexOfUpperHierarchyUnit; + + for(var i=0; i { + $scope.$digest(); + }, 250); + }; + + $scope.onClickEditAttributeMapping = function(attributeMappingEntry){ + $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; + $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; + $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickDeleteAttributeMapping = function(attributeMappingEntry){ + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + + if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName){ + // remove object + $scope.attributeMappings_adminView.splice(index, 1); + break; + } + } + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onChangeConverter = function(schema){ + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + + $scope.onChangeMimeType = function(mimeType){ + $scope.mimeType = mimeType; + }; + + $scope.buildImporterObjects = async function(){ + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + $scope.postBody_spatialUnits = $scope.buildPostBody_spatialUnits(); + + if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.postBody_spatialUnits){ + return false; + } + + return true; + }; + + $scope.buildConverterDefinition = function(){ + + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_spatialUnitAdd_", $scope.schema, $scope.mimeType); + }; + + $scope.buildDatasourceTypeDefinition = async function(){ + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_spatialUnitAdd_', 'spatialUnitDataSourceInput'); + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#spatialUnitAddErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + return null; + } + }; + + $scope.buildPropertyMappingDefinition = function(){ + // arsion from is undefined currently + return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.spatialUnitDataSourceNameProperty, $scope.spatialUnitDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); + }; + + $scope.buildPostBody_spatialUnits = function(){ + var postBody = + { + "geoJsonString": "", // will be set by importer + "metadata": { + "note": $scope.metadata.note, + "literature": $scope.metadata.literature, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description, + "databasis": $scope.metadata.databasis + }, + "jsonSchema": undefined, + "allowedRoles": [], + "nextLowerHierarchyLevel": $scope.nextLowerHierarchySpatialUnit ? $scope.nextLowerHierarchySpatialUnit.spatialUnitLevel : undefined, + "spatialUnitLevel": $scope.spatialUnitLevel, + "periodOfValidity": { + "endDate": $scope.periodOfValidity.endDate, + "startDate": $scope.periodOfValidity.startDate + }, + "nextUpperHierarchyLevel": $scope.nextUpperHierarchySpatialUnit ? $scope.nextUpperHierarchySpatialUnit.spatialUnitLevel : undefined + }; + + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + postBody.allowedRoles.push(roleId); + } + + return postBody; + }; + + $scope.addSpatialUnit = async function () { + + $timeout(function(){ + $scope.loadingData = true; + }); + + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + /* + now collect data and build request for importer + */ + + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + + if (!allDataSpecified) { + + $("#spatialUnitAddForm").validator("update"); + $("#spatialUnitAddForm").validator("validate"); + return; + } + else { + + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + var newSpatialUnitResponse_dryRun = undefined; + try { + newSpatialUnitResponse_dryRun = await kommonitorImporterHelperService.registerNewSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_spatialUnits, true); + + if(! kommonitorImporterHelperService.importerResponseContainsErrors(newSpatialUnitResponse_dryRun)){ + // all good, really execute the request to import data against data management API + var newSpatialUnitResponse = await kommonitorImporterHelperService.registerNewSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.postBody_spatialUnits, false); + + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "add", kommonitorImporterHelperService.getIdFromImporterResponse(newSpatialUnitResponse)); + + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function(){ + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + + + $scope.successMessagePart = $scope.postBody_spatialUnits.spatialUnitLevel; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(newSpatialUnitResponse); + + $("#spatialUnitAddSucessAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + else{ + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newSpatialUnitResponse_dryRun); + + $("#spatialUnitAddErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + + } + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + if(newSpatialUnitResponse_dryRun){ + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(newSpatialUnitResponse_dryRun); + } + + $("#spatialUnitAddErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + + }; + + $scope.onImportSpatialUnitAddMetadata = function(){ + + $scope.spatialUnitMetadataImportError = ""; + + $("#spatialUnitMetadataImportFile").files = []; + + // trigger file chooser + $("#spatialUnitMetadataImportFile").click(); + + }; + + $(document).on("change", "#spatialUnitMetadataImportFile" ,function(){ + + console.log("Importing SpatialUnit metadata for Add SpatialUnit Form"); + + // get the file + var file = document.getElementById('spatialUnitMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + + $scope.parseMetadataFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMetadataFile(event); + } + catch(error){ + console.error(error); + console.error("Uploaded Metadata File cannot be parsed."); + $scope.spatialUnitMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("spatialUnitsAddMetadataPre").innerHTML = $scope.spatialUnitMetadataStructure_pretty; + $("#spatialUnitMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMetadataFile = function(event){ + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + + if(! $scope.metadataImportSettings.metadata){ + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.spatialUnitMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("spatialUnitsAddMetadataPre").innerHTML = $scope.spatialUnitMetadataStructure_pretty; + $("#spatialUnitMetadataImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ + if(option.apiName === $scope.metadataImportSettings.metadata.updateInterval){ + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#spatialUnitAddLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitAddRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + + for(var i=0; i 0){ - // error handling - $("#spatialUnitsDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#spatialUnitsDeleteSuccessAlert").show(); - // } - } - if($scope.successfullyDeletedDatasets.length > 0){ - $("#spatialUnitsDeleteSuccessAlert").show(); - - // fetch indicatorMetada again as a spatialUnit was deleted - await kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - // refresh spatial unit overview table - $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => {return dataset.spatialUnitId;})); - - // refresh all admin dashboard diagrams due to modified metadata - $timeout(function(){ - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - }, 500); - } - - $timeout(function(){ - - $scope.loadingData = false; - }); - }, function errorCallback(errorArray) { - - $("#spatialUnitsDeleteErrorAlert").show(); - // if ($scope.successfullyDeletedDatasets.length > 0){ - // $("#spatialUnitsDeleteSuccessAlert").show(); - // } - - $rootScope.$broadcast("refreshSpatialUnitOverviewTable"); - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - - }; - - $scope.getDeleteDatasetPromise = function(dataset){ - return $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/spatial-units/" + dataset.spatialUnitId, - method: "DELETE" - }).then(function successCallback(response) { - $scope.successfullyDeletedDatasets.push(dataset); - - // remove entry from array - var index = -1; - - for(var i=0; i< kommonitorDataExchangeService.availableSpatialUnits.length; i++){ - if(kommonitorDataExchangeService.availableSpatialUnits[i].spatialUnitId === dataset.spatialUnitId){ - index = i; - break; - } - } - - if (index > -1) { - kommonitorDataExchangeService.availableSpatialUnits.splice(index, 1); - } - - }, function errorCallback(error) { - if(error.data){ - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); - } - else{ - $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); - } - - }); - }; - - $scope.hideSuccessAlert = function(){ - $("#spatialUnitsDeleteSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#spatialUnitsDeleteErrorAlert").hide(); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function SpatialUnitDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.datasetsToDelete = []; + $scope.loadingData = false; + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $scope.$on("onDeleteSpatialUnits", function (event, datasets) { + $scope.loadingData = true; + $scope.datasetsToDelete = datasets; + $scope.resetSpatialUnitsDeleteForm(); + $timeout(function () { + $scope.loadingData = false; + }); + }); + $scope.resetSpatialUnitsDeleteForm = function () { + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $("#spatialUnitsDeleteSuccessAlert").hide(); + $("#spatialUnitsDeleteErrorAlert").hide(); + }; + $scope.deleteSpatialUnits = function () { + // TODO verify input + // TODO Create and perform POST Request with loading screen + $scope.loadingData = true; + var deletePromises = []; + $scope.datasetsToDelete.forEach(function (dataset) { + deletePromises.push($scope.getDeleteDatasetPromise(dataset)); + }); + $q.all(deletePromises).then(async function successCallback(successArray) { + // + if ($scope.failedDatasetsAndErrors.length > 0) { + // error handling + $("#spatialUnitsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#spatialUnitsDeleteSuccessAlert").show(); + // } + } + if ($scope.successfullyDeletedDatasets.length > 0) { + $("#spatialUnitsDeleteSuccessAlert").show(); + // fetch indicatorMetada again as a spatialUnit was deleted + await kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + // refresh spatial unit overview table + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => { return dataset.spatialUnitId; })); + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function () { + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + } + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(errorArray) { + $("#spatialUnitsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#spatialUnitsDeleteSuccessAlert").show(); + // } + $rootScope.$broadcast("refreshSpatialUnitOverviewTable"); + $timeout(function () { + $scope.loadingData = false; + }); + }); + }; + $scope.getDeleteDatasetPromise = function (dataset) { + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/spatial-units/" + dataset.spatialUnitId, + method: "DELETE" + }).then(function successCallback(response) { + $scope.successfullyDeletedDatasets.push(dataset); + // remove entry from array + var index = -1; + for (var i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + if (kommonitorDataExchangeService.availableSpatialUnits[i].spatialUnitId === dataset.spatialUnitId) { + index = i; + break; + } + } + if (index > -1) { + kommonitorDataExchangeService.availableSpatialUnits.splice(index, 1); + } + }, function errorCallback(error) { + if (error.data) { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else { + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + }); + }; + $scope.hideSuccessAlert = function () { + $("#spatialUnitsDeleteSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#spatialUnitsDeleteErrorAlert").hide(); + }; + } + ] +}); +//# sourceMappingURL=spatial-unit-delete-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.component.js.map b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.component.js.map new file mode 100644 index 000000000..6b5a72139 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spatial-unit-delete-modal.component.js","sourceRoot":"","sources":["spatial-unit-delete-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.component.ts b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.component.ts new file mode 100644 index 000000000..424e6c6c0 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.component.ts @@ -0,0 +1,133 @@ +angular.module('spatialUnitDeleteModal').component('spatialUnitDeleteModal', { + templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function SpatialUnitDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.datasetsToDelete = []; + + $scope.loadingData = false; + + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + + $scope.$on("onDeleteSpatialUnits", function (event, datasets) { + $scope.loadingData = true; + + $scope.datasetsToDelete = datasets; + $scope.resetSpatialUnitsDeleteForm(); + + $timeout(function(){ + $scope.loadingData = false; + }); + }); + + + $scope.resetSpatialUnitsDeleteForm = function(){ + + $scope.successfullyDeletedDatasets = []; + $scope.failedDatasetsAndErrors = []; + $("#spatialUnitsDeleteSuccessAlert").hide(); + $("#spatialUnitsDeleteErrorAlert").hide(); + }; + + $scope.deleteSpatialUnits = function(){ + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + $scope.loadingData = true; + + var deletePromises = []; + + $scope.datasetsToDelete.forEach(function(dataset){ + deletePromises.push($scope.getDeleteDatasetPromise(dataset)); + }); + + $q.all(deletePromises).then(async function successCallback(successArray) { + // + + if($scope.failedDatasetsAndErrors.length > 0){ + // error handling + $("#spatialUnitsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#spatialUnitsDeleteSuccessAlert").show(); + // } + } + if($scope.successfullyDeletedDatasets.length > 0){ + $("#spatialUnitsDeleteSuccessAlert").show(); + + // fetch indicatorMetada again as a spatialUnit was deleted + await kommonitorDataExchangeService.fetchIndicatorsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + // refresh spatial unit overview table + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "delete", $scope.successfullyDeletedDatasets.map(dataset => {return dataset.spatialUnitId;})); + + // refresh all admin dashboard diagrams due to modified metadata + $timeout(function(){ + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + }, 500); + } + + $timeout(function(){ + + $scope.loadingData = false; + }); + }, function errorCallback(errorArray) { + + $("#spatialUnitsDeleteErrorAlert").show(); + // if ($scope.successfullyDeletedDatasets.length > 0){ + // $("#spatialUnitsDeleteSuccessAlert").show(); + // } + + $rootScope.$broadcast("refreshSpatialUnitOverviewTable"); + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + + }; + + $scope.getDeleteDatasetPromise = function(dataset){ + return $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/spatial-units/" + dataset.spatialUnitId, + method: "DELETE" + }).then(function successCallback(response) { + $scope.successfullyDeletedDatasets.push(dataset); + + // remove entry from array + var index = -1; + + for(var i=0; i< kommonitorDataExchangeService.availableSpatialUnits.length; i++){ + if(kommonitorDataExchangeService.availableSpatialUnits[i].spatialUnitId === dataset.spatialUnitId){ + index = i; + break; + } + } + + if (index > -1) { + kommonitorDataExchangeService.availableSpatialUnits.splice(index, 1); + } + + }, function errorCallback(error) { + if(error.data){ + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error.data)]); + } + else{ + $scope.failedDatasetsAndErrors.push([dataset, kommonitorDataExchangeService.syntaxHighlightJSON(error)]); + } + + }); + }; + + $scope.hideSuccessAlert = function(){ + $("#spatialUnitsDeleteSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#spatialUnitsDeleteErrorAlert").hide(); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.js b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.js index 9684858f1..70bc97e9e 100644 --- a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.js +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('spatialUnitDeleteModal', []); +//# sourceMappingURL=spatial-unit-delete-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.js.map b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.js.map new file mode 100644 index 000000000..1862fd932 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spatial-unit-delete-modal.module.js","sourceRoot":"","sources":["spatial-unit-delete-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.ts b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.ts new file mode 100644 index 000000000..9684858f1 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitDeleteModal/spatial-unit-delete-modal.module.ts @@ -0,0 +1 @@ +angular.module('spatialUnitDeleteModal', []); diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.js b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.js index 3fab16074..8d91469ae 100644 --- a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.js +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.js @@ -1,740 +1,577 @@ +"use strict"; angular.module('spatialUnitEditFeaturesModal').component('spatialUnitEditFeaturesModal', { - templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorImporterHelperService', - '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', - function SpatialUnitEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, - kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; - this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; - - /* POST BODY - { - "geoJsonString": "geoJsonString", - "metadata": { - "note": "note", - "literature": "literature", - "updateInterval": "ARBITRARY", - "sridEPSG": 0.8008281904610115, - "datasource": "datasource", - "contact": "contact", - "lastUpdate": "2000-01-23", - "description": "description", - "databasis": "databasis" - }, - "jsonSchema": "jsonSchema", - "nextLowerHierarchyLevel": "nextLowerHierarchyLevel", - "spatialUnitLevel": "spatialUnitLevel", - "periodOfValidity": { - "endDate": "2000-01-23", - "startDate": "2000-01-23" - }, - "nextUpperHierarchyLevel": "nextUpperHierarchyLevel" - } - */ - - //Date picker - $('#spatialUnitEditFeaturesDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); - $('#spatialUnitEditFeaturesDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $scope.spatialUnitFeaturesGeoJSON; - $scope.currentSpatialUnitDataset; - $scope.remainingFeatureHeaders; - - $scope.spatialUnitMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); - $scope.spatialUnitMappingConfigImportError; - - $scope.loadingData = false; - - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = undefined; - $scope.periodOfValidity.endDate = undefined; - $scope.periodOfValidityInvalid = false; - - $scope.geoJsonString = undefined; - $scope.spatialUnit_asGeoJson = undefined; - - $scope.spatialUnitEditFeaturesDataSourceInputInvalidReason = undefined; - $scope.spatialUnitEditFeaturesDataSourceInputInvalid = false; - $scope.spatialUnitDataSourceIdProperty = undefined; - $scope.spatialUnitDataSourceNameProperty = undefined; - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.mimeType = undefined; - $scope.datasourceType = undefined; - $scope.spatialUnitDataSourceIdProperty = undefined; - $scope.spatialUnitDataSourceNameProperty = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.putBody_spatialUnits = undefined; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_data = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - $scope.attributeMappings_adminView = []; - $scope.keepAttributes = true; - $scope.keepMissingValues = true; - - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $scope.$on("onEditSpatialUnitFeatures", function (event, spatialUnitDataset) { - - kommonitorMultiStepFormHelperService.registerClickHandler(); - - if($scope.currentSpatialUnitDataset && $scope.currentSpatialUnitDataset.spatialUnitLevel === spatialUnitDataset.spatialUnitLevel){ - return; - } - else{ - $scope.currentSpatialUnitDataset = spatialUnitDataset; - - // $scope.refreshSpatialUnitEditFeaturesOverviewTable(); - - $scope.resetSpatialUnitEditFeaturesForm(); - - kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", [], []); - } - - - - }); - - $scope.onChangeConverter = function(schema){ - $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; - $scope.mimeType = $scope.converter.mimeTypes[0]; - }; - - $scope.onChangeMimeType = function(mimeType){ - $scope.mimeType = mimeType; - }; - - $scope.refreshSpatialUnitEditFeaturesOverviewTable = function(){ - - $scope.loadingData = true; - // fetch all spatial unit features - $http({ - url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/spatial-units/" + $scope.currentSpatialUnitDataset.spatialUnitId + "/allFeatures", - method: "GET", - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $scope.spatialUnitFeaturesGeoJSON = response.data; - - var tmpRemainingHeaders = []; - - for (var property in $scope.spatialUnitFeaturesGeoJSON.features[0].properties){ - if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME){ - tmpRemainingHeaders.push(property); - } - } - - $scope.remainingFeatureHeaders = tmpRemainingHeaders; - - kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", tmpRemainingHeaders, $scope.spatialUnitFeaturesGeoJSON.features, $scope.currentSpatialUnitDataset.spatialUnitId, kommonitorDataGridHelperService.resourceType_spatialUnit, $scope.enableDeleteFeatures); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#spatialUnitEditFeaturesErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - }; - - $scope.clearAllSpatialUnitFeatures = function(){ - $scope.loadingData = true; - // delete all georesource features - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/spatial-units/" + $scope.currentSpatialUnitDataset.spatialUnitId + "/allFeatures", - method: "DELETE", - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $scope.spatialUnitFeaturesGeoJSON = undefined; - $scope.remainingFeatureHeaders = undefined; - - $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); - // $scope.refreshGeoresourceEditFeaturesOverviewTable(); - // force empty feature overview table on successful deletion of entries - kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", [], []); - - $scope.successMessagePart = $scope.currentSpatialUnitDataset.spatialUnitLevel; - - $("#spatialUnitEditFeaturesSuccessAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#spatialUnitEditFeaturesErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - }; - - $scope.resetSpatialUnitEditFeaturesForm = function(){ - - // reset edit banners - kommonitorDataGridHelperService.featureTable_spatialUnit_lastUpdate_timestamp_success = undefined; - kommonitorDataGridHelperService.featureTable_spatialUnit_lastUpdate_timestamp_failure = undefined; - - $scope.spatialUnitFeaturesGeoJSON = undefined; - $scope.remainingFeatureHeaders = undefined; - - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = undefined; - $scope.periodOfValidity.endDate = undefined; - $scope.periodOfValidityInvalid = false; - - $scope.geoJsonString = undefined; - $scope.spatialUnit_asGeoJson = undefined; - - $scope.spatialUnitEditFeaturesDataSourceInputInvalidReason = undefined; - $scope.spatialUnitEditFeaturesDataSourceInputInvalid = false; - $scope.spatialUnitDataSourceIdProperty = undefined; - $scope.spatialUnitDataSourceNameProperty = undefined; - - $scope.converter = undefined; - $scope.schema = undefined; - $scope.mimeType = undefined; - $scope.datasourceType = undefined; - $scope.spatialUnitDataSourceIdProperty = undefined; - $scope.spatialUnitDataSourceNameProperty = undefined; - - $scope.converterDefinition = undefined; - $scope.datasourceTypeDefinition = undefined; - $scope.propertyMappingDefinition = undefined; - $scope.putBody_spatialUnits = undefined; - - $scope.validityEndDate_perFeature = undefined; - $scope.validityStartDate_perFeature = undefined; - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_data = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - $scope.attributeMappings_adminView = []; - $scope.keepAttributes = true; - $scope.keepMissingValues = true; - - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $("#spatialUnitEditFeaturesSuccessAlert").hide(); - $("#spatialUnitEditFeaturesErrorAlert").hide(); - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.filterByKomMonitorProperties = function() { - return function( item ) { - - try{ - if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate"){ - return false; - } - return true; - } - catch(error){ - return false; - } - }; - }; - - $scope.getFeatureId = function(geojsonFeature){ - return geojsonFeature.properties[__env.FEATURE_ID_PROPERTY_NAME]; - }; - - $scope.getFeatureName = function(geojsonFeature){ - return geojsonFeature.properties[__env.FEATURE_NAME_PROPERTY_NAME]; - }; - - $scope.checkPeriodOfValidity = function(){ - $scope.periodOfValidityInvalid = false; - if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate){ - var startDate = new Date($scope.periodOfValidity.startDate); - var endDate = new Date($scope.periodOfValidity.endDate); - - if ((startDate === endDate) || startDate > endDate){ - // failure - $scope.periodOfValidityInvalid = true; - } - } - }; - - $scope.onAddOrUpdateAttributeMapping = function(){ - var tmpAttributeMapping_adminView = { - "sourceName": $scope.attributeMapping_sourceAttributeName, - "destinationName": $scope.attributeMapping_destinationAttributeName, - "dataType": $scope.attributeMapping_attributeType - }; - - var processed = false; - - for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { - var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; - - if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName){ - // replace object - $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; - processed = true; - break; - } - } - - if(! processed){ - // new entry - $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); - } - - $scope.attributeMapping_sourceAttributeName = undefined; - $scope.attributeMapping_destinationAttributeName = undefined; - $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickEditAttributeMapping = function(attributeMappingEntry){ - $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; - $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; - $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.onClickDeleteAttributeMapping = function(attributeMappingEntry){ - for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { - - if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName){ - // remove object - $scope.attributeMappings_adminView.splice(index, 1); - break; - } - } - - setTimeout(() => { - $scope.$digest(); - }, 250); - }; - - $scope.buildImporterObjects = async function(){ - $scope.converterDefinition = $scope.buildConverterDefinition(); - $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - $scope.putBody_spatialUnits = $scope.buildPutBody_spatialUnits(); - - if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_spatialUnits){ - return false; - } - - return true; - }; - - $scope.buildConverterDefinition = function(){ - - return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_spatialUnitEditFeatures_", $scope.schema, $scope.mimeType); - }; - - $scope.buildDatasourceTypeDefinition = async function(){ - try { - return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_spatialUnitEditFeatures_', 'spatialUnitDataSourceInput_editFeatures'); - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#spatialUnitEditFeaturesErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - return null; - } - }; - - $scope.buildPropertyMappingDefinition = function(){ - // arsion from is undefined currently - return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.spatialUnitDataSourceNameProperty, $scope.spatialUnitDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); - }; - - $scope.buildPutBody_spatialUnits = function(){ - var putBody = - { - "geoJsonString": "", // will be set by importer - "periodOfValidity": { - "endDate": $scope.periodOfValidity.endDate, - "startDate": $scope.periodOfValidity.startDate - }, - "isPartialUpdate": $scope.isPartialUpdate - }; - - return putBody; - }; - - - $scope.editSpatialUnitFeatures = async function(){ - - $timeout(function(){ - $scope.loadingData = true; - }); - - $scope.importerErrors = undefined; - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - /* - now collect data and build request for importer - */ - - /* - if any required importer data is missing --> cancel request and highlight required errors - */ - var allDataSpecified = await $scope.buildImporterObjects(); - - if (!allDataSpecified) { - - $("#spatialUnitEditFeaturesForm").validator("update"); - $("#spatialUnitEditFeaturesForm").validator("validate"); - return; - } - else { - - - // TODO verify input - - // TODO Create and perform POST Request with loading screen - - var updateSpatialUnitResponse_dryRun = undefined; - try { - updateSpatialUnitResponse_dryRun = await kommonitorImporterHelperService.updateSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentSpatialUnitDataset.spatialUnitId, $scope.putBody_spatialUnits, true); - - if(! kommonitorImporterHelperService.importerResponseContainsErrors(updateSpatialUnitResponse_dryRun)){ - // all good, really execute the request to import data against data management API - - var updateSpatialUnitResponse = await kommonitorImporterHelperService.updateSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentSpatialUnitDataset.spatialUnitId, $scope.putBody_spatialUnits, false); - $scope.successMessagePart = $scope.putBody_spatialUnits.spatialUnitLevel; - $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateSpatialUnitResponse); - - $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); - // $scope.refreshSpatialUnitEditFeaturesOverviewTable(); - - $scope.successMessagePart = $scope.currentSpatialUnitDataset.spatialUnitLevel; - - $("#spatialUnitEditFeaturesSuccessAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - } - else{ - // errors ocurred - // show them - $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateSpatialUnitResponse_dryRun); - - $("#spatialUnitEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - - } - - } catch (error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - if(updateSpatialUnitResponse_dryRun){ - $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateSpatialUnitResponse_dryRun); - } - - $("#spatialUnitEditFeaturesErrorAlert").show(); - $scope.loadingData = false; - - setTimeout(() => { - $scope.$digest(); - }, 250); - } - } - }; - - $scope.onImportSpatialUnitEditFeaturesMappingConfig = function(){ - - $scope.spatialUnitMappingConfigImportError = ""; - - $("#spatialUnitMappingConfigEditFeaturesImportFile").files = []; - - // trigger file chooser - $("#spatialUnitMappingConfigEditFeaturesImportFile").click(); - - }; - - $(document).on("change", "#spatialUnitMappingConfigEditFeaturesImportFile" ,function(){ - - console.log("Importing Importer Mapping Config for EditFeatures SpatialUnit Form"); - - // get the file - var file = document.getElementById('spatialUnitMappingConfigEditFeaturesImportFile').files[0]; - $scope.parseMappingConfigFromFile(file); - }); - - $scope.parseMappingConfigFromFile = function(file){ - var fileReader = new FileReader(); - - fileReader.onload = function(event) { - - try{ - $scope.parseFromMappingConfigFile(event); - } - catch(error){ - console.error(error); - console.error("Uploaded MappingConfig File cannot be parsed."); - $scope.spatialUnitMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; - document.getElementById("spatialUnitsEditFeaturesMappingConfigPre").innerHTML = $scope.spatialUnitMappingConfigStructure_pretty; - $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").show(); - - $scope.$digest(); - } - - }; - - // Read in the image file as a data URL. - fileReader.readAsText(file); - }; - - $scope.parseFromMappingConfigFile = function(event){ - $scope.mappingConfigImportSettings = JSON.parse(event.target.result); - - if(! $scope.mappingConfigImportSettings.converter || ! $scope.mappingConfigImportSettings.dataSource || ! $scope.mappingConfigImportSettings.propertyMapping){ - console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); - $scope.spatialUnitMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; - document.getElementById("spatialUnitsEditFeaturesMappingConfigPre").innerHTML = $scope.spatialUnitMappingConfigStructure_pretty; - $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").show(); - - $scope.$digest(); - } - - $scope.converter = undefined; - for(var converter of kommonitorImporterHelperService.availableConverters){ - if (converter.name === $scope.mappingConfigImportSettings.converter.name){ - $scope.converter = converter; - break; - } - } - - $scope.schema = undefined; - if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema){ - for (var schema of $scope.converter.schemas) { - if (schema === $scope.mappingConfigImportSettings.converter.schema){ - $scope.schema = schema; - } - } - } - - $scope.mimeType = undefined; - if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType){ - for (var mimeType of $scope.converter.mimeTypes) { - if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType){ - $scope.mimeType = mimeType; - } - } - } - - $scope.datasourceType = undefined; - for(var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes){ - if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type){ - $scope.datasourceType = datasourceType; - break; - } - } - - $scope.$digest(); - - // converter parameters - if ($scope.converter){ - for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { - $("#converterParameter_spatialUnitEditFeatures_" + convParameter.name).val(convParameter.value); - } - } - - // datasourceTypes parameters - if ($scope.datasourceType){ - for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { - $("#datasourceTypeParameter_spatialUnitEditFeatures_" + dsParameter.name).val(dsParameter.value); - } - } - - // property Mapping - $scope.spatialUnitDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; - $scope.spatialUnitDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; - $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; - $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; - $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; - $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; - $scope.attributeMappings_adminView = []; - - for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { - var tmpEntry = { - "sourceName": attributeMapping.name, - "destinationName": attributeMapping.mappingName - }; - - for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { - if (dataType.apiName === attributeMapping.type){ - tmpEntry.dataType = dataType; - } - } - - $scope.attributeMappings_adminView.push(tmpEntry); - } - - if ($scope.mappingConfigImportSettings.periodOfValidity){ - $scope.periodOfValidity = {}; - $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; - $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; - $scope.periodOfValidityInvalid = false; - - // update datePickers - if ($scope.periodOfValidity.startDate){ - $("#spatialUnitEditFeaturesDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); - } - if ($scope.periodOfValidity.endDate){ - $("#spatialUnitEditFeaturesDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); - } - } - - $scope.$digest(); - }; - - $scope.onExportSpatialUnitEditFeaturesMappingConfig = async function(){ - var converterDefinition = $scope.buildConverterDefinition(); - var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); - var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); - - var mappingConfigExport = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - }; - - mappingConfigExport.periodOfValidity = $scope.periodOfValidity; - - var name = $scope.spatialUnitLevel; - - var metadataJSON = JSON.stringify(mappingConfigExport); - - var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; - - if (name){ - fileName += "-" + name; - } - - fileName += ".json"; - - var blob = new Blob([metadataJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - var a = document.createElement('a'); - a.download = fileName; - a.href = data; - a.textContent = "JSON"; - a.target = "_blank"; - a.rel = "noopener noreferrer"; - a.click(); - - a.remove(); - }; - - - $scope.hideSuccessAlert = function(){ - $("#spatialUnitEditFeaturesSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#spatialUnitEditFeaturesErrorAlert").hide(); - }; - - $scope.hideMappingConfigErrorAlert = function(){ - $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").hide(); - }; - - $scope.onChangeEnableDeleteFeatures = function(){ - if($scope.enableDeleteFeatures){ - $(".spatialUnitDeleteFeatureRecordBtn").attr("disabled", false); - } - else{ - $(".spatialUnitDeleteFeatureRecordBtn").attr("disabled", true); - } - } - - $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function(event){ - $timeout(function(){ - - $scope.loadingData = true; - }); - }); - - $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function(event){ - $timeout(function(){ - - $scope.loadingData = false; - }); - }); - - $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function(event){ - $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); - $scope.refreshSpatialUnitEditFeaturesOverviewTable(); - }); - - } -]}); + templateUrl: "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorImporterHelperService', + '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + function SpatialUnitEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; + /* POST BODY + { + "geoJsonString": "geoJsonString", + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "jsonSchema": "jsonSchema", + "nextLowerHierarchyLevel": "nextLowerHierarchyLevel", + "spatialUnitLevel": "spatialUnitLevel", + "periodOfValidity": { + "endDate": "2000-01-23", + "startDate": "2000-01-23" + }, + "nextUpperHierarchyLevel": "nextUpperHierarchyLevel" + } + */ + //Date picker + $('#spatialUnitEditFeaturesDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#spatialUnitEditFeaturesDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + $scope.spatialUnitFeaturesGeoJSON; + $scope.currentSpatialUnitDataset; + $scope.remainingFeatureHeaders; + $scope.spatialUnitMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); + $scope.spatialUnitMappingConfigImportError; + $scope.loadingData = false; + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + $scope.geoJsonString = undefined; + $scope.spatialUnit_asGeoJson = undefined; + $scope.spatialUnitEditFeaturesDataSourceInputInvalidReason = undefined; + $scope.spatialUnitEditFeaturesDataSourceInputInvalid = false; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_spatialUnits = undefined; + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $scope.$on("onEditSpatialUnitFeatures", function (event, spatialUnitDataset) { + kommonitorMultiStepFormHelperService.registerClickHandler(); + if ($scope.currentSpatialUnitDataset && $scope.currentSpatialUnitDataset.spatialUnitLevel === spatialUnitDataset.spatialUnitLevel) { + return; + } + else { + $scope.currentSpatialUnitDataset = spatialUnitDataset; + // $scope.refreshSpatialUnitEditFeaturesOverviewTable(); + $scope.resetSpatialUnitEditFeaturesForm(); + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", [], []); + } + }); + $scope.onChangeConverter = function (schema) { + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + $scope.onChangeMimeType = function (mimeType) { + $scope.mimeType = mimeType; + }; + $scope.refreshSpatialUnitEditFeaturesOverviewTable = function () { + $scope.loadingData = true; + // fetch all spatial unit features + $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/spatial-units/" + $scope.currentSpatialUnitDataset.spatialUnitId + "/allFeatures", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $scope.spatialUnitFeaturesGeoJSON = response.data; + var tmpRemainingHeaders = []; + for (var property in $scope.spatialUnitFeaturesGeoJSON.features[0].properties) { + if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME) { + tmpRemainingHeaders.push(property); + } + } + $scope.remainingFeatureHeaders = tmpRemainingHeaders; + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", tmpRemainingHeaders, $scope.spatialUnitFeaturesGeoJSON.features, $scope.currentSpatialUnitDataset.spatialUnitId, kommonitorDataGridHelperService.resourceType_spatialUnit, $scope.enableDeleteFeatures); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#spatialUnitEditFeaturesErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + }); + }; + $scope.clearAllSpatialUnitFeatures = function () { + $scope.loadingData = true; + // delete all georesource features + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/spatial-units/" + $scope.currentSpatialUnitDataset.spatialUnitId + "/allFeatures", + method: "DELETE", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $scope.spatialUnitFeaturesGeoJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); + // $scope.refreshGeoresourceEditFeaturesOverviewTable(); + // force empty feature overview table on successful deletion of entries + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", [], []); + $scope.successMessagePart = $scope.currentSpatialUnitDataset.spatialUnitLevel; + $("#spatialUnitEditFeaturesSuccessAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#spatialUnitEditFeaturesErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + }); + }; + $scope.resetSpatialUnitEditFeaturesForm = function () { + // reset edit banners + kommonitorDataGridHelperService.featureTable_spatialUnit_lastUpdate_timestamp_success = undefined; + kommonitorDataGridHelperService.featureTable_spatialUnit_lastUpdate_timestamp_failure = undefined; + $scope.spatialUnitFeaturesGeoJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + $scope.geoJsonString = undefined; + $scope.spatialUnit_asGeoJson = undefined; + $scope.spatialUnitEditFeaturesDataSourceInputInvalidReason = undefined; + $scope.spatialUnitEditFeaturesDataSourceInputInvalid = false; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_spatialUnits = undefined; + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + $("#spatialUnitEditFeaturesSuccessAlert").hide(); + $("#spatialUnitEditFeaturesErrorAlert").hide(); + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.filterByKomMonitorProperties = function () { + return function (item) { + try { + if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate") { + return false; + } + return true; + } + catch (error) { + return false; + } + }; + }; + $scope.getFeatureId = function (geojsonFeature) { + return geojsonFeature.properties[__env.FEATURE_ID_PROPERTY_NAME]; + }; + $scope.getFeatureName = function (geojsonFeature) { + return geojsonFeature.properties[__env.FEATURE_NAME_PROPERTY_NAME]; + }; + $scope.checkPeriodOfValidity = function () { + $scope.periodOfValidityInvalid = false; + if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate) { + var startDate = new Date($scope.periodOfValidity.startDate); + var endDate = new Date($scope.periodOfValidity.endDate); + if ((startDate === endDate) || startDate > endDate) { + // failure + $scope.periodOfValidityInvalid = true; + } + } + }; + $scope.onAddOrUpdateAttributeMapping = function () { + var tmpAttributeMapping_adminView = { + "sourceName": $scope.attributeMapping_sourceAttributeName, + "destinationName": $scope.attributeMapping_destinationAttributeName, + "dataType": $scope.attributeMapping_attributeType + }; + var processed = false; + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; + if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName) { + // replace object + $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; + processed = true; + break; + } + } + if (!processed) { + // new entry + $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); + } + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickEditAttributeMapping = function (attributeMappingEntry) { + $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; + $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; + $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.onClickDeleteAttributeMapping = function (attributeMappingEntry) { + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName) { + // remove object + $scope.attributeMappings_adminView.splice(index, 1); + break; + } + } + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + $scope.buildImporterObjects = async function () { + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + $scope.putBody_spatialUnits = $scope.buildPutBody_spatialUnits(); + if (!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_spatialUnits) { + return false; + } + return true; + }; + $scope.buildConverterDefinition = function () { + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_spatialUnitEditFeatures_", $scope.schema, $scope.mimeType); + }; + $scope.buildDatasourceTypeDefinition = async function () { + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_spatialUnitEditFeatures_', 'spatialUnitDataSourceInput_editFeatures'); + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#spatialUnitEditFeaturesErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + return null; + } + }; + $scope.buildPropertyMappingDefinition = function () { + // arsion from is undefined currently + return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.spatialUnitDataSourceNameProperty, $scope.spatialUnitDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); + }; + $scope.buildPutBody_spatialUnits = function () { + var putBody = { + "geoJsonString": "", + "periodOfValidity": { + "endDate": $scope.periodOfValidity.endDate, + "startDate": $scope.periodOfValidity.startDate + }, + "isPartialUpdate": $scope.isPartialUpdate + }; + return putBody; + }; + $scope.editSpatialUnitFeatures = async function () { + $timeout(function () { + $scope.loadingData = true; + }); + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + /* + now collect data and build request for importer + */ + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + if (!allDataSpecified) { + $("#spatialUnitEditFeaturesForm").validator("update"); + $("#spatialUnitEditFeaturesForm").validator("validate"); + return; + } + else { + // TODO verify input + // TODO Create and perform POST Request with loading screen + var updateSpatialUnitResponse_dryRun = undefined; + try { + updateSpatialUnitResponse_dryRun = await kommonitorImporterHelperService.updateSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentSpatialUnitDataset.spatialUnitId, $scope.putBody_spatialUnits, true); + if (!kommonitorImporterHelperService.importerResponseContainsErrors(updateSpatialUnitResponse_dryRun)) { + // all good, really execute the request to import data against data management API + var updateSpatialUnitResponse = await kommonitorImporterHelperService.updateSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentSpatialUnitDataset.spatialUnitId, $scope.putBody_spatialUnits, false); + $scope.successMessagePart = $scope.putBody_spatialUnits.spatialUnitLevel; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateSpatialUnitResponse); + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); + // $scope.refreshSpatialUnitEditFeaturesOverviewTable(); + $scope.successMessagePart = $scope.currentSpatialUnitDataset.spatialUnitLevel; + $("#spatialUnitEditFeaturesSuccessAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + } + else { + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateSpatialUnitResponse_dryRun); + $("#spatialUnitEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + catch (error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + if (updateSpatialUnitResponse_dryRun) { + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateSpatialUnitResponse_dryRun); + } + $("#spatialUnitEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + }; + $scope.onImportSpatialUnitEditFeaturesMappingConfig = function () { + $scope.spatialUnitMappingConfigImportError = ""; + $("#spatialUnitMappingConfigEditFeaturesImportFile").files = []; + // trigger file chooser + $("#spatialUnitMappingConfigEditFeaturesImportFile").click(); + }; + $(document).on("change", "#spatialUnitMappingConfigEditFeaturesImportFile", function () { + console.log("Importing Importer Mapping Config for EditFeatures SpatialUnit Form"); + // get the file + var file = document.getElementById('spatialUnitMappingConfigEditFeaturesImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + $scope.parseMappingConfigFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMappingConfigFile(event); + } + catch (error) { + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.spatialUnitMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("spatialUnitsEditFeaturesMappingConfigPre").innerHTML = $scope.spatialUnitMappingConfigStructure_pretty; + $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMappingConfigFile = function (event) { + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + if (!$scope.mappingConfigImportSettings.converter || !$scope.mappingConfigImportSettings.dataSource || !$scope.mappingConfigImportSettings.propertyMapping) { + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.spatialUnitMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("spatialUnitsEditFeaturesMappingConfigPre").innerHTML = $scope.spatialUnitMappingConfigStructure_pretty; + $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").show(); + $scope.$digest(); + } + $scope.converter = undefined; + for (var converter of kommonitorImporterHelperService.availableConverters) { + if (converter.name === $scope.mappingConfigImportSettings.converter.name) { + $scope.converter = converter; + break; + } + } + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema) { + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema) { + $scope.schema = schema; + } + } + } + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType) { + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType) { + $scope.mimeType = mimeType; + } + } + } + $scope.datasourceType = undefined; + for (var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes) { + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type) { + $scope.datasourceType = datasourceType; + break; + } + } + $scope.$digest(); + // converter parameters + if ($scope.converter) { + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_spatialUnitEditFeatures_" + convParameter.name).val(convParameter.value); + } + } + // datasourceTypes parameters + if ($scope.datasourceType) { + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_spatialUnitEditFeatures_" + dsParameter.name).val(dsParameter.value); + } + } + // property Mapping + $scope.spatialUnitDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; + $scope.spatialUnitDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; + $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; + $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; + $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; + $scope.attributeMappings_adminView = []; + for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { + var tmpEntry = { + "sourceName": attributeMapping.name, + "destinationName": attributeMapping.mappingName + }; + for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { + if (dataType.apiName === attributeMapping.type) { + tmpEntry.dataType = dataType; + } + } + $scope.attributeMappings_adminView.push(tmpEntry); + } + if ($scope.mappingConfigImportSettings.periodOfValidity) { + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; + $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; + $scope.periodOfValidityInvalid = false; + // update datePickers + if ($scope.periodOfValidity.startDate) { + $("#spatialUnitEditFeaturesDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); + } + if ($scope.periodOfValidity.endDate) { + $("#spatialUnitEditFeaturesDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); + } + } + $scope.$digest(); + }; + $scope.onExportSpatialUnitEditFeaturesMappingConfig = async function () { + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + }; + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + var name = $scope.spatialUnitLevel; + var metadataJSON = JSON.stringify(mappingConfigExport); + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.hideSuccessAlert = function () { + $("#spatialUnitEditFeaturesSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#spatialUnitEditFeaturesErrorAlert").hide(); + }; + $scope.hideMappingConfigErrorAlert = function () { + $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").hide(); + }; + $scope.onChangeEnableDeleteFeatures = function () { + if ($scope.enableDeleteFeatures) { + $(".spatialUnitDeleteFeatureRecordBtn").attr("disabled", false); + } + else { + $(".spatialUnitDeleteFeatureRecordBtn").attr("disabled", true); + } + }; + $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function (event) { + $timeout(function () { + $scope.loadingData = true; + }); + }); + $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function (event) { + $timeout(function () { + $scope.loadingData = false; + }); + }); + $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function (event) { + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); + $scope.refreshSpatialUnitEditFeaturesOverviewTable(); + }); + } + ] +}); +//# sourceMappingURL=spatial-unit-edit-features-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.js.map b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.js.map new file mode 100644 index 000000000..e9269634e --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spatial-unit-edit-features-modal.component.js","sourceRoot":"","sources":["spatial-unit-edit-features-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.ts b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.ts new file mode 100644 index 000000000..3fab16074 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.component.ts @@ -0,0 +1,740 @@ +angular.module('spatialUnitEditFeaturesModal').component('spatialUnitEditFeaturesModal', { + templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorDataGridHelperService', 'kommonitorImporterHelperService', + '$scope', '$rootScope', '$http', '__env', '$timeout', 'kommonitorMultiStepFormHelperService', + function SpatialUnitEditFeaturesModalController(kommonitorDataExchangeService, kommonitorDataGridHelperService, + kommonitorImporterHelperService, $scope, $rootScope, $http, __env, $timeout, kommonitorMultiStepFormHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorImporterHelperServiceInstance = kommonitorImporterHelperService; + this.kommonitorDataGridHelperServiceInstance = kommonitorDataGridHelperService; + + /* POST BODY + { + "geoJsonString": "geoJsonString", + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "jsonSchema": "jsonSchema", + "nextLowerHierarchyLevel": "nextLowerHierarchyLevel", + "spatialUnitLevel": "spatialUnitLevel", + "periodOfValidity": { + "endDate": "2000-01-23", + "startDate": "2000-01-23" + }, + "nextUpperHierarchyLevel": "nextUpperHierarchyLevel" + } + */ + + //Date picker + $('#spatialUnitEditFeaturesDatepickerStart').datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#spatialUnitEditFeaturesDatepickerEnd').datepicker(kommonitorDataExchangeService.datePickerOptions); + + $scope.spatialUnitFeaturesGeoJSON; + $scope.currentSpatialUnitDataset; + $scope.remainingFeatureHeaders; + + $scope.spatialUnitMappingConfigStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON(kommonitorImporterHelperService.mappingConfigStructure); + $scope.spatialUnitMappingConfigImportError; + + $scope.loadingData = false; + + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + + $scope.geoJsonString = undefined; + $scope.spatialUnit_asGeoJson = undefined; + + $scope.spatialUnitEditFeaturesDataSourceInputInvalidReason = undefined; + $scope.spatialUnitEditFeaturesDataSourceInputInvalid = false; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_spatialUnits = undefined; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $scope.$on("onEditSpatialUnitFeatures", function (event, spatialUnitDataset) { + + kommonitorMultiStepFormHelperService.registerClickHandler(); + + if($scope.currentSpatialUnitDataset && $scope.currentSpatialUnitDataset.spatialUnitLevel === spatialUnitDataset.spatialUnitLevel){ + return; + } + else{ + $scope.currentSpatialUnitDataset = spatialUnitDataset; + + // $scope.refreshSpatialUnitEditFeaturesOverviewTable(); + + $scope.resetSpatialUnitEditFeaturesForm(); + + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", [], []); + } + + + + }); + + $scope.onChangeConverter = function(schema){ + $scope.schema = $scope.converter.schemas ? $scope.converter.schemas[0] : undefined; + $scope.mimeType = $scope.converter.mimeTypes[0]; + }; + + $scope.onChangeMimeType = function(mimeType){ + $scope.mimeType = mimeType; + }; + + $scope.refreshSpatialUnitEditFeaturesOverviewTable = function(){ + + $scope.loadingData = true; + // fetch all spatial unit features + $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/spatial-units/" + $scope.currentSpatialUnitDataset.spatialUnitId + "/allFeatures", + method: "GET", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + $scope.spatialUnitFeaturesGeoJSON = response.data; + + var tmpRemainingHeaders = []; + + for (var property in $scope.spatialUnitFeaturesGeoJSON.features[0].properties){ + if (property != __env.FEATURE_ID_PROPERTY_NAME && property != __env.FEATURE_NAME_PROPERTY_NAME && property != __env.VALID_START_DATE_PROPERTY_NAME && property != __env.VALID_END_DATE_PROPERTY_NAME){ + tmpRemainingHeaders.push(property); + } + } + + $scope.remainingFeatureHeaders = tmpRemainingHeaders; + + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", tmpRemainingHeaders, $scope.spatialUnitFeaturesGeoJSON.features, $scope.currentSpatialUnitDataset.spatialUnitId, kommonitorDataGridHelperService.resourceType_spatialUnit, $scope.enableDeleteFeatures); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#spatialUnitEditFeaturesErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + }; + + $scope.clearAllSpatialUnitFeatures = function(){ + $scope.loadingData = true; + // delete all georesource features + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/spatial-units/" + $scope.currentSpatialUnitDataset.spatialUnitId + "/allFeatures", + method: "DELETE", + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + + $scope.spatialUnitFeaturesGeoJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); + // $scope.refreshGeoresourceEditFeaturesOverviewTable(); + // force empty feature overview table on successful deletion of entries + kommonitorDataGridHelperService.buildDataGrid_featureTable_spatialResource("spatialUnitFeatureTable", [], []); + + $scope.successMessagePart = $scope.currentSpatialUnitDataset.spatialUnitLevel; + + $("#spatialUnitEditFeaturesSuccessAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#spatialUnitEditFeaturesErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + }; + + $scope.resetSpatialUnitEditFeaturesForm = function(){ + + // reset edit banners + kommonitorDataGridHelperService.featureTable_spatialUnit_lastUpdate_timestamp_success = undefined; + kommonitorDataGridHelperService.featureTable_spatialUnit_lastUpdate_timestamp_failure = undefined; + + $scope.spatialUnitFeaturesGeoJSON = undefined; + $scope.remainingFeatureHeaders = undefined; + + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = undefined; + $scope.periodOfValidity.endDate = undefined; + $scope.periodOfValidityInvalid = false; + + $scope.geoJsonString = undefined; + $scope.spatialUnit_asGeoJson = undefined; + + $scope.spatialUnitEditFeaturesDataSourceInputInvalidReason = undefined; + $scope.spatialUnitEditFeaturesDataSourceInputInvalid = false; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + + $scope.converter = undefined; + $scope.schema = undefined; + $scope.mimeType = undefined; + $scope.datasourceType = undefined; + $scope.spatialUnitDataSourceIdProperty = undefined; + $scope.spatialUnitDataSourceNameProperty = undefined; + + $scope.converterDefinition = undefined; + $scope.datasourceTypeDefinition = undefined; + $scope.propertyMappingDefinition = undefined; + $scope.putBody_spatialUnits = undefined; + + $scope.validityEndDate_perFeature = undefined; + $scope.validityStartDate_perFeature = undefined; + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_data = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + $scope.attributeMappings_adminView = []; + $scope.keepAttributes = true; + $scope.keepMissingValues = true; + + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $("#spatialUnitEditFeaturesSuccessAlert").hide(); + $("#spatialUnitEditFeaturesErrorAlert").hide(); + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.filterByKomMonitorProperties = function() { + return function( item ) { + + try{ + if (item === __env.FEATURE_ID_PROPERTY_NAME || item === __env.FEATURE_NAME_PROPERTY_NAME || item === "validStartDate" || item === "validEndDate"){ + return false; + } + return true; + } + catch(error){ + return false; + } + }; + }; + + $scope.getFeatureId = function(geojsonFeature){ + return geojsonFeature.properties[__env.FEATURE_ID_PROPERTY_NAME]; + }; + + $scope.getFeatureName = function(geojsonFeature){ + return geojsonFeature.properties[__env.FEATURE_NAME_PROPERTY_NAME]; + }; + + $scope.checkPeriodOfValidity = function(){ + $scope.periodOfValidityInvalid = false; + if ($scope.periodOfValidity.startDate && $scope.periodOfValidity.endDate){ + var startDate = new Date($scope.periodOfValidity.startDate); + var endDate = new Date($scope.periodOfValidity.endDate); + + if ((startDate === endDate) || startDate > endDate){ + // failure + $scope.periodOfValidityInvalid = true; + } + } + }; + + $scope.onAddOrUpdateAttributeMapping = function(){ + var tmpAttributeMapping_adminView = { + "sourceName": $scope.attributeMapping_sourceAttributeName, + "destinationName": $scope.attributeMapping_destinationAttributeName, + "dataType": $scope.attributeMapping_attributeType + }; + + var processed = false; + + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + var attributeMappingEntry_adminView = $scope.attributeMappings_adminView[index]; + + if (attributeMappingEntry_adminView.sourceName === tmpAttributeMapping_adminView.sourceName){ + // replace object + $scope.attributeMappings_adminView[index] = tmpAttributeMapping_adminView; + processed = true; + break; + } + } + + if(! processed){ + // new entry + $scope.attributeMappings_adminView.push(tmpAttributeMapping_adminView); + } + + $scope.attributeMapping_sourceAttributeName = undefined; + $scope.attributeMapping_destinationAttributeName = undefined; + $scope.attributeMapping_attributeType = kommonitorImporterHelperService.attributeMapping_attributeTypes[0]; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickEditAttributeMapping = function(attributeMappingEntry){ + $scope.attributeMapping_sourceAttributeName = attributeMappingEntry.sourceName; + $scope.attributeMapping_destinationAttributeName = attributeMappingEntry.destinationName; + $scope.attributeMapping_attributeType = attributeMappingEntry.dataType; + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.onClickDeleteAttributeMapping = function(attributeMappingEntry){ + for (let index = 0; index < $scope.attributeMappings_adminView.length; index++) { + + if ($scope.attributeMappings_adminView[index].sourceName === attributeMappingEntry.sourceName){ + // remove object + $scope.attributeMappings_adminView.splice(index, 1); + break; + } + } + + setTimeout(() => { + $scope.$digest(); + }, 250); + }; + + $scope.buildImporterObjects = async function(){ + $scope.converterDefinition = $scope.buildConverterDefinition(); + $scope.datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + $scope.propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + $scope.putBody_spatialUnits = $scope.buildPutBody_spatialUnits(); + + if(!$scope.converterDefinition || !$scope.datasourceTypeDefinition || !$scope.propertyMappingDefinition || !$scope.putBody_spatialUnits){ + return false; + } + + return true; + }; + + $scope.buildConverterDefinition = function(){ + + return kommonitorImporterHelperService.buildConverterDefinition($scope.converter, "converterParameter_spatialUnitEditFeatures_", $scope.schema, $scope.mimeType); + }; + + $scope.buildDatasourceTypeDefinition = async function(){ + try { + return await kommonitorImporterHelperService.buildDatasourceTypeDefinition($scope.datasourceType, 'datasourceTypeParameter_spatialUnitEditFeatures_', 'spatialUnitDataSourceInput_editFeatures'); + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#spatialUnitEditFeaturesErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + return null; + } + }; + + $scope.buildPropertyMappingDefinition = function(){ + // arsion from is undefined currently + return kommonitorImporterHelperService.buildPropertyMapping_spatialResource($scope.spatialUnitDataSourceNameProperty, $scope.spatialUnitDataSourceIdProperty, $scope.validityStartDate_perFeature, $scope.validityEndDate_perFeature, undefined, $scope.keepAttributes, $scope.keepMissingValues, $scope.attributeMappings_adminView); + }; + + $scope.buildPutBody_spatialUnits = function(){ + var putBody = + { + "geoJsonString": "", // will be set by importer + "periodOfValidity": { + "endDate": $scope.periodOfValidity.endDate, + "startDate": $scope.periodOfValidity.startDate + }, + "isPartialUpdate": $scope.isPartialUpdate + }; + + return putBody; + }; + + + $scope.editSpatialUnitFeatures = async function(){ + + $timeout(function(){ + $scope.loadingData = true; + }); + + $scope.importerErrors = undefined; + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + /* + now collect data and build request for importer + */ + + /* + if any required importer data is missing --> cancel request and highlight required errors + */ + var allDataSpecified = await $scope.buildImporterObjects(); + + if (!allDataSpecified) { + + $("#spatialUnitEditFeaturesForm").validator("update"); + $("#spatialUnitEditFeaturesForm").validator("validate"); + return; + } + else { + + + // TODO verify input + + // TODO Create and perform POST Request with loading screen + + var updateSpatialUnitResponse_dryRun = undefined; + try { + updateSpatialUnitResponse_dryRun = await kommonitorImporterHelperService.updateSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentSpatialUnitDataset.spatialUnitId, $scope.putBody_spatialUnits, true); + + if(! kommonitorImporterHelperService.importerResponseContainsErrors(updateSpatialUnitResponse_dryRun)){ + // all good, really execute the request to import data against data management API + + var updateSpatialUnitResponse = await kommonitorImporterHelperService.updateSpatialUnit($scope.converterDefinition, $scope.datasourceTypeDefinition, $scope.propertyMappingDefinition, $scope.currentSpatialUnitDataset.spatialUnitId, $scope.putBody_spatialUnits, false); + $scope.successMessagePart = $scope.putBody_spatialUnits.spatialUnitLevel; + $scope.importedFeatures = kommonitorImporterHelperService.getImportedFeaturesFromImporterResponse(updateSpatialUnitResponse); + + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); + // $scope.refreshSpatialUnitEditFeaturesOverviewTable(); + + $scope.successMessagePart = $scope.currentSpatialUnitDataset.spatialUnitLevel; + + $("#spatialUnitEditFeaturesSuccessAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + } + else{ + // errors ocurred + // show them + $scope.errorMessagePart = "Einige der zu importierenden Features des Datensatzes weisen kritische Fehler auf"; + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateSpatialUnitResponse_dryRun); + + $("#spatialUnitEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + + } + + } catch (error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + if(updateSpatialUnitResponse_dryRun){ + $scope.importerErrors = kommonitorImporterHelperService.getErrorsFromImporterResponse(updateSpatialUnitResponse_dryRun); + } + + $("#spatialUnitEditFeaturesErrorAlert").show(); + $scope.loadingData = false; + + setTimeout(() => { + $scope.$digest(); + }, 250); + } + } + }; + + $scope.onImportSpatialUnitEditFeaturesMappingConfig = function(){ + + $scope.spatialUnitMappingConfigImportError = ""; + + $("#spatialUnitMappingConfigEditFeaturesImportFile").files = []; + + // trigger file chooser + $("#spatialUnitMappingConfigEditFeaturesImportFile").click(); + + }; + + $(document).on("change", "#spatialUnitMappingConfigEditFeaturesImportFile" ,function(){ + + console.log("Importing Importer Mapping Config for EditFeatures SpatialUnit Form"); + + // get the file + var file = document.getElementById('spatialUnitMappingConfigEditFeaturesImportFile').files[0]; + $scope.parseMappingConfigFromFile(file); + }); + + $scope.parseMappingConfigFromFile = function(file){ + var fileReader = new FileReader(); + + fileReader.onload = function(event) { + + try{ + $scope.parseFromMappingConfigFile(event); + } + catch(error){ + console.error(error); + console.error("Uploaded MappingConfig File cannot be parsed."); + $scope.spatialUnitMappingConfigImportError = "Uploaded MappingConfig File cannot be parsed correctly"; + document.getElementById("spatialUnitsEditFeaturesMappingConfigPre").innerHTML = $scope.spatialUnitMappingConfigStructure_pretty; + $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").show(); + + $scope.$digest(); + } + + }; + + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + + $scope.parseFromMappingConfigFile = function(event){ + $scope.mappingConfigImportSettings = JSON.parse(event.target.result); + + if(! $scope.mappingConfigImportSettings.converter || ! $scope.mappingConfigImportSettings.dataSource || ! $scope.mappingConfigImportSettings.propertyMapping){ + console.error("uploaded MappingConfig File cannot be parsed - wrong structure."); + $scope.spatialUnitMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("spatialUnitsEditFeaturesMappingConfigPre").innerHTML = $scope.spatialUnitMappingConfigStructure_pretty; + $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").show(); + + $scope.$digest(); + } + + $scope.converter = undefined; + for(var converter of kommonitorImporterHelperService.availableConverters){ + if (converter.name === $scope.mappingConfigImportSettings.converter.name){ + $scope.converter = converter; + break; + } + } + + $scope.schema = undefined; + if ($scope.converter && $scope.converter.schemas && $scope.mappingConfigImportSettings.converter.schema){ + for (var schema of $scope.converter.schemas) { + if (schema === $scope.mappingConfigImportSettings.converter.schema){ + $scope.schema = schema; + } + } + } + + $scope.mimeType = undefined; + if ($scope.converter && $scope.converter.mimeTypes && $scope.mappingConfigImportSettings.converter.mimeType){ + for (var mimeType of $scope.converter.mimeTypes) { + if (mimeType === $scope.mappingConfigImportSettings.converter.mimeType){ + $scope.mimeType = mimeType; + } + } + } + + $scope.datasourceType = undefined; + for(var datasourceType of kommonitorImporterHelperService.availableDatasourceTypes){ + if (datasourceType.type === $scope.mappingConfigImportSettings.dataSource.type){ + $scope.datasourceType = datasourceType; + break; + } + } + + $scope.$digest(); + + // converter parameters + if ($scope.converter){ + for (var convParameter of $scope.mappingConfigImportSettings.converter.parameters) { + $("#converterParameter_spatialUnitEditFeatures_" + convParameter.name).val(convParameter.value); + } + } + + // datasourceTypes parameters + if ($scope.datasourceType){ + for (var dsParameter of $scope.mappingConfigImportSettings.dataSource.parameters) { + $("#datasourceTypeParameter_spatialUnitEditFeatures_" + dsParameter.name).val(dsParameter.value); + } + } + + // property Mapping + $scope.spatialUnitDataSourceNameProperty = $scope.mappingConfigImportSettings.propertyMapping.nameProperty; + $scope.spatialUnitDataSourceIdProperty = $scope.mappingConfigImportSettings.propertyMapping.identifierProperty; + $scope.validityStartDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validStartDateProperty; + $scope.validityEndDate_perFeature = $scope.mappingConfigImportSettings.propertyMapping.validEndDateProperty; + $scope.keepAttributes = $scope.mappingConfigImportSettings.propertyMapping.keepAttributes; + $scope.keepMissingValues = $scope.mappingConfigImportSettings.propertyMapping.keepMissingOrNullValueAttributes; + $scope.attributeMappings_adminView = []; + + for (var attributeMapping of $scope.mappingConfigImportSettings.propertyMapping.attributes) { + var tmpEntry = { + "sourceName": attributeMapping.name, + "destinationName": attributeMapping.mappingName + }; + + for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { + if (dataType.apiName === attributeMapping.type){ + tmpEntry.dataType = dataType; + } + } + + $scope.attributeMappings_adminView.push(tmpEntry); + } + + if ($scope.mappingConfigImportSettings.periodOfValidity){ + $scope.periodOfValidity = {}; + $scope.periodOfValidity.startDate = $scope.mappingConfigImportSettings.periodOfValidity.startDate; + $scope.periodOfValidity.endDate = $scope.mappingConfigImportSettings.periodOfValidity.endDate; + $scope.periodOfValidityInvalid = false; + + // update datePickers + if ($scope.periodOfValidity.startDate){ + $("#spatialUnitEditFeaturesDatepickerStart").datepicker('setDate', $scope.periodOfValidity.startDate); + } + if ($scope.periodOfValidity.endDate){ + $("#spatialUnitEditFeaturesDatepickerEnd").datepicker('setDate', $scope.periodOfValidity.endDate); + } + } + + $scope.$digest(); + }; + + $scope.onExportSpatialUnitEditFeaturesMappingConfig = async function(){ + var converterDefinition = $scope.buildConverterDefinition(); + var datasourceTypeDefinition = await $scope.buildDatasourceTypeDefinition(); + var propertyMappingDefinition = $scope.buildPropertyMappingDefinition(); + + var mappingConfigExport = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + }; + + mappingConfigExport.periodOfValidity = $scope.periodOfValidity; + + var name = $scope.spatialUnitLevel; + + var metadataJSON = JSON.stringify(mappingConfigExport); + + var fileName = "KomMonitor-Import-Mapping-Konfiguration_Export"; + + if (name){ + fileName += "-" + name; + } + + fileName += ".json"; + + var blob = new Blob([metadataJSON], {type: "application/json"}); + var data = URL.createObjectURL(blob); + + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + + a.remove(); + }; + + + $scope.hideSuccessAlert = function(){ + $("#spatialUnitEditFeaturesSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#spatialUnitEditFeaturesErrorAlert").hide(); + }; + + $scope.hideMappingConfigErrorAlert = function(){ + $("#spatialUnitEditFeaturesMappingConfigImportErrorAlert").hide(); + }; + + $scope.onChangeEnableDeleteFeatures = function(){ + if($scope.enableDeleteFeatures){ + $(".spatialUnitDeleteFeatureRecordBtn").attr("disabled", false); + } + else{ + $(".spatialUnitDeleteFeatureRecordBtn").attr("disabled", true); + } + } + + $rootScope.$on("showLoadingIcon_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function(event){ + $timeout(function(){ + + $scope.loadingData = true; + }); + }); + + $rootScope.$on("hideLoadingIcon_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function(event){ + $timeout(function(){ + + $scope.loadingData = false; + }); + }); + + $rootScope.$on("onDeleteFeatureEntry_" + kommonitorDataGridHelperService.resourceType_spatialUnit, function(event){ + $rootScope.$broadcast("refreshSpatialUnitOverviewTable", "edit", $scope.currentSpatialUnitDataset.spatialUnitId); + $scope.refreshSpatialUnitEditFeaturesOverviewTable(); + }); + + } +]}); diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.js b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.js index 02ccd0265..6b158ae59 100644 --- a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.js +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('spatialUnitEditFeaturesModal', ['kommonitorDataGridHelper', 'kommonitorImporterHelper', 'kommonitorMultiStepFormHelper']); +//# sourceMappingURL=spatial-unit-edit-features-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.js.map b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.js.map new file mode 100644 index 000000000..01831d636 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spatial-unit-edit-features-modal.module.js","sourceRoot":"","sources":["spatial-unit-edit-features-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,8BAA8B,EAAE,CAAC,0BAA0B,EAAE,0BAA0B,EAAE,+BAA+B,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.ts b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.ts new file mode 100644 index 000000000..02ccd0265 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditFeaturesModal/spatial-unit-edit-features-modal.module.ts @@ -0,0 +1 @@ +angular.module('spatialUnitEditFeaturesModal', ['kommonitorDataGridHelper', 'kommonitorImporterHelper', 'kommonitorMultiStepFormHelper']); diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.js b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.js index 456974bf7..1b30d3c93 100644 --- a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.js +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.js @@ -1,452 +1,360 @@ +"use strict"; angular.module('spatialUnitEditMetadataModal').component('spatialUnitEditMetadataModal', { - templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', - 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', - function SpatialUnitEditMetadataModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout, - kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.currentSpatialUnitDataset; - - /* POST BODY - { - "geoJsonString": "geoJsonString", - "metadata": { - "note": "note", - "literature": "literature", - "updateInterval": "ARBITRARY", - "sridEPSG": 0.8008281904610115, - "datasource": "datasource", - "contact": "contact", - "lastUpdate": "2000-01-23", - "description": "description", - "databasis": "databasis" - }, - "jsonSchema": "jsonSchema", - "nextLowerHierarchyLevel": "nextLowerHierarchyLevel", - "spatialUnitLevel": "spatialUnitLevel", - "periodOfValidity": { - "endDate": "2000-01-23", - "startDate": "2000-01-23" - }, - "nextUpperHierarchyLevel": "nextUpperHierarchyLevel" - } - */ - - //Date picker - $('#spatialUnitEditMetadataLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); - - $scope.loadingData = false; - - $scope.spatialUnitMetadataStructure = { - "metadata": { - "note": "an optional note", - "literature": "optional text about literature", - "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", - "sridEPSG": 4326, - "datasource": "text about data source", - "contact": "text about contact details", - "lastUpdate": "YYYY-MM-DD", - "description": "description about spatial unit dataset", - "databasis": "text about data basis", - }, - "allowedRoles": ['roleId'], - "nextLowerHierarchyLevel": "Name of lower hierarchy level", - "spatialUnitLevel": "Name of spatial unit dataset", - "nextUpperHierarchyLevel": "Name of upper hierarchy level" - }; - - $scope.spatialUnitMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.spatialUnitMetadataStructure); - - $scope.metadataImportSettings; - $scope.spatialUnitMetadataImportError; - $scope.spatialUnitMetadataImportErrorAlert; - - $scope.spatialUnitLevel = undefined; - $scope.spatialUnitLevelInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = undefined; - $scope.metadata.literature = undefined; - $scope.metadata.updateInterval = undefined; - $scope.metadata.sridEPSG = undefined; - $scope.metadata.datasource = undefined; - $scope.metadata.databasis = undefined; - $scope.metadata.contact = undefined; - $scope.metadata.lastUpdate = undefined; - $scope.metadata.description = undefined; - - $scope.roleManagementTableOptions = undefined; - - $scope.nextLowerHierarchySpatialUnit = undefined; - $scope.nextUpperHierarchySpatialUnit = undefined; - $scope.hierarchyInvalid = false; - - $scope.successMessagePart = undefined; - $scope.errorMessagePart = undefined; - - $scope.$on("onEditSpatialUnitMetadata", function (event, spatialUnitDataset) { - - $scope.currentSpatialUnitDataset = spatialUnitDataset; - - $scope.resetSpatialUnitEditMetadataForm(); - - kommonitorMultiStepFormHelperService.registerClickHandler(); - - }); - - $scope.$on("availableRolesUpdate", function (event) { - refreshRoles(); - }); - - function refreshRoles() { - let allowedRoles = $scope.currentSpatialUnitDataset ? $scope.currentSpatialUnitDataset.allowedRoles : []; - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); - } - - $scope.resetSpatialUnitEditMetadataForm = function(){ - - $scope.spatialUnitLevel = $scope.currentSpatialUnitDataset.spatialUnitLevel; - $scope.spatialUnitLevelInvalid = false; - - $scope.metadata = {}; - $scope.metadata.note = $scope.currentSpatialUnitDataset.metadata.note; - $scope.metadata.literature = $scope.currentSpatialUnitDataset.metadata.literature; - $scope.metadata.sridEPSG = 4326; - $scope.metadata.datasource = $scope.currentSpatialUnitDataset.metadata.datasource; - $scope.metadata.databasis = $scope.currentSpatialUnitDataset.metadata.databasis; - $scope.metadata.contact = $scope.currentSpatialUnitDataset.metadata.contact; - $scope.metadata.description = $scope.currentSpatialUnitDataset.metadata.description; - - let allowedRoles = $scope.currentSpatialUnitDataset ? $scope.currentSpatialUnitDataset.allowedRoles : []; - $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); - - $scope.metadata.lastUpdate = $scope.currentSpatialUnitDataset.metadata.lastUpdate; - // $('#spatialUnitEditMetadataLastUpdateDatepicker').data({date: $scope.currentSpatialUnitDataset.metadata.lastUpdate}); - $('#spatialUnitEditMetadataLastUpdateDatepicker').datepicker('setDate', $scope.currentSpatialUnitDataset.metadata.lastUpdate); - - kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ - if(option.apiName === $scope.currentSpatialUnitDataset.metadata.updateInterval){ - $scope.metadata.updateInterval = option; - } - }); - - for(var i=0; i { - $scope.$digest(); - }, 250); - }; - - $scope.checkSpatialUnitName = function(){ - $scope.spatialUnitLevelInvalid = false; - kommonitorDataExchangeService.availableSpatialUnits.forEach(function(spatialUnit){ - if (spatialUnit.spatialUnitLevel === $scope.spatialUnitLevel && spatialUnit.spatialUnitId != $scope.currentSpatialUnitDataset.spatialUnitId){ - $scope.spatialUnitLevelInvalid = true; - return; - } - }); - }; - - $scope.checkSpatialUnitHierarchy = function(){ - - $scope.hierarchyInvalid = false; - - // smaller indices represent higher spatial units - // i.e. city districts will have a smaller index than building blocks - if($scope.nextLowerHierarchySpatialUnit && $scope.nextUpperHierarchySpatialUnit){ - var indexOfLowerHierarchyUnit; - var indexOfUpperHierarchyUnit; - - for(var i=0; i { + $scope.$digest(); + }, 250); + }; + $scope.checkSpatialUnitName = function () { + $scope.spatialUnitLevelInvalid = false; + kommonitorDataExchangeService.availableSpatialUnits.forEach(function (spatialUnit) { + if (spatialUnit.spatialUnitLevel === $scope.spatialUnitLevel && spatialUnit.spatialUnitId != $scope.currentSpatialUnitDataset.spatialUnitId) { + $scope.spatialUnitLevelInvalid = true; + return; + } + }); + }; + $scope.checkSpatialUnitHierarchy = function () { + $scope.hierarchyInvalid = false; + // smaller indices represent higher spatial units + // i.e. city districts will have a smaller index than building blocks + if ($scope.nextLowerHierarchySpatialUnit && $scope.nextUpperHierarchySpatialUnit) { + var indexOfLowerHierarchyUnit; + var indexOfUpperHierarchyUnit; + for (var i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + var spatialUnit = kommonitorDataExchangeService.availableSpatialUnits[i]; + if (spatialUnit.spatialUnitLevel === $scope.nextLowerHierarchySpatialUnit.spatialUnitLevel) { + indexOfLowerHierarchyUnit = i; + } + if (spatialUnit.spatialUnitLevel === $scope.nextUpperHierarchySpatialUnit.spatialUnitLevel) { + indexOfUpperHierarchyUnit = i; + } + } + if ((indexOfLowerHierarchyUnit <= indexOfUpperHierarchyUnit)) { + // failure + $scope.hierarchyInvalid = true; + } + } + }; + $scope.editSpatialUnitMetadata = function () { + let spatialUnitName_old = $scope.currentSpatialUnitDataset.spatialUnitLevel; + let spatialUnitName_new = $scope.spatialUnitLevel; + var patchBody = { + "datasetName": $scope.spatialUnitLevel, + "metadata": { + "note": $scope.metadata.note, + "literature": $scope.metadata.literature, + "updateInterval": $scope.metadata.updateInterval.apiName, + "sridEPSG": $scope.metadata.sridEPSG, + "datasource": $scope.metadata.datasource, + "contact": $scope.metadata.contact, + "lastUpdate": $scope.metadata.lastUpdate, + "description": $scope.metadata.description, + "databasis": $scope.metadata.databasis, + "sridEPSG": 4326 + }, + "allowedRoles": [], + "nextLowerHierarchyLevel": $scope.nextLowerHierarchySpatialUnit ? $scope.nextLowerHierarchySpatialUnit.spatialUnitLevel : null, + "nextUpperHierarchyLevel": $scope.nextUpperHierarchySpatialUnit ? $scope.nextUpperHierarchySpatialUnit.spatialUnitLevel : null + }; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + patchBody.allowedRoles.push(roleId); + } + // TODO Create and perform POST Request with loading screen + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/spatial-units/" + $scope.currentSpatialUnitDataset.spatialUnitId, + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + $scope.successMessagePart = $scope.currentSpatialUnitDataset.spatialUnitLevel; + $rootScope.$broadcast("refreshSpatialUnitOverviewTable"); + // if the name has changed, then indicator metadata must be fetched as well + if (spatialUnitName_old != spatialUnitName_new) { + $rootScope.$broadcast("refreshIndicatorOverviewTable"); + } + $("#spatialUnitEditMetadataSuccessAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#spatialUnitEditMetadataErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // setTimeout(function() { + // $("#spatialUnitEditMetadataSuccessAlert").hide(); + // }, 3000); + }); + }; + $scope.onImportSpatialUnitEditMetadata = function () { + $scope.spatialUnitMetadataImportError = ""; + $("#spatialUnitEditMetadataImportFile").files = []; + // trigger file chooser + $("#spatialUnitEditMetadataImportFile").click(); + }; + $(document).on("change", "#spatialUnitEditMetadataImportFile", function () { + console.log("Importing SpatialUnit metadata for Edit SpatialUnit Form"); + // get the file + var file = document.getElementById('spatialUnitEditMetadataImportFile').files[0]; + $scope.parseMetadataFromFile(file); + }); + $scope.parseMetadataFromFile = function (file) { + var fileReader = new FileReader(); + fileReader.onload = function (event) { + try { + $scope.parseFromMetadataFile(event); + } + catch (error) { + console.error("Uploaded Metadata File cannot be parsed."); + $scope.spatialUnitMetadataImportError = "Uploaded Metadata File cannot be parsed correctly"; + document.getElementById("spatialUnitsEditMetadataPre").innerHTML = $scope.spatialUnitMetadataStructure_pretty; + $("#spatialUnitEditMetadataImportErrorAlert").show(); + $scope.$digest(); + } + }; + // Read in the image file as a data URL. + fileReader.readAsText(file); + }; + $scope.parseFromMetadataFile = function (event) { + // $scope.geoJsonString = event.target.result; + $scope.metadataImportSettings = JSON.parse(event.target.result); + if (!$scope.metadataImportSettings.metadata) { + console.error("uploaded Metadata File cannot be parsed - wrong structure."); + $scope.spatialUnitMetadataImportError = "Struktur der Datei stimmt nicht mit erwartetem Muster überein."; + document.getElementById("spatialUnitsEditMetadataPre").innerHTML = $scope.spatialUnitMetadataStructure_pretty; + $("#spatialUnitEditMetadataImportErrorAlert").show(); + $scope.$digest(); + } + $scope.metadata = {}; + $scope.metadata.note = $scope.metadataImportSettings.metadata.note; + $scope.metadata.literature = $scope.metadataImportSettings.metadata.literature; + kommonitorDataExchangeService.updateIntervalOptions.forEach(function (option) { + if (option.apiName === $scope.metadataImportSettings.metadata.updateInterval) { + $scope.metadata.updateInterval = option; + } + }); + $scope.metadata.sridEPSG = $scope.metadataImportSettings.metadata.sridEPSG; + $scope.metadata.datasource = $scope.metadataImportSettings.metadata.datasource; + $scope.metadata.contact = $scope.metadataImportSettings.metadata.contact; + $scope.metadata.lastUpdate = $scope.metadataImportSettings.metadata.lastUpdate; + // initialize date + $('#spatialUnitEditLastUpdateDatepicker').datepicker('setDate', $scope.metadata.lastUpdate); + $scope.metadata.description = $scope.metadataImportSettings.metadata.description; + $scope.metadata.databasis = $scope.metadataImportSettings.metadata.databasis; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, $scope.metadataImportSettings.allowedRoles); + for (var i = 0; i < kommonitorDataExchangeService.availableSpatialUnits.length; i++) { + var spatialUnit = kommonitorDataExchangeService.availableSpatialUnits[i]; + if (spatialUnit.spatialUnitLevel === $scope.metadataImportSettings.nextLowerHierarchyLevel) { + $scope.nextLowerHierarchySpatialUnit = spatialUnit; + } + if (spatialUnit.spatialUnitLevel === $scope.metadataImportSettings.nextUpperHierarchyLevel) { + $scope.nextUpperHierarchySpatialUnit = spatialUnit; + } + } + $scope.spatialUnitLevel = $scope.metadataImportSettings.spatialUnitLevel; + $scope.$digest(); + }; + $scope.onExportSpatialUnitEditMetadataTemplate = function () { + var metadataJSON = JSON.stringify($scope.spatialUnitMetadataStructure); + var fileName = "Raumeinheit_Metadaten_Vorlage_Export.json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.onExportSpatialUnitEditMetadata = function () { + var metadataExport = $scope.spatialUnitMetadataStructure; + metadataExport.metadata.note = $scope.metadata.note || ""; + metadataExport.metadata.literature = $scope.metadata.literature || ""; + metadataExport.metadata.sridEPSG = $scope.metadata.sridEPSG || ""; + metadataExport.metadata.datasource = $scope.metadata.datasource || ""; + metadataExport.metadata.contact = $scope.metadata.contact || ""; + metadataExport.metadata.lastUpdate = $scope.metadata.lastUpdate || ""; + metadataExport.metadata.description = $scope.metadata.description || ""; + metadataExport.metadata.databasis = $scope.metadata.databasis || ""; + metadataExport.spatialUnitLevel = $scope.spatialUnitLevel || ""; + metadataExport.allowedRoles = []; + let roleIds = kommonitorDataGridHelperService.getSelectedRoleIds_roleManagementGrid($scope.roleManagementTableOptions); + for (const roleId of roleIds) { + metadataExport.allowedRoles.push(roleId); + } + if ($scope.metadata.updateInterval) { + metadataExport.metadata.updateInterval = $scope.metadata.updateInterval.apiName; + } + if ($scope.nextLowerHierarchySpatialUnit) { + metadataExport.nextLowerHierarchyLevel = $scope.nextLowerHierarchySpatialUnit.spatialUnitLevel; + } + else { + metadataExport.nextLowerHierarchyLevel = ""; + } + if ($scope.nextUpperHierarchySpatialUnit) { + metadataExport.nextUpperHierarchyLevel = $scope.nextUpperHierarchySpatialUnit.spatialUnitLevel; + } + else { + metadataExport.nextUpperHierarchyLevel = ""; + } + var name = $scope.spatialUnitLevel; + var metadataJSON = JSON.stringify(metadataExport); + var fileName = "Raumeinheit_Metadaten_Export"; + if (name) { + fileName += "-" + name; + } + fileName += ".json"; + var blob = new Blob([metadataJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.download = fileName; + a.href = data; + a.textContent = "JSON"; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + a.click(); + a.remove(); + }; + $scope.hideSuccessAlert = function () { + $("#spatialUnitEditMetadataSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#spatialUnitEditMetadataErrorAlert").hide(); + }; + } + ] +}); +//# sourceMappingURL=spatial-unit-edit-metadata-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.js.map b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.js.map new file mode 100644 index 000000000..7de67bd61 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spatial-unit-edit-metadata-modal.component.js","sourceRoot":"","sources":["spatial-unit-edit-metadata-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.ts b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.ts new file mode 100644 index 000000000..456974bf7 --- /dev/null +++ b/app/components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.component.ts @@ -0,0 +1,452 @@ +angular.module('spatialUnitEditMetadataModal').component('spatialUnitEditMetadataModal', { + templateUrl : "components/kommonitorAdmin/adminSpatialUnitsManagement/spatialUnitEditMetadataModal/spatial-unit-edit-metadata-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', + 'kommonitorMultiStepFormHelperService', 'kommonitorDataGridHelperService', + function SpatialUnitEditMetadataModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout, + kommonitorMultiStepFormHelperService, kommonitorDataGridHelperService) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.currentSpatialUnitDataset; + + /* POST BODY + { + "geoJsonString": "geoJsonString", + "metadata": { + "note": "note", + "literature": "literature", + "updateInterval": "ARBITRARY", + "sridEPSG": 0.8008281904610115, + "datasource": "datasource", + "contact": "contact", + "lastUpdate": "2000-01-23", + "description": "description", + "databasis": "databasis" + }, + "jsonSchema": "jsonSchema", + "nextLowerHierarchyLevel": "nextLowerHierarchyLevel", + "spatialUnitLevel": "spatialUnitLevel", + "periodOfValidity": { + "endDate": "2000-01-23", + "startDate": "2000-01-23" + }, + "nextUpperHierarchyLevel": "nextUpperHierarchyLevel" + } + */ + + //Date picker + $('#spatialUnitEditMetadataLastUpdateDatepicker').datepicker(kommonitorDataExchangeService.datePickerOptions); + + $scope.loadingData = false; + + $scope.spatialUnitMetadataStructure = { + "metadata": { + "note": "an optional note", + "literature": "optional text about literature", + "updateInterval": "YEARLY|HALF_YEARLY|QUARTERLY|MONTHLY|ARBITRARY", + "sridEPSG": 4326, + "datasource": "text about data source", + "contact": "text about contact details", + "lastUpdate": "YYYY-MM-DD", + "description": "description about spatial unit dataset", + "databasis": "text about data basis", + }, + "allowedRoles": ['roleId'], + "nextLowerHierarchyLevel": "Name of lower hierarchy level", + "spatialUnitLevel": "Name of spatial unit dataset", + "nextUpperHierarchyLevel": "Name of upper hierarchy level" + }; + + $scope.spatialUnitMetadataStructure_pretty = kommonitorDataExchangeService.syntaxHighlightJSON($scope.spatialUnitMetadataStructure); + + $scope.metadataImportSettings; + $scope.spatialUnitMetadataImportError; + $scope.spatialUnitMetadataImportErrorAlert; + + $scope.spatialUnitLevel = undefined; + $scope.spatialUnitLevelInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = undefined; + $scope.metadata.literature = undefined; + $scope.metadata.updateInterval = undefined; + $scope.metadata.sridEPSG = undefined; + $scope.metadata.datasource = undefined; + $scope.metadata.databasis = undefined; + $scope.metadata.contact = undefined; + $scope.metadata.lastUpdate = undefined; + $scope.metadata.description = undefined; + + $scope.roleManagementTableOptions = undefined; + + $scope.nextLowerHierarchySpatialUnit = undefined; + $scope.nextUpperHierarchySpatialUnit = undefined; + $scope.hierarchyInvalid = false; + + $scope.successMessagePart = undefined; + $scope.errorMessagePart = undefined; + + $scope.$on("onEditSpatialUnitMetadata", function (event, spatialUnitDataset) { + + $scope.currentSpatialUnitDataset = spatialUnitDataset; + + $scope.resetSpatialUnitEditMetadataForm(); + + kommonitorMultiStepFormHelperService.registerClickHandler(); + + }); + + $scope.$on("availableRolesUpdate", function (event) { + refreshRoles(); + }); + + function refreshRoles() { + let allowedRoles = $scope.currentSpatialUnitDataset ? $scope.currentSpatialUnitDataset.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + } + + $scope.resetSpatialUnitEditMetadataForm = function(){ + + $scope.spatialUnitLevel = $scope.currentSpatialUnitDataset.spatialUnitLevel; + $scope.spatialUnitLevelInvalid = false; + + $scope.metadata = {}; + $scope.metadata.note = $scope.currentSpatialUnitDataset.metadata.note; + $scope.metadata.literature = $scope.currentSpatialUnitDataset.metadata.literature; + $scope.metadata.sridEPSG = 4326; + $scope.metadata.datasource = $scope.currentSpatialUnitDataset.metadata.datasource; + $scope.metadata.databasis = $scope.currentSpatialUnitDataset.metadata.databasis; + $scope.metadata.contact = $scope.currentSpatialUnitDataset.metadata.contact; + $scope.metadata.description = $scope.currentSpatialUnitDataset.metadata.description; + + let allowedRoles = $scope.currentSpatialUnitDataset ? $scope.currentSpatialUnitDataset.allowedRoles : []; + $scope.roleManagementTableOptions = kommonitorDataGridHelperService.buildRoleManagementGrid('spatialUnitEditRoleManagementTable', $scope.roleManagementTableOptions, kommonitorDataExchangeService.accessControl, allowedRoles); + + $scope.metadata.lastUpdate = $scope.currentSpatialUnitDataset.metadata.lastUpdate; + // $('#spatialUnitEditMetadataLastUpdateDatepicker').data({date: $scope.currentSpatialUnitDataset.metadata.lastUpdate}); + $('#spatialUnitEditMetadataLastUpdateDatepicker').datepicker('setDate', $scope.currentSpatialUnitDataset.metadata.lastUpdate); + + kommonitorDataExchangeService.updateIntervalOptions.forEach(function(option){ + if(option.apiName === $scope.currentSpatialUnitDataset.metadata.updateInterval){ + $scope.metadata.updateInterval = option; + } + }); + + for(var i=0; i { + $scope.$digest(); + }, 250); + }; + + $scope.checkSpatialUnitName = function(){ + $scope.spatialUnitLevelInvalid = false; + kommonitorDataExchangeService.availableSpatialUnits.forEach(function(spatialUnit){ + if (spatialUnit.spatialUnitLevel === $scope.spatialUnitLevel && spatialUnit.spatialUnitId != $scope.currentSpatialUnitDataset.spatialUnitId){ + $scope.spatialUnitLevelInvalid = true; + return; + } + }); + }; + + $scope.checkSpatialUnitHierarchy = function(){ + + $scope.hierarchyInvalid = false; + + // smaller indices represent higher spatial units + // i.e. city districts will have a smaller index than building blocks + if($scope.nextLowerHierarchySpatialUnit && $scope.nextUpperHierarchySpatialUnit){ + var indexOfLowerHierarchyUnit; + var indexOfUpperHierarchyUnit; + + for(var i=0; i .collapseTrigger').on('click', function() { - $('.glyphicon', this) - .toggleClass('glyphicon-chevron-right') - .toggleClass('glyphicon-chevron-down'); - - // manage uncollapsed entries - var clickedTopicId = $(this).attr('id'); - if ($scope.unCollapsedTopicIds.includes(clickedTopicId)){ - var index = $scope.unCollapsedTopicIds.indexOf(clickedTopicId); - $scope.unCollapsedTopicIds.splice(index, 1); - } - else{ - $scope.unCollapsedTopicIds.push(clickedTopicId); - } - }); - }, 500); - }; - - $(document).ready(function() { - - addClickListenerToEachCollapseTrigger(); - }); - - $scope.refreshTopicsOverview = function(){ - $scope.loadingData = true; - - $scope.unCollapsedTopicIds.forEach(function(topicId){ - // simulate click on item in order to uncollapse it - $('#'+topicId).click(); - }); - - addClickListenerToEachCollapseTrigger(); - - $scope.loadingData = false; - }; - - $scope.$on("refreshTopicsOverview", function (event) { - $scope.refreshTopicsOverview(); - }); - - $scope.onAddMainTopic = function(resourceType){ - - var postBody = { - "topicResource": resourceType, - "topicType": "main", - "subTopics": [] - }; - - if(resourceType === "indicator"){ - postBody.topicName = $scope.newMainTopicTitle_indicator; - postBody.topicDescription = $scope.newMainTopicDescription_indicator; - } - else{ - postBody.topicName = $scope.newMainTopicTitle_georesource; - postBody.topicDescription = $scope.newMainTopicDescription_georesource; - } - - $scope.loadingData = true; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics", - method: "POST", - data: postBody - // headers: { - // 'Content-Type': undefined - // } - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - - $scope.refreshTopicsOverview(); - - // refresh all admin dashboard diagrams due to modified metadata - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#topicsErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - // setTimeout(function() { - // $("#spatialUnitAddSucessAlert").hide(); - // }, 3000); - }); - - $scope.newMainTopicTitle_indicator = undefined; - $scope.newMainTopicDescription_indicator = undefined; - $scope.newMainTopicTitle_georesource = undefined; - $scope.newMainTopicDescription_georesource = undefined; - }; - - $scope.onAddSubTopic = function(mainTopic, resourceType){ - - $scope.loadingData = true; - var topicId = mainTopic.topicId; - - var subTopic = { - "topicResource": resourceType, - "topicType": "sub", - "subTopics": [] - }; - - if(resourceType === "indicator"){ - subTopic.topicName = mainTopic.newSubTopicTitle_indicator; - subTopic.topicDescription = mainTopic.newSubTopicDescription_indicator; - } - else{ - subTopic.topicName = mainTopic.newSubTopicTitle_georesource; - subTopic.topicDescription = mainTopic.newSubTopicDescription_georesource; - } - - // check if subTopic already exists, then abort - add to mainTopic otherwise - if($scope.alreadyInSubtopics(subTopic, mainTopic.subTopics)){ - $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; - - $("#topicsErrorAlert").show(); - $scope.loadingData = false; - return; - } - else{ - mainTopic.subTopics.push(subTopic); - } - - var putBody = { - "topicName": mainTopic.topicName, - "topicDescription": mainTopic.topicDescription, - "topicResource": resourceType, - "topicType": mainTopic.topicType, - "subTopics": mainTopic.subTopics - }; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, - method: "PUT", - data: putBody - // headers: { - // 'Content-Type': undefined - // } - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - - $scope.refreshTopicsOverview(); - - // refresh all admin dashboard diagrams due to modified metadata - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#topicsErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - // setTimeout(function() { - // $("#spatialUnitAddSucessAlert").hide(); - // }, 3000); - }); - - delete mainTopic.newSubTopicTitle_indicator; - delete mainTopic.newSubTopicDescription_indicator; - }; - - $scope.alreadyInSubtopics = function(subTopicCandidate, subTopics){ - for(var subTopic of subTopics){ - if (subTopic.topicName === subTopicCandidate.topicName){ - return true; - } - } - return false; - }; - - $scope.onAddSubSubSubTopic = function(subTopic, resourceType){ - - $scope.loadingData = true; - var topicId = subTopic.topicId; - - var subSubSubTopic = { - "topicResource": resourceType, - "topicType": "sub", - "subTopics": [] - }; - - if(resourceType === "indicator"){ - subSubSubTopic.topicName = subTopic.newSubTopicTitle_indicator; - subSubSubTopic.topicDescription = subTopic.newSubTopicDescription_indicator; - } - else{ - subSubSubTopic.topicName = subTopic.newSubTopicTitle_georesource; - subSubSubTopic.topicDescription = subTopic.newSubTopicDescription_georesource; - } - - // check if subTopic already exists, then abort - add to mainTopic otherwise - if($scope.alreadyInSubtopics(subSubSubTopic, subTopic.subTopics)){ - $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; - - $("#topicsErrorAlert").show(); - $scope.loadingData = false; - return; - } - else{ - subTopic.subTopics.push(subSubSubTopic); - } - - var putBody = { - "topicName": subTopic.topicName, - "topicDescription": subTopic.topicDescription, - "topicResource": resourceType, - "topicType": subTopic.topicType, - "subTopics": subTopic.subTopics - }; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, - method: "PUT", - data: putBody - // headers: { - // 'Content-Type': undefined - // } - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - - $scope.refreshTopicsOverview(); - - // refresh all admin dashboard diagrams due to modified metadata - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#topicsErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - // setTimeout(function() { - // $("#spatialUnitAddSucessAlert").hide(); - // }, 3000); - }); - - delete subTopic.newSubTopicTitle_indicator; - delete subTopic.newSubTopicDescription_indicator; - }; - - $scope.onAddSubSubTopic = function(subTopic, resourceType){ - - $scope.loadingData = true; - var topicId = subTopic.topicId; - - var subSubTopic = { - "topicResource": resourceType, - "topicType": "sub", - "subTopics": [] - }; - - if(resourceType === "indicator"){ - subSubTopic.topicName = subTopic.newSubTopicTitle_indicator; - subSubTopic.topicDescription = subTopic.newSubTopicDescription_indicator; - } - else{ - subSubTopic.topicName = subTopic.newSubTopicTitle_georesource; - subSubTopic.topicDescription = subTopic.newSubTopicDescription_georesource; - } - - // check if subTopic already exists, then abort - add to mainTopic otherwise - if($scope.alreadyInSubtopics(subSubTopic, subTopic.subTopics)){ - $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; - - $("#topicsErrorAlert").show(); - $scope.loadingData = false; - return; - } - else{ - subTopic.subTopics.push(subSubTopic); - } - - var putBody = { - "topicName": subTopic.topicName, - "topicDescription": subTopic.topicDescription, - "topicResource": resourceType, - "topicType": subTopic.topicType, - "subTopics": subTopic.subTopics - }; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, - method: "PUT", - data: putBody - // headers: { - // 'Content-Type': undefined - // } - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - - $scope.refreshTopicsOverview(); - - // refresh all admin dashboard diagrams due to modified metadata - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#topicsErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - // setTimeout(function() { - // $("#spatialUnitAddSucessAlert").hide(); - // }, 3000); - }); - - delete subTopic.newSubTopicTitle_indicator; - delete subTopic.newSubTopicDescription_indicator; - }; - - $scope.deleteTopic = function(topic){ - - var topicId = topic.topicId; - - $scope.loadingData = true; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, - method: "DELETE" - // headers: { - // 'Content-Type': undefined - // } - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - - $scope.refreshTopicsOverview(); - - $timeout(function(){ - - $scope.loadingData = false; - }); - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#topicsErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - // setTimeout(function() { - // $("#spatialUnitAddSucessAlert").hide(); - // }, 3000); - }); - }; - - $scope.onClickEditTopic = function(topic){ - // submit selected topic to modal controller - $rootScope.$broadcast("onEditTopic", topic); - }; - - $scope.onClickDeleteTopic = function(topic){ - // submit selected topic to modal controller - $rootScope.$broadcast("onDeleteTopic", topic); - }; - - $scope.hideErrorAlert = function(){ - $("#topicsErrorAlert").hide(); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', '$scope', '$rootScope', '__env', '$http', '$timeout', + function TopicsManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, $scope, $rootScope, __env, $http, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.newMainTopicTitle_indicator; + $scope.newMainTopicDescription_indicator; + $scope.newMainTopicTitle_georesource; + $scope.newMainTopicDescription_georesource; + $scope.showTopicIds = false; + $scope.unCollapsedTopicIds = []; + $scope.errorMessagePart; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + var addClickListenerToEachCollapseTrigger = function () { + setTimeout(function () { + $('.list-group-item > .collapseTrigger').on('click', function () { + $('.glyphicon', this) + .toggleClass('glyphicon-chevron-right') + .toggleClass('glyphicon-chevron-down'); + // manage uncollapsed entries + var clickedTopicId = $(this).attr('id'); + if ($scope.unCollapsedTopicIds.includes(clickedTopicId)) { + var index = $scope.unCollapsedTopicIds.indexOf(clickedTopicId); + $scope.unCollapsedTopicIds.splice(index, 1); + } + else { + $scope.unCollapsedTopicIds.push(clickedTopicId); + } + }); + }, 500); + }; + $(document).ready(function () { + addClickListenerToEachCollapseTrigger(); + }); + $scope.refreshTopicsOverview = function () { + $scope.loadingData = true; + $scope.unCollapsedTopicIds.forEach(function (topicId) { + // simulate click on item in order to uncollapse it + $('#' + topicId).click(); + }); + addClickListenerToEachCollapseTrigger(); + $scope.loadingData = false; + }; + $scope.$on("refreshTopicsOverview", function (event) { + $scope.refreshTopicsOverview(); + }); + $scope.onAddMainTopic = function (resourceType) { + var postBody = { + "topicResource": resourceType, + "topicType": "main", + "subTopics": [] + }; + if (resourceType === "indicator") { + postBody.topicName = $scope.newMainTopicTitle_indicator; + postBody.topicDescription = $scope.newMainTopicDescription_indicator; + } + else { + postBody.topicName = $scope.newMainTopicTitle_georesource; + postBody.topicDescription = $scope.newMainTopicDescription_georesource; + } + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics", + method: "POST", + data: postBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + $scope.refreshTopicsOverview(); + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#topicsErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + $scope.newMainTopicTitle_indicator = undefined; + $scope.newMainTopicDescription_indicator = undefined; + $scope.newMainTopicTitle_georesource = undefined; + $scope.newMainTopicDescription_georesource = undefined; + }; + $scope.onAddSubTopic = function (mainTopic, resourceType) { + $scope.loadingData = true; + var topicId = mainTopic.topicId; + var subTopic = { + "topicResource": resourceType, + "topicType": "sub", + "subTopics": [] + }; + if (resourceType === "indicator") { + subTopic.topicName = mainTopic.newSubTopicTitle_indicator; + subTopic.topicDescription = mainTopic.newSubTopicDescription_indicator; + } + else { + subTopic.topicName = mainTopic.newSubTopicTitle_georesource; + subTopic.topicDescription = mainTopic.newSubTopicDescription_georesource; + } + // check if subTopic already exists, then abort - add to mainTopic otherwise + if ($scope.alreadyInSubtopics(subTopic, mainTopic.subTopics)) { + $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; + $("#topicsErrorAlert").show(); + $scope.loadingData = false; + return; + } + else { + mainTopic.subTopics.push(subTopic); + } + var putBody = { + "topicName": mainTopic.topicName, + "topicDescription": mainTopic.topicDescription, + "topicResource": resourceType, + "topicType": mainTopic.topicType, + "subTopics": mainTopic.subTopics + }; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "PUT", + data: putBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + $scope.refreshTopicsOverview(); + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#topicsErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + delete mainTopic.newSubTopicTitle_indicator; + delete mainTopic.newSubTopicDescription_indicator; + }; + $scope.alreadyInSubtopics = function (subTopicCandidate, subTopics) { + for (var subTopic of subTopics) { + if (subTopic.topicName === subTopicCandidate.topicName) { + return true; + } + } + return false; + }; + $scope.onAddSubSubSubTopic = function (subTopic, resourceType) { + $scope.loadingData = true; + var topicId = subTopic.topicId; + var subSubSubTopic = { + "topicResource": resourceType, + "topicType": "sub", + "subTopics": [] + }; + if (resourceType === "indicator") { + subSubSubTopic.topicName = subTopic.newSubTopicTitle_indicator; + subSubSubTopic.topicDescription = subTopic.newSubTopicDescription_indicator; + } + else { + subSubSubTopic.topicName = subTopic.newSubTopicTitle_georesource; + subSubSubTopic.topicDescription = subTopic.newSubTopicDescription_georesource; + } + // check if subTopic already exists, then abort - add to mainTopic otherwise + if ($scope.alreadyInSubtopics(subSubSubTopic, subTopic.subTopics)) { + $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; + $("#topicsErrorAlert").show(); + $scope.loadingData = false; + return; + } + else { + subTopic.subTopics.push(subSubSubTopic); + } + var putBody = { + "topicName": subTopic.topicName, + "topicDescription": subTopic.topicDescription, + "topicResource": resourceType, + "topicType": subTopic.topicType, + "subTopics": subTopic.subTopics + }; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "PUT", + data: putBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + $scope.refreshTopicsOverview(); + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#topicsErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + delete subTopic.newSubTopicTitle_indicator; + delete subTopic.newSubTopicDescription_indicator; + }; + $scope.onAddSubSubTopic = function (subTopic, resourceType) { + $scope.loadingData = true; + var topicId = subTopic.topicId; + var subSubTopic = { + "topicResource": resourceType, + "topicType": "sub", + "subTopics": [] + }; + if (resourceType === "indicator") { + subSubTopic.topicName = subTopic.newSubTopicTitle_indicator; + subSubTopic.topicDescription = subTopic.newSubTopicDescription_indicator; + } + else { + subSubTopic.topicName = subTopic.newSubTopicTitle_georesource; + subSubTopic.topicDescription = subTopic.newSubTopicDescription_georesource; + } + // check if subTopic already exists, then abort - add to mainTopic otherwise + if ($scope.alreadyInSubtopics(subSubTopic, subTopic.subTopics)) { + $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; + $("#topicsErrorAlert").show(); + $scope.loadingData = false; + return; + } + else { + subTopic.subTopics.push(subSubTopic); + } + var putBody = { + "topicName": subTopic.topicName, + "topicDescription": subTopic.topicDescription, + "topicResource": resourceType, + "topicType": subTopic.topicType, + "subTopics": subTopic.subTopics + }; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "PUT", + data: putBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + $scope.refreshTopicsOverview(); + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#topicsErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + delete subTopic.newSubTopicTitle_indicator; + delete subTopic.newSubTopicDescription_indicator; + }; + $scope.deleteTopic = function (topic) { + var topicId = topic.topicId; + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "DELETE" + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + $scope.refreshTopicsOverview(); + $timeout(function () { + $scope.loadingData = false; + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#topicsErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + }; + $scope.onClickEditTopic = function (topic) { + // submit selected topic to modal controller + $rootScope.$broadcast("onEditTopic", topic); + }; + $scope.onClickDeleteTopic = function (topic) { + // submit selected topic to modal controller + $rootScope.$broadcast("onDeleteTopic", topic); + }; + $scope.hideErrorAlert = function () { + $("#topicsErrorAlert").hide(); + }; + } + ] +}); +//# sourceMappingURL=admin-topics-management.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.component.js.map b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.component.js.map new file mode 100644 index 000000000..10c2289bc --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-topics-management.component.js","sourceRoot":"","sources":["admin-topics-management.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.component.ts b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.component.ts new file mode 100644 index 000000000..6ddca97b7 --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.component.ts @@ -0,0 +1,459 @@ +angular.module('adminTopicsManagement').component('adminTopicsManagement', { + templateUrl : "components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorCacheHelperService', '$scope', '$rootScope', '__env', '$http', '$timeout', + function TopicsManagementController(kommonitorDataExchangeService, kommonitorCacheHelperService, $scope, $rootScope, __env, $http, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.newMainTopicTitle_indicator; + $scope.newMainTopicDescription_indicator; + + $scope.newMainTopicTitle_georesource; + $scope.newMainTopicDescription_georesource; + + $scope.showTopicIds = false; + + $scope.unCollapsedTopicIds = []; + + $scope.errorMessagePart; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + var addClickListenerToEachCollapseTrigger = function(){ + setTimeout(function(){ + $('.list-group-item > .collapseTrigger').on('click', function() { + $('.glyphicon', this) + .toggleClass('glyphicon-chevron-right') + .toggleClass('glyphicon-chevron-down'); + + // manage uncollapsed entries + var clickedTopicId = $(this).attr('id'); + if ($scope.unCollapsedTopicIds.includes(clickedTopicId)){ + var index = $scope.unCollapsedTopicIds.indexOf(clickedTopicId); + $scope.unCollapsedTopicIds.splice(index, 1); + } + else{ + $scope.unCollapsedTopicIds.push(clickedTopicId); + } + }); + }, 500); + }; + + $(document).ready(function() { + + addClickListenerToEachCollapseTrigger(); + }); + + $scope.refreshTopicsOverview = function(){ + $scope.loadingData = true; + + $scope.unCollapsedTopicIds.forEach(function(topicId){ + // simulate click on item in order to uncollapse it + $('#'+topicId).click(); + }); + + addClickListenerToEachCollapseTrigger(); + + $scope.loadingData = false; + }; + + $scope.$on("refreshTopicsOverview", function (event) { + $scope.refreshTopicsOverview(); + }); + + $scope.onAddMainTopic = function(resourceType){ + + var postBody = { + "topicResource": resourceType, + "topicType": "main", + "subTopics": [] + }; + + if(resourceType === "indicator"){ + postBody.topicName = $scope.newMainTopicTitle_indicator; + postBody.topicDescription = $scope.newMainTopicDescription_indicator; + } + else{ + postBody.topicName = $scope.newMainTopicTitle_georesource; + postBody.topicDescription = $scope.newMainTopicDescription_georesource; + } + + $scope.loadingData = true; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics", + method: "POST", + data: postBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + + $scope.refreshTopicsOverview(); + + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#topicsErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + + $scope.newMainTopicTitle_indicator = undefined; + $scope.newMainTopicDescription_indicator = undefined; + $scope.newMainTopicTitle_georesource = undefined; + $scope.newMainTopicDescription_georesource = undefined; + }; + + $scope.onAddSubTopic = function(mainTopic, resourceType){ + + $scope.loadingData = true; + var topicId = mainTopic.topicId; + + var subTopic = { + "topicResource": resourceType, + "topicType": "sub", + "subTopics": [] + }; + + if(resourceType === "indicator"){ + subTopic.topicName = mainTopic.newSubTopicTitle_indicator; + subTopic.topicDescription = mainTopic.newSubTopicDescription_indicator; + } + else{ + subTopic.topicName = mainTopic.newSubTopicTitle_georesource; + subTopic.topicDescription = mainTopic.newSubTopicDescription_georesource; + } + + // check if subTopic already exists, then abort - add to mainTopic otherwise + if($scope.alreadyInSubtopics(subTopic, mainTopic.subTopics)){ + $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; + + $("#topicsErrorAlert").show(); + $scope.loadingData = false; + return; + } + else{ + mainTopic.subTopics.push(subTopic); + } + + var putBody = { + "topicName": mainTopic.topicName, + "topicDescription": mainTopic.topicDescription, + "topicResource": resourceType, + "topicType": mainTopic.topicType, + "subTopics": mainTopic.subTopics + }; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "PUT", + data: putBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + + $scope.refreshTopicsOverview(); + + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#topicsErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + + delete mainTopic.newSubTopicTitle_indicator; + delete mainTopic.newSubTopicDescription_indicator; + }; + + $scope.alreadyInSubtopics = function(subTopicCandidate, subTopics){ + for(var subTopic of subTopics){ + if (subTopic.topicName === subTopicCandidate.topicName){ + return true; + } + } + return false; + }; + + $scope.onAddSubSubSubTopic = function(subTopic, resourceType){ + + $scope.loadingData = true; + var topicId = subTopic.topicId; + + var subSubSubTopic = { + "topicResource": resourceType, + "topicType": "sub", + "subTopics": [] + }; + + if(resourceType === "indicator"){ + subSubSubTopic.topicName = subTopic.newSubTopicTitle_indicator; + subSubSubTopic.topicDescription = subTopic.newSubTopicDescription_indicator; + } + else{ + subSubSubTopic.topicName = subTopic.newSubTopicTitle_georesource; + subSubSubTopic.topicDescription = subTopic.newSubTopicDescription_georesource; + } + + // check if subTopic already exists, then abort - add to mainTopic otherwise + if($scope.alreadyInSubtopics(subSubSubTopic, subTopic.subTopics)){ + $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; + + $("#topicsErrorAlert").show(); + $scope.loadingData = false; + return; + } + else{ + subTopic.subTopics.push(subSubSubTopic); + } + + var putBody = { + "topicName": subTopic.topicName, + "topicDescription": subTopic.topicDescription, + "topicResource": resourceType, + "topicType": subTopic.topicType, + "subTopics": subTopic.subTopics + }; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "PUT", + data: putBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + + $scope.refreshTopicsOverview(); + + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#topicsErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + + delete subTopic.newSubTopicTitle_indicator; + delete subTopic.newSubTopicDescription_indicator; + }; + + $scope.onAddSubSubTopic = function(subTopic, resourceType){ + + $scope.loadingData = true; + var topicId = subTopic.topicId; + + var subSubTopic = { + "topicResource": resourceType, + "topicType": "sub", + "subTopics": [] + }; + + if(resourceType === "indicator"){ + subSubTopic.topicName = subTopic.newSubTopicTitle_indicator; + subSubTopic.topicDescription = subTopic.newSubTopicDescription_indicator; + } + else{ + subSubTopic.topicName = subTopic.newSubTopicTitle_georesource; + subSubTopic.topicDescription = subTopic.newSubTopicDescription_georesource; + } + + // check if subTopic already exists, then abort - add to mainTopic otherwise + if($scope.alreadyInSubtopics(subSubTopic, subTopic.subTopics)){ + $scope.errorMessagePart = "Ein Unterthema mit dem gleichen Titel existiert bereits."; + + $("#topicsErrorAlert").show(); + $scope.loadingData = false; + return; + } + else{ + subTopic.subTopics.push(subSubTopic); + } + + var putBody = { + "topicName": subTopic.topicName, + "topicDescription": subTopic.topicDescription, + "topicResource": resourceType, + "topicType": subTopic.topicType, + "subTopics": subTopic.subTopics + }; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "PUT", + data: putBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + + $scope.refreshTopicsOverview(); + + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#topicsErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + + delete subTopic.newSubTopicTitle_indicator; + delete subTopic.newSubTopicDescription_indicator; + }; + + $scope.deleteTopic = function(topic){ + + var topicId = topic.topicId; + + $scope.loadingData = true; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "DELETE" + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + + $scope.refreshTopicsOverview(); + + $timeout(function(){ + + $scope.loadingData = false; + }); + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#topicsErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + }; + + $scope.onClickEditTopic = function(topic){ + // submit selected topic to modal controller + $rootScope.$broadcast("onEditTopic", topic); + }; + + $scope.onClickDeleteTopic = function(topic){ + // submit selected topic to modal controller + $rootScope.$broadcast("onDeleteTopic", topic); + }; + + $scope.hideErrorAlert = function(){ + $("#topicsErrorAlert").hide(); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.js b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.js index 75966eaa5..8ebe959fd 100644 --- a/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.js +++ b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('adminTopicsManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'ui.bootstrap']); +//# sourceMappingURL=admin-topics-management.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.js.map b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.js.map new file mode 100644 index 000000000..7b272ea41 --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin-topics-management.module.js","sourceRoot":"","sources":["admin-topics-management.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,wBAAwB,EAAE,uBAAuB,EAAE,cAAc,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.ts b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.ts new file mode 100644 index 000000000..75966eaa5 --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/admin-topics-management.module.ts @@ -0,0 +1 @@ +angular.module('adminTopicsManagement', ['kommonitorDataExchange', 'kommonitorCacheHelper', 'ui.bootstrap']); diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.js b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.js index 7b283dde5..3074721a1 100644 --- a/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.js +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.js @@ -1,105 +1,76 @@ +"use strict"; angular.module('topicDeleteModal').component('topicDeleteModal', { - templateUrl : "components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout',function TopicDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.topicToDelete; - $scope.topicToDelete_prettyPrint; - - $scope.loadingData = false; - - $scope.errorMessagePart = undefined; - - $scope.$on("onDeleteTopic", function (event, topic) { - - $scope.topicToDelete = topic; - - // $scope.topicToDelete_prettyPrint = JSON.stringify(topic, null, 2); // spacing level = 2; - $scope.topicToDelete_prettyPrint = kommonitorDataExchangeService.syntaxHighlightJSON(topic); - - document.getElementById("deleteTopicPre").innerHTML = $scope.topicToDelete_prettyPrint; - - $scope.resetTopicDeleteForm(); - - }); - - - $scope.resetTopicDeleteForm = function(){ - $scope.errorMessagePart = undefined; - $("#topicDeleteSuccessAlert").hide(); - $("#topicDeleteErrorAlert").hide(); - }; - - $scope.deleteTopic = function(topic){ - - var topicId = topic.topicId; - - $scope.loadingData = true; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, - method: "DELETE" - // headers: { - // 'Content-Type': undefined - // } - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - - $rootScope.$broadcast("refreshTopicsOverview"); - - // refresh all admin dashboard diagrams due to modified metadata - $rootScope.$broadcast("refreshAdminDashboardDiagrams"); - - $timeout(function(){ - - $scope.loadingData = false; - $scope.showSuccessAlert(); - }); - - }, function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#topicsErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - // setTimeout(function() { - // $("#spatialUnitAddSucessAlert").hide(); - // }, 3000); - }); - - }; - - $scope.hideSuccessAlert = function(){ - $("#topicDeleteSuccessAlert").hide(); - - $scope.topicToDelete = undefined; - $scope.topicToDelete_prettyPrint = undefined; - document.getElementById("deleteTopicPre").innerHTML = undefined; - }; - - $scope.showSuccessAlert = function(){ - $("#topicDeleteSuccessAlert").show(); - }; - - $scope.hideErrorAlert = function(){ - $("#topicDeleteErrorAlert").hide(); - }; - - $scope.showErrorAlert = function(){ - $("#topicDeleteErrorAlert").show(); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout', function TopicDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.topicToDelete; + $scope.topicToDelete_prettyPrint; + $scope.loadingData = false; + $scope.errorMessagePart = undefined; + $scope.$on("onDeleteTopic", function (event, topic) { + $scope.topicToDelete = topic; + // $scope.topicToDelete_prettyPrint = JSON.stringify(topic, null, 2); // spacing level = 2; + $scope.topicToDelete_prettyPrint = kommonitorDataExchangeService.syntaxHighlightJSON(topic); + document.getElementById("deleteTopicPre").innerHTML = $scope.topicToDelete_prettyPrint; + $scope.resetTopicDeleteForm(); + }); + $scope.resetTopicDeleteForm = function () { + $scope.errorMessagePart = undefined; + $("#topicDeleteSuccessAlert").hide(); + $("#topicDeleteErrorAlert").hide(); + }; + $scope.deleteTopic = function (topic) { + var topicId = topic.topicId; + $scope.loadingData = true; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "DELETE" + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + $rootScope.$broadcast("refreshTopicsOverview"); + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + $timeout(function () { + $scope.loadingData = false; + $scope.showSuccessAlert(); + }); + }, function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#topicsErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + }; + $scope.hideSuccessAlert = function () { + $("#topicDeleteSuccessAlert").hide(); + $scope.topicToDelete = undefined; + $scope.topicToDelete_prettyPrint = undefined; + document.getElementById("deleteTopicPre").innerHTML = undefined; + }; + $scope.showSuccessAlert = function () { + $("#topicDeleteSuccessAlert").show(); + }; + $scope.hideErrorAlert = function () { + $("#topicDeleteErrorAlert").hide(); + }; + $scope.showErrorAlert = function () { + $("#topicDeleteErrorAlert").show(); + }; + } + ] +}); +//# sourceMappingURL=topic-delete-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.js.map b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.js.map new file mode 100644 index 000000000..9aaa7fb1f --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"topic-delete-modal.component.js","sourceRoot":"","sources":["topic-delete-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.ts b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.ts new file mode 100644 index 000000000..7b283dde5 --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.component.ts @@ -0,0 +1,105 @@ +angular.module('topicDeleteModal').component('topicDeleteModal', { + templateUrl : "components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$q', '$timeout',function TopicDeleteModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $q, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.topicToDelete; + $scope.topicToDelete_prettyPrint; + + $scope.loadingData = false; + + $scope.errorMessagePart = undefined; + + $scope.$on("onDeleteTopic", function (event, topic) { + + $scope.topicToDelete = topic; + + // $scope.topicToDelete_prettyPrint = JSON.stringify(topic, null, 2); // spacing level = 2; + $scope.topicToDelete_prettyPrint = kommonitorDataExchangeService.syntaxHighlightJSON(topic); + + document.getElementById("deleteTopicPre").innerHTML = $scope.topicToDelete_prettyPrint; + + $scope.resetTopicDeleteForm(); + + }); + + + $scope.resetTopicDeleteForm = function(){ + $scope.errorMessagePart = undefined; + $("#topicDeleteSuccessAlert").hide(); + $("#topicDeleteErrorAlert").hide(); + }; + + $scope.deleteTopic = function(topic){ + + var topicId = topic.topicId; + + $scope.loadingData = true; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "DELETE" + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + + $rootScope.$broadcast("refreshTopicsOverview"); + + // refresh all admin dashboard diagrams due to modified metadata + $rootScope.$broadcast("refreshAdminDashboardDiagrams"); + + $timeout(function(){ + + $scope.loadingData = false; + $scope.showSuccessAlert(); + }); + + }, function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#topicsErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + // setTimeout(function() { + // $("#spatialUnitAddSucessAlert").hide(); + // }, 3000); + }); + + }; + + $scope.hideSuccessAlert = function(){ + $("#topicDeleteSuccessAlert").hide(); + + $scope.topicToDelete = undefined; + $scope.topicToDelete_prettyPrint = undefined; + document.getElementById("deleteTopicPre").innerHTML = undefined; + }; + + $scope.showSuccessAlert = function(){ + $("#topicDeleteSuccessAlert").show(); + }; + + $scope.hideErrorAlert = function(){ + $("#topicDeleteErrorAlert").hide(); + }; + + $scope.showErrorAlert = function(){ + $("#topicDeleteErrorAlert").show(); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.js b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.js index dbfe2522f..1a0fc6404 100644 --- a/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.js +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('topicDeleteModal', []); +//# sourceMappingURL=topic-delete-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.js.map b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.js.map new file mode 100644 index 000000000..1e57e4fba --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"topic-delete-modal.module.js","sourceRoot":"","sources":["topic-delete-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.ts b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.ts new file mode 100644 index 000000000..dbfe2522f --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicDeleteModal/topic-delete-modal.module.ts @@ -0,0 +1 @@ +angular.module('topicDeleteModal', []); diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.js b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.js index a4409ccc3..5d808b653 100644 --- a/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.js +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.js @@ -1,80 +1,62 @@ +"use strict"; angular.module('topicEditModal').component('topicEditModal', { - templateUrl : "components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout',function TopicEditModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.currentTopic; - - $scope.loadingData = false; - - $scope.errorMessagePart = undefined; - - $scope.$on("onEditTopic", function (event, topic) { - - $scope.currentTopic = topic; - }); - - $scope.updateTopic = function(topic){ - $scope.loadingData = true; - - var topicId = topic.topicId; - - var putBody = { - "topicName": topic.topicName, - "topicDescription": topic.topicDescription, - "topicType": topic.topicType, - "topicResource": topic.topicResource, - "subTopics": topic.subTopics - }; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, - method: "PUT", - data: putBody - // headers: { - // 'Content-Type': undefined - // } - }).then(async function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); - - $rootScope.$broadcast("refreshTopicsOverview"); - - $("#topicEditMetadataSuccessAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - // - // $scope.refreshTopicsOverview(); - - }, async function errorCallback(error) { - if(error.data){ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); - } - else{ - $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); - } - - $("#topicEditMetadataErrorAlert").show(); - $timeout(function(){ - - $scope.loadingData = false; - }); - - }); - }; - - $scope.hideSuccessAlert = function(){ - $("#topicEditMetadataSuccessAlert").hide(); - }; - - $scope.hideErrorAlert = function(){ - $("#topicEditMetadataErrorAlert").hide(); - }; - - } -]}); + templateUrl: "components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout', function TopicEditModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.currentTopic; + $scope.loadingData = false; + $scope.errorMessagePart = undefined; + $scope.$on("onEditTopic", function (event, topic) { + $scope.currentTopic = topic; + }); + $scope.updateTopic = function (topic) { + $scope.loadingData = true; + var topicId = topic.topicId; + var putBody = { + "topicName": topic.topicName, + "topicDescription": topic.topicDescription, + "topicType": topic.topicType, + "topicResource": topic.topicResource, + "subTopics": topic.subTopics + }; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "PUT", + data: putBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + $rootScope.$broadcast("refreshTopicsOverview"); + $("#topicEditMetadataSuccessAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + // + // $scope.refreshTopicsOverview(); + }, async function errorCallback(error) { + if (error.data) { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else { + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + $("#topicEditMetadataErrorAlert").show(); + $timeout(function () { + $scope.loadingData = false; + }); + }); + }; + $scope.hideSuccessAlert = function () { + $("#topicEditMetadataSuccessAlert").hide(); + }; + $scope.hideErrorAlert = function () { + $("#topicEditMetadataErrorAlert").hide(); + }; + } + ] +}); +//# sourceMappingURL=topic-edit-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.js.map b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.js.map new file mode 100644 index 000000000..0a6ccf626 --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"topic-edit-modal.component.js","sourceRoot":"","sources":["topic-edit-modal.component.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,gBAAgB,EAAE;IAC5D,WAAW,EAAG,gGAAgG;IAC9G,UAAU,EAAG,CAAC,+BAA+B,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAC,SAAS,wBAAwB,CAAC,6BAA6B,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ;YAE9M,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;YAE3E,MAAM,CAAC,YAAY,CAAC;YAEpB,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAE3B,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAEpC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,KAAK,EAAE,KAAK;gBAE/C,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,GAAG,UAAS,KAAK;gBAClC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;gBAE1B,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAE5B,IAAI,OAAO,GAAG;oBACZ,WAAW,EAAE,KAAK,CAAC,SAAS;oBAC5B,kBAAkB,EAAE,KAAK,CAAC,gBAAgB;oBAC1C,WAAW,EAAE,KAAK,CAAC,SAAS;oBAC5B,eAAe,EAAE,KAAK,CAAC,aAAa;oBACpC,WAAW,EAAE,KAAK,CAAC,SAAS;iBAC7B,CAAC;gBAEF,KAAK,CAAC;oBACL,GAAG,EAAE,6BAA6B,CAAC,0BAA0B,GAAG,UAAU,GAAG,OAAO;oBACpF,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,OAAO;oBACb,aAAa;oBACb,+BAA+B;oBAC/B,IAAI;iBACJ,CAAC,CAAC,IAAI,CAAC,KAAK,UAAU,eAAe,CAAC,QAAQ;oBAC7C,8CAA8C;oBAC9C,iCAAiC;oBAEjC,MAAM,6BAA6B,CAAC,mBAAmB,CAAC,6BAA6B,CAAC,yBAAyB,CAAC,CAAC;oBAEjH,UAAU,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;oBAE/C,CAAC,CAAC,gCAAgC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC3C,QAAQ,CAAC;wBAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC5B,CAAC,CAAC,CAAC;oBACH,EAAE;oBACF,kCAAkC;gBAEnC,CAAC,EAAE,KAAK,UAAU,aAAa,CAAC,KAAK;oBACpC,IAAG,KAAK,CAAC,IAAI,EAAC;wBACZ,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACxF;yBACG;wBACH,MAAM,CAAC,gBAAgB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;qBACnF;oBAEF,CAAC,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzC,QAAQ,CAAC;wBAER,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC5B,CAAC,CAAC,CAAC;gBAEL,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;YAED,MAAM,CAAC,gBAAgB,GAAG;gBACzB,CAAC,CAAC,gCAAgC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5C,CAAC,CAAC;YAEF,MAAM,CAAC,cAAc,GAAG;gBACvB,CAAC,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,CAAC,CAAC;QAEJ,CAAC;KACD;CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.ts b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.ts new file mode 100644 index 000000000..a4409ccc3 --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.component.ts @@ -0,0 +1,80 @@ +angular.module('topicEditModal').component('topicEditModal', { + templateUrl : "components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '$http', '__env', '$timeout',function TopicEditModalController(kommonitorDataExchangeService, $scope, $rootScope, $http, __env, $timeout) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + $scope.currentTopic; + + $scope.loadingData = false; + + $scope.errorMessagePart = undefined; + + $scope.$on("onEditTopic", function (event, topic) { + + $scope.currentTopic = topic; + }); + + $scope.updateTopic = function(topic){ + $scope.loadingData = true; + + var topicId = topic.topicId; + + var putBody = { + "topicName": topic.topicName, + "topicDescription": topic.topicDescription, + "topicType": topic.topicType, + "topicResource": topic.topicResource, + "subTopics": topic.subTopics + }; + + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/topics/" + topicId, + method: "PUT", + data: putBody + // headers: { + // 'Content-Type': undefined + // } + }).then(async function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + await kommonitorDataExchangeService.fetchTopicsMetadata(kommonitorDataExchangeService.currentKeycloakLoginRoles); + + $rootScope.$broadcast("refreshTopicsOverview"); + + $("#topicEditMetadataSuccessAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + // + // $scope.refreshTopicsOverview(); + + }, async function errorCallback(error) { + if(error.data){ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error.data); + } + else{ + $scope.errorMessagePart = kommonitorDataExchangeService.syntaxHighlightJSON(error); + } + + $("#topicEditMetadataErrorAlert").show(); + $timeout(function(){ + + $scope.loadingData = false; + }); + + }); + }; + + $scope.hideSuccessAlert = function(){ + $("#topicEditMetadataSuccessAlert").hide(); + }; + + $scope.hideErrorAlert = function(){ + $("#topicEditMetadataErrorAlert").hide(); + }; + + } +]}); diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.js b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.js index 866d723f8..ec32e4205 100644 --- a/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.js +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.js @@ -1 +1,3 @@ +"use strict"; angular.module('topicEditModal', []); +//# sourceMappingURL=topic-edit-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.js.map b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.js.map new file mode 100644 index 000000000..1ed68a425 --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"topic-edit-modal.module.js","sourceRoot":"","sources":["topic-edit-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.ts b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.ts new file mode 100644 index 000000000..866d723f8 --- /dev/null +++ b/app/components/kommonitorAdmin/adminTopicsManagement/topicEditModal/topic-edit-modal.module.ts @@ -0,0 +1 @@ +angular.module('topicEditModal', []); diff --git a/app/components/kommonitorAdmin/kommonitor-admin.component.js b/app/components/kommonitorAdmin/kommonitor-admin.component.js index 0481afea2..be76dc6de 100644 --- a/app/components/kommonitorAdmin/kommonitor-admin.component.js +++ b/app/components/kommonitorAdmin/kommonitor-admin.component.js @@ -1,82 +1,63 @@ +"use strict"; angular - .module('kommonitorAdmin') - .component( - 'kommonitorAdmin', - { - templateUrl : "components/kommonitorAdmin/kommonitor-admin.template.html", - controller : ['kommonitorDataExchangeService', '$location', "$rootScope", '$scope', function kommonitorAdminController( - kommonitorDataExchangeService, $location, $rootScope, $scope) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - this.selectedResourceType = 'spatialUnits'; - - $scope.activeItemBackupId = "adminDashboardNavItem"; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - // $rootScope.$on("$locationChangeStart", function(event){ - // if (! kommonitorDataExchangeService.adminIsLoggedIn){ - // // redirect to main page - // console.log("No Admin user is logged in - Prevent access to ADMIN panel"); - // $location.path('/'); - // } - // - // }); - - this.init = function(){ - // if(! kommonitorDataExchangeService.enableKeycloakSecurity){ - // this.checkAuthorizationOnStartup_withoutKeycloak(); - // } - kommonitorDataExchangeService.fetchAllMetadata(); - }; - - this.init(); - - $scope.onClickGeodataAdminPanel = function(idOfNavBarItem){ - $scope.activeItemBackupId = idOfNavBarItem; - $('.sidebar-menu li').removeClass("active"); - - document.getElementById('adminGeodataWrapperNavItem').setAttribute("class", "active"); - }; - - $scope.onClickConfigAdminPanel = function(idOfNavBarItem){ - $scope.activeItemBackupId = idOfNavBarItem; - $('.sidebar-menu li').removeClass("active"); - - document.getElementById('adminConfigWrapperNavItem').setAttribute("class", "active"); - }; - - $scope.onClickOtherAdminPanel = function(idOfNavBarItem){ - $scope.activeItemBackupId = idOfNavBarItem; - $('#adminGeodataWrapperNavItem ul li').removeClass("active"); - $('#adminConfigWrapperNavItem ul li').removeClass("active"); - }; - - $scope.onClickGeodataWrapperItem = function(){ - - // $('#adminGeodataWrapperNavItem').toggleClass("active"); - - setTimeout(function(){ - if($scope.activeItemBackupId != 'adminSpatialUnitsNavItem' && $scope.activeItemBackupId != 'adminGeoresourcesNavItem' && $scope.activeItemBackupId != 'adminIndicatorsNavItem'){ - // $('#adminGeodataWrapperNavItem').toggleClass("active"); - $('#'+$scope.activeItemBackupId).addClass("active"); - } - }, 40); - }; - - $scope.onClickConfigWrapperItem = function(){ - - // $('#adminGeodataWrapperNavItem').toggleClass("active"); - - setTimeout(function(){ - if($scope.activeItemBackupId != 'adminAppConfigNavItem' && $scope.activeItemBackupId != 'adminKeycloakConfigNavItem' && $scope.activeItemBackupId != 'adminControlsConfigNavItem'){ - // $('#adminGeodataWrapperNavItem').toggleClass("active"); - $('#'+$scope.activeItemBackupId).addClass("active"); - } - }, 40); - }; - - } - ]}); + .module('kommonitorAdmin') + .component('kommonitorAdmin', { + templateUrl: "components/kommonitorAdmin/kommonitor-admin.template.html", + controller: ['kommonitorDataExchangeService', '$location', "$rootScope", '$scope', function kommonitorAdminController(kommonitorDataExchangeService, $location, $rootScope, $scope) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.selectedResourceType = 'spatialUnits'; + $scope.activeItemBackupId = "adminDashboardNavItem"; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + // $rootScope.$on("$locationChangeStart", function(event){ + // if (! kommonitorDataExchangeService.adminIsLoggedIn){ + // // redirect to main page + // console.log("No Admin user is logged in - Prevent access to ADMIN panel"); + // $location.path('/'); + // } + // + // }); + this.init = function () { + // if(! kommonitorDataExchangeService.enableKeycloakSecurity){ + // this.checkAuthorizationOnStartup_withoutKeycloak(); + // } + kommonitorDataExchangeService.fetchAllMetadata(); + }; + this.init(); + $scope.onClickGeodataAdminPanel = function (idOfNavBarItem) { + $scope.activeItemBackupId = idOfNavBarItem; + $('.sidebar-menu li').removeClass("active"); + document.getElementById('adminGeodataWrapperNavItem').setAttribute("class", "active"); + }; + $scope.onClickConfigAdminPanel = function (idOfNavBarItem) { + $scope.activeItemBackupId = idOfNavBarItem; + $('.sidebar-menu li').removeClass("active"); + document.getElementById('adminConfigWrapperNavItem').setAttribute("class", "active"); + }; + $scope.onClickOtherAdminPanel = function (idOfNavBarItem) { + $scope.activeItemBackupId = idOfNavBarItem; + $('#adminGeodataWrapperNavItem ul li').removeClass("active"); + $('#adminConfigWrapperNavItem ul li').removeClass("active"); + }; + $scope.onClickGeodataWrapperItem = function () { + // $('#adminGeodataWrapperNavItem').toggleClass("active"); + setTimeout(function () { + if ($scope.activeItemBackupId != 'adminSpatialUnitsNavItem' && $scope.activeItemBackupId != 'adminGeoresourcesNavItem' && $scope.activeItemBackupId != 'adminIndicatorsNavItem') { + // $('#adminGeodataWrapperNavItem').toggleClass("active"); + $('#' + $scope.activeItemBackupId).addClass("active"); + } + }, 40); + }; + $scope.onClickConfigWrapperItem = function () { + // $('#adminGeodataWrapperNavItem').toggleClass("active"); + setTimeout(function () { + if ($scope.activeItemBackupId != 'adminAppConfigNavItem' && $scope.activeItemBackupId != 'adminKeycloakConfigNavItem' && $scope.activeItemBackupId != 'adminControlsConfigNavItem') { + // $('#adminGeodataWrapperNavItem').toggleClass("active"); + $('#' + $scope.activeItemBackupId).addClass("active"); + } + }, 40); + }; + } + ] +}); +//# sourceMappingURL=kommonitor-admin.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/kommonitor-admin.component.js.map b/app/components/kommonitorAdmin/kommonitor-admin.component.js.map new file mode 100644 index 000000000..5ad6b8c05 --- /dev/null +++ b/app/components/kommonitorAdmin/kommonitor-admin.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-admin.component.js","sourceRoot":"","sources":["kommonitor-admin.component.ts"],"names":[],"mappings":";AAAA,OAAO;KACJ,MAAM,CAAC,iBAAiB,CAAC;KACzB,SAAS,CACR,iBAAiB,EACjB;IACC,WAAW,EAAG,2DAA2D;IACzE,UAAU,EAAG,CAAC,+BAA+B,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,yBAAyB,CACpH,6BAA6B,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM;YAE3D,IAAI,CAAC,qCAAqC,GAAG,6BAA6B,CAAC;YAE3E,IAAI,CAAC,oBAAoB,GAAG,cAAc,CAAC;YAE3C,MAAM,CAAC,kBAAkB,GAAG,uBAAuB,CAAC;YAEpD,sCAAsC;YACrC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YAEvB,0DAA0D;YACrD,0DAA0D;YAC/D,6BAA6B;YAC7B,+EAA+E;YAC/E,yBAAyB;YACzB,KAAK;YACL,EAAE;YACH,MAAM;YAEL,IAAI,CAAC,IAAI,GAAG;gBACX,8DAA8D;gBAC9D,yDAAyD;gBACzD,IAAI;gBACJ,6BAA6B,CAAC,gBAAgB,EAAE,CAAC;YAClD,CAAC,CAAC;YAEF,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,MAAM,CAAC,wBAAwB,GAAG,UAAS,cAAc;gBACxD,MAAM,CAAC,kBAAkB,GAAG,cAAc,CAAC;gBAC3C,CAAC,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAE5C,QAAQ,CAAC,cAAc,CAAC,4BAA4B,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACvF,CAAC,CAAC;YAEF,MAAM,CAAC,uBAAuB,GAAG,UAAS,cAAc;gBACvD,MAAM,CAAC,kBAAkB,GAAG,cAAc,CAAC;gBAC3C,CAAC,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAE5C,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtF,CAAC,CAAC;YAEF,MAAM,CAAC,sBAAsB,GAAG,UAAS,cAAc;gBACtD,MAAM,CAAC,kBAAkB,GAAG,cAAc,CAAC;gBAC3C,CAAC,CAAC,mCAAmC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC7D,CAAC,CAAC,kCAAkC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7D,CAAC,CAAC;YAEF,MAAM,CAAC,yBAAyB,GAAG;gBAElC,0DAA0D;gBAE1D,UAAU,CAAC;oBACV,IAAG,MAAM,CAAC,kBAAkB,IAAI,0BAA0B,IAAI,MAAM,CAAC,kBAAkB,IAAI,0BAA0B,IAAI,MAAM,CAAC,kBAAkB,IAAI,wBAAwB,EAAC;wBAC9K,0DAA0D;wBAC1D,CAAC,CAAC,GAAG,GAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;qBACpD;gBACF,CAAC,EAAE,EAAE,CAAC,CAAC;YACR,CAAC,CAAC;YAEF,MAAM,CAAC,wBAAwB,GAAG;gBAEjC,0DAA0D;gBAE1D,UAAU,CAAC;oBACV,IAAG,MAAM,CAAC,kBAAkB,IAAI,uBAAuB,IAAI,MAAM,CAAC,kBAAkB,IAAI,4BAA4B,IAAI,MAAM,CAAC,kBAAkB,IAAI,4BAA4B,EAAC;wBACjL,0DAA0D;wBAC1D,CAAC,CAAC,GAAG,GAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;qBACpD;gBACF,CAAC,EAAE,EAAE,CAAC,CAAC;YACR,CAAC,CAAC;QAEL,CAAC;KACD;CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/kommonitor-admin.component.ts b/app/components/kommonitorAdmin/kommonitor-admin.component.ts new file mode 100644 index 000000000..0481afea2 --- /dev/null +++ b/app/components/kommonitorAdmin/kommonitor-admin.component.ts @@ -0,0 +1,82 @@ +angular + .module('kommonitorAdmin') + .component( + 'kommonitorAdmin', + { + templateUrl : "components/kommonitorAdmin/kommonitor-admin.template.html", + controller : ['kommonitorDataExchangeService', '$location', "$rootScope", '$scope', function kommonitorAdminController( + kommonitorDataExchangeService, $location, $rootScope, $scope) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + this.selectedResourceType = 'spatialUnits'; + + $scope.activeItemBackupId = "adminDashboardNavItem"; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + // $rootScope.$on("$locationChangeStart", function(event){ + // if (! kommonitorDataExchangeService.adminIsLoggedIn){ + // // redirect to main page + // console.log("No Admin user is logged in - Prevent access to ADMIN panel"); + // $location.path('/'); + // } + // + // }); + + this.init = function(){ + // if(! kommonitorDataExchangeService.enableKeycloakSecurity){ + // this.checkAuthorizationOnStartup_withoutKeycloak(); + // } + kommonitorDataExchangeService.fetchAllMetadata(); + }; + + this.init(); + + $scope.onClickGeodataAdminPanel = function(idOfNavBarItem){ + $scope.activeItemBackupId = idOfNavBarItem; + $('.sidebar-menu li').removeClass("active"); + + document.getElementById('adminGeodataWrapperNavItem').setAttribute("class", "active"); + }; + + $scope.onClickConfigAdminPanel = function(idOfNavBarItem){ + $scope.activeItemBackupId = idOfNavBarItem; + $('.sidebar-menu li').removeClass("active"); + + document.getElementById('adminConfigWrapperNavItem').setAttribute("class", "active"); + }; + + $scope.onClickOtherAdminPanel = function(idOfNavBarItem){ + $scope.activeItemBackupId = idOfNavBarItem; + $('#adminGeodataWrapperNavItem ul li').removeClass("active"); + $('#adminConfigWrapperNavItem ul li').removeClass("active"); + }; + + $scope.onClickGeodataWrapperItem = function(){ + + // $('#adminGeodataWrapperNavItem').toggleClass("active"); + + setTimeout(function(){ + if($scope.activeItemBackupId != 'adminSpatialUnitsNavItem' && $scope.activeItemBackupId != 'adminGeoresourcesNavItem' && $scope.activeItemBackupId != 'adminIndicatorsNavItem'){ + // $('#adminGeodataWrapperNavItem').toggleClass("active"); + $('#'+$scope.activeItemBackupId).addClass("active"); + } + }, 40); + }; + + $scope.onClickConfigWrapperItem = function(){ + + // $('#adminGeodataWrapperNavItem').toggleClass("active"); + + setTimeout(function(){ + if($scope.activeItemBackupId != 'adminAppConfigNavItem' && $scope.activeItemBackupId != 'adminKeycloakConfigNavItem' && $scope.activeItemBackupId != 'adminControlsConfigNavItem'){ + // $('#adminGeodataWrapperNavItem').toggleClass("active"); + $('#'+$scope.activeItemBackupId).addClass("active"); + } + }, 40); + }; + + } + ]}); diff --git a/app/components/kommonitorAdmin/kommonitor-admin.module.js b/app/components/kommonitorAdmin/kommonitor-admin.module.js index 94086d4b2..cb5409996 100644 --- a/app/components/kommonitorAdmin/kommonitor-admin.module.js +++ b/app/components/kommonitorAdmin/kommonitor-admin.module.js @@ -1,14 +1,16 @@ +"use strict"; angular.module('kommonitorAdmin', ['kommonitorDataExchange', 'adminDashboardManagement', 'adminRoleManagement', 'adminTopicsManagement', -'adminSpatialUnitsManagement','adminIndicatorsManagement', 'adminGeoresourcesManagement', 'adminScriptManagement', 'adminScriptExecution', -'spatialUnitAddModal','spatialUnitEditMetadataModal', 'spatialUnitEditFeaturesModal','spatialUnitDeleteModal', -'georesourceDeleteModal','georesourceAddModal', 'georesourceEditFeaturesModal', 'georesourceEditMetadataModal', 'georesourceBatchUpdateModal', -'indicatorDeleteModal','indicatorAddModal', 'indicatorEditFeaturesModal', 'indicatorEditMetadataModal', 'indicatorBatchUpdateModal', -'batchUpdateResultModal', 'indicatorEditTimeseriesMapping', -'indicatorEditIndicatorSpatialUnitRolesModal', -'topicEditModal', 'topicDeleteModal', -'scriptAddModal', "scriptDeleteModal", -'adminAppConfig', 'adminKeycloakConfig', 'adminControlsConfig', -'roleAddModal', 'roleEditMetadataModal', 'roleDeleteModal', -'adminRoleExplanation', -// ,'spatialUnitDeleteModal', + 'adminSpatialUnitsManagement', 'adminIndicatorsManagement', 'adminGeoresourcesManagement', 'adminScriptManagement', 'adminScriptExecution', + 'spatialUnitAddModal', 'spatialUnitEditMetadataModal', 'spatialUnitEditFeaturesModal', 'spatialUnitDeleteModal', + 'georesourceDeleteModal', 'georesourceAddModal', 'georesourceEditFeaturesModal', 'georesourceEditMetadataModal', 'georesourceBatchUpdateModal', + 'indicatorDeleteModal', 'indicatorAddModal', 'indicatorEditFeaturesModal', 'indicatorEditMetadataModal', 'indicatorBatchUpdateModal', + 'batchUpdateResultModal', 'indicatorEditTimeseriesMapping', + 'indicatorEditIndicatorSpatialUnitRolesModal', + 'topicEditModal', 'topicDeleteModal', + 'scriptAddModal', "scriptDeleteModal", + 'adminAppConfig', 'adminKeycloakConfig', 'adminControlsConfig', + 'roleAddModal', 'roleEditMetadataModal', 'roleDeleteModal', + 'adminRoleExplanation', + // ,'spatialUnitDeleteModal', ]); +//# sourceMappingURL=kommonitor-admin.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorAdmin/kommonitor-admin.module.js.map b/app/components/kommonitorAdmin/kommonitor-admin.module.js.map new file mode 100644 index 000000000..8d3cc3aef --- /dev/null +++ b/app/components/kommonitorAdmin/kommonitor-admin.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-admin.module.js","sourceRoot":"","sources":["kommonitor-admin.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,wBAAwB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,uBAAuB;IACvI,6BAA6B,EAAC,2BAA2B,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,sBAAsB;IACzI,qBAAqB,EAAC,8BAA8B,EAAE,8BAA8B,EAAC,wBAAwB;IAC7G,wBAAwB,EAAC,qBAAqB,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,6BAA6B;IAC7I,sBAAsB,EAAC,mBAAmB,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,2BAA2B;IACnI,wBAAwB,EAAE,gCAAgC;IAC1D,6CAA6C;IAC7C,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,mBAAmB;IACrC,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB;IAC9D,cAAc,EAAE,uBAAuB,EAAE,iBAAiB;IAC1D,sBAAsB;IACtB,6BAA6B;CAC5B,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorAdmin/kommonitor-admin.module.ts b/app/components/kommonitorAdmin/kommonitor-admin.module.ts new file mode 100644 index 000000000..94086d4b2 --- /dev/null +++ b/app/components/kommonitorAdmin/kommonitor-admin.module.ts @@ -0,0 +1,14 @@ +angular.module('kommonitorAdmin', ['kommonitorDataExchange', 'adminDashboardManagement', 'adminRoleManagement', 'adminTopicsManagement', +'adminSpatialUnitsManagement','adminIndicatorsManagement', 'adminGeoresourcesManagement', 'adminScriptManagement', 'adminScriptExecution', +'spatialUnitAddModal','spatialUnitEditMetadataModal', 'spatialUnitEditFeaturesModal','spatialUnitDeleteModal', +'georesourceDeleteModal','georesourceAddModal', 'georesourceEditFeaturesModal', 'georesourceEditMetadataModal', 'georesourceBatchUpdateModal', +'indicatorDeleteModal','indicatorAddModal', 'indicatorEditFeaturesModal', 'indicatorEditMetadataModal', 'indicatorBatchUpdateModal', +'batchUpdateResultModal', 'indicatorEditTimeseriesMapping', +'indicatorEditIndicatorSpatialUnitRolesModal', +'topicEditModal', 'topicDeleteModal', +'scriptAddModal', "scriptDeleteModal", +'adminAppConfig', 'adminKeycloakConfig', 'adminControlsConfig', +'roleAddModal', 'roleEditMetadataModal', 'roleDeleteModal', +'adminRoleExplanation', +// ,'spatialUnitDeleteModal', +]); diff --git a/app/components/kommonitorUserInterface/kommonitor-user-interface.component.js b/app/components/kommonitorUserInterface/kommonitor-user-interface.component.js index 4c8a2733f..979f6c0f4 100644 --- a/app/components/kommonitorUserInterface/kommonitor-user-interface.component.js +++ b/app/components/kommonitorUserInterface/kommonitor-user-interface.component.js @@ -1,1077 +1,988 @@ +"use strict"; angular.module('kommonitorUserInterface').component('kommonitorUserInterface', { - templateUrl : "components/kommonitorUserInterface/kommonitor-user-interface.template.html", - controller : ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', 'kommonitorElementVisibilityHelperService', '$scope', - '$rootScope', '$location', 'Auth', 'ControlsConfigService', '$compile', 'kommonitorShareHelperService', '__env', - function UserInterfaceController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, kommonitorElementVisibilityHelperService, - $scope, $rootScope, $location, Auth, ControlsConfigService, $compile, kommonitorShareHelperService, __env) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; - this.kommonitorElementVisibilityHelperServiceInstance = kommonitorElementVisibilityHelperService; - - kommonitorDataExchangeService.anySideBarIsShown = false; - - - kommonitorDataExchangeService.currentKeycloakUser; - $scope.password; - $scope.showAdminLogin = false; - - $scope.init = async function () { - // initialize application - console.log("Initialize Application"); - if ($scope.authenticated) { - console.log("Authetication successfull"); - } - - await checkAuthentication(); - - kommonitorShareHelperService.init(); - - kommonitorDataExchangeService.fetchAllMetadata(); - }; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $scope.sidebarIndicatorConfigClass = "disappear"; - $scope.sidebarDiagramsClass = "disappear"; - $scope.sidebarRadarDiagramClass = "disappear"; - $scope.sidebarProcessingClass = "disappear"; - $scope.sidebarRegressionDiagramClass = "disappear"; - $scope.sidebarFilterClass = "disappear"; - $scope.sidebarBalanceClass = "disappear"; - $scope.sidebarReachabilityClass = "disappear"; - $scope.sidebarPoiClass = "disappear"; - $scope.sidebarDataImportClass = "disappear"; - - $scope.sidebarLegendClass = ""; - - $scope.buttonIndicatorConfigClass = "btn btn-custom btn-circle"; - $scope.buttonDiagramsClass = "btn btn-custom btn-circle"; - $scope.buttonRadarDiagramClass = "btn btn-custom btn-circle"; - $scope.buttonProcessingClass = "btn btn-custom btn-circle"; - $scope.buttonRegressionDiagramClass = "btn btn-custom btn-circle"; - $scope.buttonFilterClass = "btn btn-custom btn-circle"; - $scope.buttonBalanceClass = "btn btn-custom btn-circle"; - $scope.buttonReachabilityClass = "btn btn-custom btn-circle"; - $scope.buttonPoiClass = "btn btn-custom btn-circle"; - $scope.buttonDataImportClass = "btn btn-custom btn-circle"; - - $scope.buttonLegendClass = "btn btn-custom-docked-right btn-docked-right"; - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - Auth.keycloak.onAuthLogout = function() { - console.log("Logout successfull"); - checkAuthentication(); - } - - Auth.keycloak.onAuthSuccess = function() { - console.log("User successfully authenticated"); - checkAuthentication(); - } - - $scope.tryLoginUser_withoutKeycloak = function(){ - // TODO FIXME make generic user login once user/role concept is implemented - - // currently only simple ADMIN user login is possible - console.log("Check user login"); - if (kommonitorDataExchangeService.adminUserName === kommonitorDataExchangeService.currentKeycloakUser && kommonitorDataExchangeService.adminPassword === $scope.password){ - // success login --> currently switch to ADMIN page directly - console.log("User Login success - redirect to Admin Page"); - kommonitorDataExchangeService.adminIsLoggedIn = true; - $location.path('/administration'); - } - }; - - $scope.tryLoginUser = function(){ - if(kommonitorDataExchangeService.enableKeycloakSecurity){ - Auth.keycloak.login(); - } - else{ - $scope.tryLoginUser_withoutKeycloak(); - } - - }; - - $scope.tryLogoutUser = function() { - Auth.keycloak.logout(); - }; - - $scope.tryLoginUserByKeypress = function ($event) { - var keyCode = $event.which || $event.keyCode; - //check for enter key - if (keyCode === 13) { - $scope.tryLoginUser(); - } - }; - - var checkAuthentication = async function () { - kommonitorDataExchangeService.currentKeycloakLoginRoles = []; - - if (Auth.keycloak.authenticated) { - $scope.authenticated = Auth.keycloak.authenticated; - if(Auth.keycloak.tokenParsed - && Auth.keycloak.tokenParsed.realm_access - && Auth.keycloak.tokenParsed.realm_access.roles - && Auth.keycloak.tokenParsed.realm_access.roles.some(role => role.endsWith("-creator") || role.endsWith("-publisher") || role.endsWith("-editor"))){ - Auth.keycloak.showAdminView = true; - $scope.showAdminLogin = true; - } - } - }; - - $scope.openAdminUI = function () { - $location.path('/administration'); - }; - - $scope.undockButtons = function(){ - $scope.buttonIndicatorConfigClass = "btn btn-custom btn-circle"; - $scope.buttonDiagramsClass = "btn btn-custom btn-circle"; - $scope.buttonRadarDiagramClass = "btn btn-custom btn-circle"; - $scope.buttonProcessingClass = "btn btn-custom btn-circle"; - $scope.buttonRegressionDiagramClass = "btn btn-custom btn-circle"; - $scope.buttonFilterClass = "btn btn-custom btn-circle"; - $scope.buttonBalanceClass = "btn btn-custom btn-circle"; - $scope.buttonReachabilityClass = "btn btn-custom btn-circle"; - $scope.buttonPoiClass = "btn btn-custom btn-circle"; - $scope.buttonDataImportClass = "btn btn-custom btn-circle"; - - // in addition check if balance menue and button are allowed for current indicator - // it is not allowed if indicator is of type "DYNAMIC" - $scope.checkBalanceButtonAndMenueState(); - }; - - $scope.hideSidebars = function(){ - $scope.sidebarIndicatorConfigClass = "disappear"; - $scope.sidebarDiagramsClass = "disappear"; - $scope.sidebarRadarDiagramClass = "disappear"; - $scope.sidebarProcessingClass = "disappear"; - $scope.sidebarRegressionDiagramClass = "disappear"; - $scope.sidebarFilterClass = "disappear"; - $scope.sidebarBalanceClass = "disappear"; - $scope.sidebarReachabilityClass = "disappear"; - $scope.sidebarPoiClass = "disappear"; - $scope.sidebarDataImportClass = "disappear"; - }; - - $scope.checkBalanceButtonAndMenueState = function(){ - // disable if indicator is dynamic or if indicator only contains 1 or less timeseries entries - if(kommonitorDataExchangeService.selectedIndicator && (kommonitorDataExchangeService.selectedIndicator.indicatorType.includes("DYNAMIC") || kommonitorDataExchangeService.selectedIndicator.applicableDates.length < 2)){ - $scope.buttonBalanceClass = "btn btn-custom btn-circle disabled"; - $scope.sidebarBalanceClass = "disappear"; - } - else{ - $scope.buttonBalanceClass = "btn btn-custom btn-circle"; - } - }; - - $scope.$on("checkBalanceMenueAndButton", function(event){ - $scope.checkBalanceButtonAndMenueState(); - }); - - $scope.onSidebarIndicatorButtonClick = function(){ - $scope.undockButtons(); - - if($scope.sidebarIndicatorConfigClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarIndicatorConfigClass = ""; - $scope.buttonIndicatorConfigClass = "btn btn-custom-docked btn-docked"; - - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - } - else{ - $scope.sidebarIndicatorConfigClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - - } - - $scope.onSidebarPoiButtonClick = function(){ - $scope.undockButtons(); - - if($scope.sidebarPoiClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarPoiClass = ""; - $scope.buttonPoiClass = "btn btn-custom-docked btn-docked"; - - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - } - else{ - $scope.sidebarPoiClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - - } - - $scope.onSidebarDataImportButtonClick = function(){ - $scope.undockButtons(); - - if($scope.sidebarDataImportClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarDataImportClass = ""; - $scope.buttonDataImportClass = "btn btn-custom-docked btn-docked"; - - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - } - else{ - $scope.sidebarDataImportClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - - } - - $scope.onSidebarFilterButtonClick = function(){ - $scope.undockButtons(); - - if($scope.sidebarFilterClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarFilterClass = ""; - $scope.buttonFilterClass = "btn btn-custom-docked btn-docked"; - - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - } - else{ - $scope.sidebarFilterClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - - } - - $scope.onSidebarBalanceButtonClick = function(){ - - // check if button is marked as disabled - if($scope.buttonBalanceClass.includes("disabled")){ - // do nothing - return; - } - else{ - $scope.undockButtons(); - - if($scope.sidebarBalanceClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarBalanceClass = ""; - $scope.buttonBalanceClass = "btn btn-custom-docked btn-docked"; - - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - } - else{ - $scope.sidebarBalanceClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - } - } - - $scope.onSidebarReachabilityButtonClick = function(){ - $scope.undockButtons(); - - if($scope.sidebarReachabilityClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarReachabilityClass = ""; - $scope.buttonReachabilityClass = "btn btn-custom-docked btn-docked"; - - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - } - else{ - $scope.sidebarReachabilityClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - - } - - $scope.onSidebarDiagramsClick = function(){ - $scope.undockButtons(); - if($scope.sidebarDiagramsClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarDiagramsClass = ""; - $scope.buttonDiagramsClass = "btn btn-custom-docked btn-docked"; - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - $rootScope.$broadcast("resizeDiagrams"); - } - else{ - $scope.sidebarDiagramsClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - } - - $scope.onSidebarRadarDiagramClick = function(){ - $scope.undockButtons(); - if($scope.sidebarRadarDiagramClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarRadarDiagramClass = ""; - $scope.buttonRadarDiagramClass = "btn btn-custom-docked btn-docked"; - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - $rootScope.$broadcast("resizeDiagrams"); - } - else{ - $scope.sidebarRadarDiagramClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - } - - $scope.onSidebarProcessingClick = function(){ - $scope.undockButtons(); - if($scope.sidebarProcessingClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarProcessingClass = ""; - $scope.buttonProcessingClass = "btn btn-custom-docked btn-docked"; - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - } - else{ - $scope.sidebarProcessingClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - } - - $scope.onSidebarRegressionDiagramClick = function(){ - $scope.undockButtons(); - if($scope.sidebarRegressionDiagramClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarRegressionDiagramClass = ""; - $scope.buttonRegressionDiagramClass = "btn btn-custom-docked btn-docked"; - if(kommonitorDataExchangeService.anySideBarIsShown === false){ - $rootScope.$broadcast("recenterMapOnShowSideBar"); - } - kommonitorDataExchangeService.anySideBarIsShown = true; - $rootScope.$broadcast("resizeDiagrams"); - } - else{ - $scope.sidebarRegressionDiagramClass = "disappear"; - $rootScope.$broadcast("recenterMapOnHideSideBar"); - kommonitorDataExchangeService.anySideBarIsShown = false; - } - - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - $rootScope.$broadcast("redrawGuidedTourElement"); - } - - $scope.onSidebarLegendButtonClick = function(){ - - if($scope.sidebarLegendClass === "disappear"){ - $scope.hideSidebars(); - $scope.sidebarLegendClass = ""; - $scope.buttonLegendClass = "btn btn-custom-docked-right btn-docked-right"; - } - else{ - $scope.sidebarLegendClass = "disappear"; - $scope.buttonLegendClass = "btn btn-custom-right btn-circle-right"; - } - - $rootScope.$broadcast("invalidateMapSize"); - $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); - }; - - $scope.onRecenterMapButtonClick = function(){ - $rootScope.$broadcast("recenterMapContent"); - } - - $scope.onExportMapButtonClick = function(){ - $rootScope.$broadcast("exportMap"); - } - - $scope.onUnselectFeaturesButtonClick = function(){ - $rootScope.$broadcast("unselectAllFeatures"); - } - - $scope.onToggleInfoControlButtonClick = function(){ - $rootScope.$broadcast("toggleInfoControl"); - } - - $scope.onToggleLegendControlButtonClick = function(){ - $rootScope.$broadcast("toggleLegendControl"); - } - - $scope.$on("startGuidedTour", function(event){ - $scope.startGuidedTour(); - }); - - $scope.tourOptions = { - container: "body", - backdrop: true, - backdropContainer: "body", - smartPlacement: false, - onEnd: function(tour){ - kommonitorDataExchangeService.guidedTour = undefined; - }, - template: "

", - steps: [ - { - element:"#map", - title: "Willkommen zur Guided Tour von KomMonitor", - placement: "left", - content: "In dieser Tour werden die Funktionalitäten der Weboberfläche erläutert. Hier werden sie mit den Elementen der Oberfläche sowie den verschiedenen Buttons vertraut gemacht. " + - "
Die Tour kann jederzeit über den Button Guided Tour beenden verlassen werden. ", - onNext: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#sidebarLegendCollapse").click(); - } - } - }, - { - element: "#map", - title: "Inhaltsverzeichnis", - placement: "top", - content: "
    ", - onNext: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#sidebarLegendCollapse").click(); - } - }, - onShown: function(tour) { - $scope.generateTableOfContent(); - } - }, - { - element: "#header", - title: "Kopfzeile", - placement: "bottom", - content: "In der Kopfzeile befinden sich neben den Logos und dem Titel der Webanwendung mehrere Buttons.
    " + - "Mit kann zwischen einer vereinfachten und einer erweiterten Ansicht gewechselt werden.
    " + - "Diese Guided Tour kann stets erneut mit aufgerufen werden. " + - " öffnet das beim Aufruf der Seite erschienene Informationsfenster und
    " + - " ermöglicht mit entsprechenden Zugangsdaten den Zugang zur Administrationsoberfläche." - }, - { - element: "#map", - title: "Kartenfenster", - placement: "top", - content: "Die Standardansicht besteht aus einer kartografischen Darstellung, die bereits eine Hintergrundkarte und einen Indikator anzeigt. In dieser Darstellung können Sie in der " + - "Karte frei navigieren (zoomen, verschieben) und beim Herüberfahren mit dem Mauszeiger über eine der Raumeinheiten werden der Name, der Wert und die Einheit des dargestellten Indikators angezeigt.", - // onNext: function(tour){ - // // make sure that legend control is displayed - - // var control = document.getElementById("legendControl"); - // var controlButton = document.getElementById("toggleLegendControlButton"); - // if(control.style.display === "none" || (controlButton.style.display !== undefined && controlButton.style.display !== "none")){ - // $rootScope.$broadcast("toggleLegendControl"); - // } - - // }, - onNext: function(tour){ - if($scope.sidebarLegendClass === "disappear"){ - $("#sidebarLegendCollapse").click(); - } - } - }, - { - element: "#kommonitorLegend", - title: "Indikatorenlegende und Klassifizierung", - placement: "left", - content: "Dieses Element ist in drei Teilbereiche untergliedert, welche
    1. die wichtigsten Metadaten des dargestellten Indikator abbilden,
    " + - "2. Kartenlegenden zur Interpretation der Karteninhalte anbieten und
    3. weitergehende Möglichkeiten zur Klassifizierung bieten.", - onNext: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#legendSymbologyCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#sidebarLegendCollapse").click(); - } - } - }, - { - element: "#kommonitorIndicatorBasicMetadata", - title: "Indikator-Metadaten, Einstellung- und Exportmöglichkeiten", - placement: "left", - content: "Im oberen Bereich sind der Name eine kurze Beschreibung sowie das Fortführungsintervall des angezeigten Indikators zu finden.
    " + - "Im mittleren Bereich kann die angezeigte Raumebene per Dropdown-Liste gewechselt, der Zeitpunkt per Kalenderauswahl gewählt sowie
    " + - "die Transparenz der Kartendarstellung per Schieberegler angepasst werden.
    " + - "Der untere Bereich bietet Exportmöglichkeiten für die angezeigten Daten in den Formaten GeoJSON, ESRI Shapefile sowie CSV.
    " + - "Zudem kann ein Metadatenblatt aller Metadaten des dargestellten Indikators als PDF-Datei heruntergeladen werden.", - onNext: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#indicatorBasicMetadataCollapse").click(); - $("#legendSymbologyCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#legendSymbologyCollapse").click(); - } - } - }, - { - element: "#kommonitorLegendSymbology", - title: "Kartenlegenden und Interpretation", - placement: "left", - content: "Dieser Bereich beinhaltet eine Farblegende mit fünf Klassen für den angezeigten Indikator sowie die Wertebereiche und Fallzahlen je Klasse
    " + - "Als ergänzende Informationen werden der Indikatortyp, der Stichtag, die Einheit sowie eine kurze Interpretationshilfe angezeigt.
    " + - "Die einzelnen Reiter ganz oben ermöglichen den Wechsel zwischen verschiedenen Legenden, sofern zusätzlich zu einem Indikator
    " + - "auch die Legende für berechnete Isochronen, ein Routingergebnis oder einen eingebundenen WMS-Dienst angezeigt werden sollen.", - onNext: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#legendSymbologyCollapse").click(); - $("#indicatorClassificationCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#legendSymbologyCollapse").click(); - $("#indicatorBasicMetadataCollapse").click(); - } - } - }, - { - element: "#kommonitorIndicatorClassification", - title: "Klassifikationsoptionen", - placement: "left", - content: "Hier kann zwischen den drei Klassifizierungsmethoden Jenks, Gleiches Intervall und Quantile gewählt werden
    " + - "
    Detaillierte Informationen zu den Klassifizierungsmethoden können dem Popup entnommen werden, das beim Herüberfahren mit dem Mauszeiger über eine der drei Optionen erscheint. " + - "
    Zudem lässt sich per einstellen, ob die Klassifizierung die Indikatorenwerte der gesamten Zeitreihe berücksichtigen soll, oder nur jene des aktuellen Zeitschnitts.
    " + - "So kann ein vergleichbares Kartenbild für eine komplette Zeitreihe gewährleistet werden.
    " + - "
    KomMonitor überprüft jeden Indikatorendatensatz auf statistische Ausreißer. Werden ein oder mehrere Ausreißer erkannt, so können mit " + - "Ausreißer gesondert markiert und
    aus der Klassifizierung entfernt werden
    . Dies kann hilfreich sein, " + - "um ein differenzierteres Kartenbild zu erzeugen.", - onNext: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#sidebarLegendCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarLegendClass !== "disappear"){ - $("#legendSymbologyCollapse").click(); - $("#indicatorClassificationCollapse").click(); - } - } - }, - { - element: "#dateSliderWrapper", - title: "Zeitstrahl", - placement: "top", - content: "Die Zeitleiste am unteren Bildschirmrand enthält die verfügbaren Zeitschnitte des selektierten Indikators. Standardmäßig ist der aktuellste Zeitschnitt voreingestellt. "+ - "
    Durch ein Klicken auf einen beliebigen Punkt der Leiste oder durch Verschieben des runden Auswahlknopfs kann ein anderer Zeitschnitt gewählt werden.", - onPrev: function(tour){ - if($scope.sidebarLegendClass === "disappear"){ - $("#sidebarLegendCollapse").click(); - } - } - }, - { - element: "#mapUtilButtons", - title: "Steuerung der Kartendarstellung", - placement: "bottom", - content: "Diese Buttons bieten Steuerungsmöglichkeiten für die Kartendarstellung. Über und kann alternativ zur Verwendung des Mausrades hinein- bzw. hinausgezoomt werden. "+ - "

    zentriert die Karte und zoomt auf die maximale Ausdehnung des dargestellten Themas. " + - "

    hebt jegliche benutzerdefinierte Selektionen auf. " + - "

    erlaubt den Export des aktuellen Kartenausschnitts als Bilddatei. " + - "

    bietet die Möglichkeit, einzelne Karteninhalte temporär auszublenden oder die Hintergrundkarte zu wechseln. " + - "

    ermöglicht das Filtern innerhalb dargestellter Vektorlayer anhand des Namens oder der ID vorhandener Raumelemente. " + - "

    repräsentiert eine Geolokalisierung von Adressen und Orten. " + - "

    Darüber hinaus bietet eine Messfunktion für Abstände und Flächen." - }, - { - element: "#sideBarButtons", - title: "Menü-Buttons", - placement: "right", - content: "Diese Buttons öffnen jeweils ein linksseitig angeordnetets Menü mitzusätzlichen Funktionen. Jedes einzelne Menü wird in den folgenden Schritten kurz erläutert." - }, - { - element: "#sidebarIndicatorConfigCollapse", - title: "Indikatorenkatalog und Metadaten", - placement: "right", - content: "Ein Klick auf diesen Button öffnet das Indikatoren-Auswahl-Fenster.

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - onNext: function(tour){ - if($scope.sidebarIndicatorConfigClass === "disappear"){ - $("#sidebarIndicatorConfigCollapse").click(); - } - } - }, - { - element: "#indicatorSetup", - title: "Indikatorenkatalog und Metadaten", - placement: "right", - content: "Dieses Menü enthält eine Übersicht aller verfügbarer Indikatoren sowie die Option, " + - "den aktuell betrachteten Indikator zu wechseln.

    Indikatoren können in Form einer Themenhierarchie im Datenkatalog oder in einer " + - "alphabetischen Liste betrachtet und selektiert werden.
    " + - "Einen transparenten Zugang zu zusammenschauenden, bewertenden Indikatoren bietet die Leitindikatoren-Hierarchie.
    " + - "Hiermit können Leitindikatoren sowie die zur Berechnung verwendeten Basis-Indikatoren aufgerufen und deren Verknüpfung nachvollzogen werden.
    " + - "Auch die Metadaten des ausgewählten Indikators können hier detailliert eingesehen werden.", - onNext: function(tour){ - if($scope.sidebarIndicatorConfigClass !== "disappear"){ - $("#sidebarIndicatorConfigCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarIndicatorConfigClass !== "disappear"){ - $("#sidebarIndicatorConfigCollapse").click(); - } - } - }, - { - element: "#sidebarPoiCollapse", - title: "Georessourcen und -dienste", - placement: "right", - content: "Ein Klick auf diesen Button öffnet das Georessourcen Fenster.

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - onNext: function(tour){ - if($scope.sidebarPoiClass === "disappear"){ - $("#sidebarPoiCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarIndicatorConfigClass === "disappear"){ - $("#sidebarIndicatorConfigCollapse").click(); - } - } - }, - { - element: "#poi", - title: "Georessourcen und -dienste", - placement: "right", - content: "Zur Überlagerung von flächenhaft dargestellten Indikatoren mit weiteren relevanten Geodaten können Punkt- Linien und Flächendaten sowie Geodatendienste " + - "zur Karte hinzugefügt werden. Hinzufügen und Entfernen dieser Datensätze geschieht dabei durch (De-) Selektion der Auswahlbox links neben dem jeweiligen Datensatz. " + - "

    In der Standardkonfiguration werden Punktdaten räumlich zu sogenannten Cluster-Punkten zusammengefasst, um die Darstellung je nach Zoom-Stufe zu optimieren und
    " + - "selbst bei bei vielen Punkten eine übersichtliche Darstellung zu gewährleisten." + - "Über eine entsprechende Auswahloption können jedoch bei jeder Zoomstufe wahlweise auch alle Einzelpunkte angezeigt werden. " + - "

    Hinweis zum Zeitbezug der darzustellenden Daten:
    Der Abruf eines Punkt-, Linien- oder Flächendatensatzes bezieht sich immer auf ein Datum. " + - "Standardmäßig wird der aktuelle Zeitpunkt des dargestellten Indikators verwendet. Diese Option kann jedoch auf ein beliebiges frei definierbares Datum oder eine " + - "listenbasierte Auswahl verfügbarer Zeitpunkte jedes Datensatzes abgeändert werden.", - onNext: function(tour){ - if($scope.sidebarPoiClass !== "disappear"){ - $("#sidebarPoiCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarPoiClass !== "disappear"){ - $("#sidebarPoiCollapse").click(); - } - } - }, - // { - // element: "#sidebarDataImportCollapse", - // title: "Datenimport aus externen Quellen", - // placement: "right", - // content: "Ein Klick auf diesen Button öffnet das Datenimport Fenster.

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - // onNext: function(tour){ - // if($scope.sidebarDataImportClass === "disappear"){ - // $("#sidebarDataImportCollapse").click(); - // } - // } - // }, - // { - // element: "#dataImport", - // title: "Datenimport aus externen Quellen", - // placement: "right", - // content: "Dieses Fenster bietet Optionen zum Datenimport aus externen Datenquellen, insbesondere mittels Web Map Services und Datei-basierten Quellen wie GeoJSON oder ESRI Shape.

    Jeder WMS-Datensatz wird tabellarisch inklusive Titel, Beschreibung, Transparenzschieberegler, URL und Legende dargestellt. Durch Anhaken/Deselektion der Checkbox kann ein Datensatz hinzugefügt/entfernt werden. Neben den bereits vorkonfigurierten Datensätzen lassen sich weitere Quellen über den unten stehenden Button ergänzen.

    Die Möglichkeit Layer aus einer lokalen Datei einzuladen wird in Kürze verfügbar sein.", - // onNext: function(tour){ - // if($scope.sidebarDataImportClass !== "disappear"){ - // $("#sidebarDataImportCollapse").click(); - // } - // }, - // onPrev: function(tour){ - // if($scope.sidebarDataImportClass !== "disappear"){ - // $("#sidebarDataImportCollapse").click(); - // } - // } - // }, - { - element: "#sidebarFilterCollapse", - title: "Darstellungsfilter", - placement: "right", - content: "Ein Klick auf diesen Button öffnet ein Fenster zur Definition von Darstellungsfiltern.

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - onNext: function(tour){ - if($scope.sidebarFilterClass === "disappear"){ - $("#sidebarFilterCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarPoiClass === "disappear"){ - $("#sidebarPoiCollapse").click(); - } - } - }, - { - element: "#kommonitorFilter", - title: "Darstellungsfilter", - placement: "right", - //

    Darüber hinaus können je nach Fragestellung die Raumebenen-Geometrien (z.B. Stadtteile) auf diejenigen eingeschränkt werden, die zur Beantwortung der Fragestellung beitragen. - content: "Hier können verschiedene Darstellungsfilter angewendet werden, die sich auf die kartografische Darstellung auswirken. " + - "Über den Wertebereichsfilter können die angezeigten Raumeinheiten anhand der Wertausprägung des angezeigten Indikators gefiltert werden. " + - "Dazu kann der Schieberegler an dem minimalen und maximalen Werten nach rechts oder links geschoben werden. Alternativ kann die untere und/oder obere Grenze " + - "auch als Zahlenwert eingetragen werden.
    " + - "
    Eine weitere Option ist die dynamische Schwellenwertklassifizierung, bei der ein spezifischer Wert definiert werden kann, " + - "der die Indikator-Darstellung in zwei Bereiche unterteilt (oberhalb und unterhalb des Schwellenwerts) und entsprechend farbig darstellt.", - onNext: function(tour){ - if($scope.sidebarFilterClass !== "disappear"){ - $("#sidebarFilterCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarFilterClass !== "disappear"){ - $("#sidebarFilterCollapse").click(); - } - } - }, - { - element: "#sidebarBalanceCollapse", - title: "Zeitliche Bilanzierung", - placement: "right", - content: "Ein Klick auf diesen Button öffnet ein Fenster zur zeitlichen Bilanzierung des aktuell dargestellten Indikators. " + - "

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - onNext: function(tour){ - if($scope.sidebarBalanceClass === "disappear"){ - $("#sidebarBalanceCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarFilterClass === "disappear"){ - $("#sidebarFilterCollapse").click(); - } - } - }, - { - element: "#kommonitorBalance", - title: "Zeitliche Bilanzierung", - placement: "right", - content: "Bei der zeitlichen Bilanzierung steht die Wertentwicklung eines Indikators über die Zeit im Fokus (z. B. Wachstum / Schrumpfung). " + - "Wird die Bilanzierung anhand der Auswahlbox aktiviert, kann über die Zeitleiste ein Start- sowie ein Endzeitpunkt festgelegt werden.
    " + - "Für diesen spezifizifischen Betrachtungszeitraum wird dann automatisch die Wertentwicklung des angezeigten Indikators berechnet und dargestellt. " + - "

    Auch die Indikatoren-Legende am rechten Rand der Anwendung beinhaltet dann die Information, dass eine Bilanz des Indikators dargestellt wird. " + - "

    Der Trendverlauf im Betrachtungszeitraumwird zudem in Form eines Liniendiagrammes visualisiert. " + - "
    Zur Trendberechnung kann in KomMonitor zwischen einer linearen, exponentiellen und polynomialen Herleitung gewählt werden. " + - "
    Des Weiteren sind statistische Merkmale der gewählten Trendbetrachtung hinterlegt. Hierzu zählen beispielsweise Standardabweichung, Varianz, Mittelwert und Median sowie " + - "die Art des Trendverlaufes. " + - "

    Bitte beachten Sie, dass eine Bilanzierung nur bei Status-Indikatoren möglich ist, " + - "deren Zeitreihe mehr als einen Zeitpunkt enthält.", - onNext: function(tour){ - if($scope.sidebarBalanceClass !== "disappear"){ - $("#sidebarBalanceCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarBalanceClass !== "disappear"){ - $("#sidebarBalanceCollapse").click(); - } - } - }, - { - element: "#sidebarDiagramsCollapse", - title: "Statistische Diagramme", - placement: "right", - content: "Ein Klick auf diesen Button öffnet ein Fenster mit statistischen Diagrammen. " + - "

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - onNext: function(tour){ - if($scope.sidebarDiagramsClass === "disappear"){ - $("#sidebarDiagramsCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarBalanceClass === "disappear"){ - $("#sidebarBalanceCollapse").click(); - } - } - }, - { - element: "#indicatorDiagrams", - title: "Statistische Diagramme", - placement: "right", - content: "Zusätzlich zur kartografischen Darstellung bieten grundlegende statistische Diagramme hilfreiche Zusatzinformationen zum gewählten Indikator. " + - "

    Ein Ranking der jeweiligen Raumeinheiten wird anhand eines Säulendiagramms dargestellt. " + - "

    Das untere Liniendiagramm visualisiert die zeitliche Entwicklung des aktuellen Indikators über alle jeweils verfügbaren Zeitschnitte. " + - "Als Zusatzinformation wird hier der Durchschnittswert über alle Raumeinheiten dargestellt. " + - "

    Um einzelne Elemente der gewählten Raumebene im Säulen- und Liniendiagramm zu betrachten und hervorzuheben, " + - "kann mit dem Mauszeiger entweder über die Säule innerhalb des Säulendiagramms oder über das jeweilige Element in der Karte gefahren werden. " + - "Eine dauerhafte Selektion durch Klicken auf das kartografische Element oder die dazugehörige Säule ermöglicht das simultane Betrachten mehrerer Elemente. " + - "

    Jedes Diagramm enthält in der oberen rechte Ecke eine Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann.", - onNext: function(tour){ - if($scope.sidebarDiagramsClass !== "disappear"){ - $("#sidebarDiagramsCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarDiagramsClass !== "disappear"){ - $("#sidebarDiagramsCollapse").click(); - } - } - }, - { - element: "#sidebarRadarDiagramCollapse", - title: "Indikatorenradar", - placement: "right", - content: "Ein Klick auf diesen Button öffnet das Indiktorenradar für die Querschnittsbetrachtung mehrerer Indikatoren.

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - onNext: function(tour){ - if($scope.sidebarRadarDiagramClass === "disappear"){ - $("#sidebarRadarDiagramCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarDiagramsClass === "disappear"){ - $("#sidebarDiagramsCollapse").click(); - } - } - }, - { - element: "#indicatorRadar", - title: "Indikatorenradar", - placement: "right", - content: "Das Indikatorenradar eignet sich insbesondere für die querschnittsorientierte Betrachtung mehrerer Indikatoren. " + - "
    Für die Anzeige eines solchen Diagramms, selektieren Sie bitte mindestens drei Indikatoren aus der oben stehenden Liste.

    " + - "Für jeden gewählten Indikator wird im Diagramm eine Achse genutzt, auf der einzelne Raumeinheiten anhand ihrer Wertausprägung abgetragen werden. " + - "Jede Achse wird dabei durch Minimum und Maximum der Werte des betrachteten Indikators gebildet (daher ist die Radarmitte ausdrücklich nicht zwingend " + - "mit dem Wert '0' gleichzusetzen, sondern mit dem Minimalwert des Indikators).

    Auch hier ist der Durchschnitt aller Raumeinheiten bereits vorberechnet und " + - "einzelne Elemente können mittels Selektion innerhalb der Karte dem Radar hinzugefügt werden. Die Indikatorenauswahl umfasst dabei nur solche Indikatoren, " + - "die die gewählte Raumebene und den aktuell gewählten Zeitschnitt unterstützen.

    Auch das Radardiagramm besitzt in der oberen rechte Ecke eine " + - "Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann", - onNext: function(tour){ - if($scope.sidebarRadarDiagramClass !== "disappear"){ - $("#sidebarRadarDiagramCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarRadarDiagramClass !== "disappear"){ - $("#sidebarRadarDiagramCollapse").click(); - } - } - }, - { - element: "#sidebarRegressionDiagramCollapse", - title: "Regressionsdiagramm", - placement: "right", - content: "Ein Klick auf diesen Button öffnet das Fenster zur Definition von Regressionsdiagrammen.

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - onNext: function(tour){ - if($scope.sidebarRegressionDiagramClass === "disappear"){ - $("#sidebarRegressionDiagramCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarRadarDiagramClass === "disappear"){ - $("#sidebarRadarDiagramCollapse").click(); - } - } - }, - { - element: "#indicatorRegression", - title: "Regressionsdiagramm", - placement: "right", - content: "Als exemplarischer weiterer Diagrammtyp unterstützt KomMonitor die Berechnung einer linearen Regression zwischen zwei zu wählenden Indikatoren, um insbesondere die Korrelation zwischen diesen zu betrachten. Nach Auswahl der Indikatoren werden die Regressionsgerade und alle Elemente der gewählten Raumebene gemäß ihrer Wertausprägungen entlang der Indikatorenachsen im Diagramm abgetragen.

    Beim Überfahren eines Datenpunkts mit der Maus im Diagramm oder einer in der Karte dargestellten Raumeinheit, wird das jeweilige Pendant visuell hervorgehoben.

    Die Indikatorenauswahl umfasst dabei nur solche Indikatoren, die die gewählte Raumebene und den aktuell gewählten Zeitschnitt unterstützen.

    Auch das Regressionsdiagramm besitzt in der oberen rechte Ecke eine Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann.", - onNext: function(tour){ - if($scope.sidebarRegressionDiagramClass !== "disappear"){ - $("#sidebarRegressionDiagramCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarRegressionDiagramClass !== "disappear"){ - $("#sidebarRegressionDiagramCollapse").click(); - } - } - }, - { - element: "#sidebarReachabilityCollapse", - title: "Erreichbarkeitsanalysen", - placement: "right", - content: "Ein Klick auf diesen Button öffnet ein Fenster für Erreichbarkeitsanalysen.

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - onNext: function(tour){ - if($scope.sidebarReachabilityClass === "disappear"){ - $("#sidebarReachabilityCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarRegressionDiagramClass === "disappear"){ - $("#sidebarRegressionDiagramCollapse").click(); - } - } - }, - { - element: "#kommonitorReachability", - title: "Erreichbarkeitsanalysen", - placement: "right", - content: "Als GIS-basiertes Werkzeug soll KomMonitor ausgewählte räumliche Analysen unterstützen. " + - "Insbesondere stehen Erreichbarkeitsanalysen im Fokus, bei denen, neben reinen Puffer-basierten Ansätzen, " + - "Erreichbarkeiten anhand tatsächlicher Wegenetze für verschiedene Transportmittel (z.B. Fußgänger, Fahrrad, Auto) "+ - "berechnet werden können. Konkret soll hierbei sowohl ein Routing zwischen einzelnen Punkten sowie " + - "die Berechnung von Isochronen (Äquidistanzen und zeitliches Abbruchkriterium) angeboten werden.

    " + - "Auswahl der Startpunkte
    " + - "Die Auswahl der Startpunkte kann entweder über die Selektion eines vorhandenen Punktdatensatzes vorgenommen werden oder mittels Einzeichnen eigener beliebiger Punkte in die Karte.

    " + - "Ergebnisdarstellung
    " + - "Sowohl Isochronen- als auch Routingergebnisse werden der Karte als neuer, eigener Layer hinzugefügt. " + - "Die jeweilige Legende über jeweiligen Reiter des rechten Legendenmenüs einsehbar.

    "+ - "Punkt in Isochronen Analyse
    " + - "Nachdem eine Isochronenberechnung erfolgt ist, können vorhandene Punktdatensätze räumlich mit den Isochronen verschnitten werden, bspw. um eine Umfeldanalyse für relevante Einrichtungen durchzuführen.", - onNext: function(tour){ - if($scope.sidebarReachabilityClass !== "disappear"){ - $("#sidebarReachabilityCollapse").click(); - } - }, - onPrev: function(tour){ - if($scope.sidebarReachabilityClass !== "disappear"){ - $("#sidebarReachabilityCollapse").click(); - } - } - }, - { - element: "#map", - title: "Vielen Dank für die Nutzung der Guided Tour von KomMonitor!", - placement: "left", - content: "Wir hoffen, die Erläuterungen konnten einen guten Einblick in die Funktionen bieten, " + - "bei der ersten Orientierung helfen und die zukünftige Nutzung erleichtern!

    " + - "Kritik, Anregungen oder Fragen sind jederzeit willkommen.
    (siehe Begrüßungsfenster für den Kontakt).

    " + - "Viel Spaß bei der Nutzung von KomMonitor! ", - onNext: function(tour){ - kommonitorDataExchangeService.guidedTour = undefined; // ends the tour - } - } - // { - // element: "#sidebarProcessingCollapse", - // title: "Individuelle Indikatoren-Neuberechnung", - // placement: "right", - // content: "Ein Klick auf diesen Button öffnet ein Fenster zur individuellen Neuberechnung einzelner Indikatoren.

    Im nächsten Schritt wird das Menü automatisch geöffnet.", - // onNext: function(tour){ - // if($scope.sidebarProcessingClass === "disappear"){ - // $("#sidebarProcessingCollapse").click(); - // } - // }, - // onPrev: function(tour){ - // if($scope.sidebarReachabilityClass === "disappear"){ - // $("#sidebarReachabilityCollapse").click(); - // } - // } - // }, - // { - // element: "#indicatorProcessing", - // title: "Individuelle Indikatoren-Neuberechnung", - // placement: "right", - // content: "KomMonitor ist mehr als nur ein Darstellungswerkzeug. Es ermöglicht insbesondere auch die automatisierte Berechnung von Indikatoren. Je nach Berechnungsvorschrift kann es dabei konfigurierbare Parameter geben, die die resultierenden Indikatorenwerte beeinflussen (bspw. eine maximle Distanz bei Erreichbarkeiten oder Gewichtungen grundlegender Eingangsdaten).

    Dieses Menü bietet die Möglichkeit einer Nutzer-definierten Neuberechnung von Indikatoren mit mindestens einem konfigurierbaren Parameter. Das jeweilige Berechnungsergebnis steht anschließend temporär zur Verfügung und kann bei Bedarf exportiert werden.

    Künftig sollen darüber hinaus unmittelbare Vergleiche mit der 'Standard'-Variante des Indikators angeboten werden. Diese sind jedoch zum gegenwärtigen Zeitpunkt noch nicht in der Anwendung umgesetzt.", - // onNext: function(tour){ - // if($scope.sidebarProcessingClass !== "disappear"){ - // $("#sidebarProcessingCollapse").click(); - // } - // }, - // onPrev: function(tour){ - // if($scope.sidebarProcessingClass !== "disappear"){ - // $("#sidebarProcessingCollapse").click(); - // } - // } - // } - ], - onShown: function(tour) { - // add shortcut to toc to each title - let titleElement = document.getElementsByClassName("popover-title").item(0); - titleElement.innerHTML += - "" + - ""; - $compile(titleElement)($scope); // let angularjs know that there is new html, add the ng-click event - } - }; - - $scope.generateTableOfContent = function() { - let prevStepTitle = undefined; - for(var i=0;i<$scope.tourOptions.steps.length;i++) { - let step = $scope.tourOptions.steps[i]; - // only show the first guided tour step for each subtheme - // specifically exclude "Individuelle Indikatoren-Neuberechnung" for now as it is not shown in the guided tour - if (step.title !== prevStepTitle && step.title !== "Individuelle Indikatoren-Neuberechnung") { - let html = "
  1. " + step.title + "
  2. "; - let compiled = $compile(html)($scope); // let angularjs know that there is new html, add the ng-click event - angular.element(document.getElementById('guided-tour-toc')).append(compiled); - } - prevStepTitle = step.title; - } - }; - - $scope.goToGuidedTourStep = function(tour, targetStepIndex) { - // The method "goTo" provided by the library jumps directly to the target step, ignoring the "onNext" and "onPrev" methods. - // That leads to menues not being opened/closed. To fix this we iterate the steps manually. - while(tour.getCurrentStep() < targetStepIndex) - tour.next(); - while(tour.getCurrentStep() > targetStepIndex) - tour.prev(); - }; - - $scope.startGuidedTour = function(){ - // GUIDED TOUR - // Instance the tour - kommonitorDataExchangeService.guidedTour = new Tour($scope.tourOptions); - - // Initialize the tour - kommonitorDataExchangeService.guidedTour.init(); - // Start the tour - try{ - kommonitorDataExchangeService.guidedTour.restart(); - } - catch(error){ - kommonitorDataExchangeService.guidedTour.start(true); - } - - // tour gotTo() example to jump to step 7 --> index starts from 0 - // kommonitorDataExchangeService.guidedTour.goTo(6); - - }; - - $scope.$on("redrawGuidedTourElement", async function(event){ - - await sleep(100); - - if(kommonitorDataExchangeService.guidedTour){ - kommonitorDataExchangeService.guidedTour.redraw(); - } - }); - - $scope.init(); - - } -]}); + templateUrl: "components/kommonitorUserInterface/kommonitor-user-interface.template.html", + controller: ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', 'kommonitorElementVisibilityHelperService', '$scope', + '$rootScope', '$location', 'Auth', 'ControlsConfigService', '$compile', 'kommonitorShareHelperService', '__env', + function UserInterfaceController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, kommonitorElementVisibilityHelperService, $scope, $rootScope, $location, Auth, ControlsConfigService, $compile, kommonitorShareHelperService, __env) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + this.kommonitorElementVisibilityHelperServiceInstance = kommonitorElementVisibilityHelperService; + kommonitorDataExchangeService.anySideBarIsShown = false; + kommonitorDataExchangeService.currentKeycloakUser; + $scope.password; + $scope.showAdminLogin = false; + $scope.init = async function () { + // initialize application + console.log("Initialize Application"); + if ($scope.authenticated) { + console.log("Authetication successfull"); + } + await checkAuthentication(); + kommonitorShareHelperService.init(); + kommonitorDataExchangeService.fetchAllMetadata(); + }; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $scope.sidebarIndicatorConfigClass = "disappear"; + $scope.sidebarDiagramsClass = "disappear"; + $scope.sidebarRadarDiagramClass = "disappear"; + $scope.sidebarProcessingClass = "disappear"; + $scope.sidebarRegressionDiagramClass = "disappear"; + $scope.sidebarFilterClass = "disappear"; + $scope.sidebarBalanceClass = "disappear"; + $scope.sidebarReachabilityClass = "disappear"; + $scope.sidebarPoiClass = "disappear"; + $scope.sidebarDataImportClass = "disappear"; + $scope.sidebarLegendClass = ""; + $scope.buttonIndicatorConfigClass = "btn btn-custom btn-circle"; + $scope.buttonDiagramsClass = "btn btn-custom btn-circle"; + $scope.buttonRadarDiagramClass = "btn btn-custom btn-circle"; + $scope.buttonProcessingClass = "btn btn-custom btn-circle"; + $scope.buttonRegressionDiagramClass = "btn btn-custom btn-circle"; + $scope.buttonFilterClass = "btn btn-custom btn-circle"; + $scope.buttonBalanceClass = "btn btn-custom btn-circle"; + $scope.buttonReachabilityClass = "btn btn-custom btn-circle"; + $scope.buttonPoiClass = "btn btn-custom btn-circle"; + $scope.buttonDataImportClass = "btn btn-custom btn-circle"; + $scope.buttonLegendClass = "btn btn-custom-docked-right btn-docked-right"; + function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + Auth.keycloak.onAuthLogout = function () { + console.log("Logout successfull"); + checkAuthentication(); + }; + Auth.keycloak.onAuthSuccess = function () { + console.log("User successfully authenticated"); + checkAuthentication(); + }; + $scope.tryLoginUser_withoutKeycloak = function () { + // TODO FIXME make generic user login once user/role concept is implemented + // currently only simple ADMIN user login is possible + console.log("Check user login"); + if (kommonitorDataExchangeService.adminUserName === kommonitorDataExchangeService.currentKeycloakUser && kommonitorDataExchangeService.adminPassword === $scope.password) { + // success login --> currently switch to ADMIN page directly + console.log("User Login success - redirect to Admin Page"); + kommonitorDataExchangeService.adminIsLoggedIn = true; + $location.path('/administration'); + } + }; + $scope.tryLoginUser = function () { + if (kommonitorDataExchangeService.enableKeycloakSecurity) { + Auth.keycloak.login(); + } + else { + $scope.tryLoginUser_withoutKeycloak(); + } + }; + $scope.tryLogoutUser = function () { + Auth.keycloak.logout(); + }; + $scope.tryLoginUserByKeypress = function ($event) { + var keyCode = $event.which || $event.keyCode; + //check for enter key + if (keyCode === 13) { + $scope.tryLoginUser(); + } + }; + var checkAuthentication = async function () { + kommonitorDataExchangeService.currentKeycloakLoginRoles = []; + if (Auth.keycloak.authenticated) { + $scope.authenticated = Auth.keycloak.authenticated; + if (Auth.keycloak.tokenParsed + && Auth.keycloak.tokenParsed.realm_access + && Auth.keycloak.tokenParsed.realm_access.roles + && Auth.keycloak.tokenParsed.realm_access.roles.some(role => role.endsWith("-creator") || role.endsWith("-publisher") || role.endsWith("-editor"))) { + Auth.keycloak.showAdminView = true; + $scope.showAdminLogin = true; + } + } + }; + $scope.openAdminUI = function () { + $location.path('/administration'); + }; + $scope.undockButtons = function () { + $scope.buttonIndicatorConfigClass = "btn btn-custom btn-circle"; + $scope.buttonDiagramsClass = "btn btn-custom btn-circle"; + $scope.buttonRadarDiagramClass = "btn btn-custom btn-circle"; + $scope.buttonProcessingClass = "btn btn-custom btn-circle"; + $scope.buttonRegressionDiagramClass = "btn btn-custom btn-circle"; + $scope.buttonFilterClass = "btn btn-custom btn-circle"; + $scope.buttonBalanceClass = "btn btn-custom btn-circle"; + $scope.buttonReachabilityClass = "btn btn-custom btn-circle"; + $scope.buttonPoiClass = "btn btn-custom btn-circle"; + $scope.buttonDataImportClass = "btn btn-custom btn-circle"; + // in addition check if balance menue and button are allowed for current indicator + // it is not allowed if indicator is of type "DYNAMIC" + $scope.checkBalanceButtonAndMenueState(); + }; + $scope.hideSidebars = function () { + $scope.sidebarIndicatorConfigClass = "disappear"; + $scope.sidebarDiagramsClass = "disappear"; + $scope.sidebarRadarDiagramClass = "disappear"; + $scope.sidebarProcessingClass = "disappear"; + $scope.sidebarRegressionDiagramClass = "disappear"; + $scope.sidebarFilterClass = "disappear"; + $scope.sidebarBalanceClass = "disappear"; + $scope.sidebarReachabilityClass = "disappear"; + $scope.sidebarPoiClass = "disappear"; + $scope.sidebarDataImportClass = "disappear"; + }; + $scope.checkBalanceButtonAndMenueState = function () { + // disable if indicator is dynamic or if indicator only contains 1 or less timeseries entries + if (kommonitorDataExchangeService.selectedIndicator && (kommonitorDataExchangeService.selectedIndicator.indicatorType.includes("DYNAMIC") || kommonitorDataExchangeService.selectedIndicator.applicableDates.length < 2)) { + $scope.buttonBalanceClass = "btn btn-custom btn-circle disabled"; + $scope.sidebarBalanceClass = "disappear"; + } + else { + $scope.buttonBalanceClass = "btn btn-custom btn-circle"; + } + }; + $scope.$on("checkBalanceMenueAndButton", function (event) { + $scope.checkBalanceButtonAndMenueState(); + }); + $scope.onSidebarIndicatorButtonClick = function () { + $scope.undockButtons(); + if ($scope.sidebarIndicatorConfigClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarIndicatorConfigClass = ""; + $scope.buttonIndicatorConfigClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else { + $scope.sidebarIndicatorConfigClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarPoiButtonClick = function () { + $scope.undockButtons(); + if ($scope.sidebarPoiClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarPoiClass = ""; + $scope.buttonPoiClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else { + $scope.sidebarPoiClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarDataImportButtonClick = function () { + $scope.undockButtons(); + if ($scope.sidebarDataImportClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarDataImportClass = ""; + $scope.buttonDataImportClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else { + $scope.sidebarDataImportClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarFilterButtonClick = function () { + $scope.undockButtons(); + if ($scope.sidebarFilterClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarFilterClass = ""; + $scope.buttonFilterClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else { + $scope.sidebarFilterClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarBalanceButtonClick = function () { + // check if button is marked as disabled + if ($scope.buttonBalanceClass.includes("disabled")) { + // do nothing + return; + } + else { + $scope.undockButtons(); + if ($scope.sidebarBalanceClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarBalanceClass = ""; + $scope.buttonBalanceClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else { + $scope.sidebarBalanceClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + } + }; + $scope.onSidebarReachabilityButtonClick = function () { + $scope.undockButtons(); + if ($scope.sidebarReachabilityClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarReachabilityClass = ""; + $scope.buttonReachabilityClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else { + $scope.sidebarReachabilityClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarDiagramsClick = function () { + $scope.undockButtons(); + if ($scope.sidebarDiagramsClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarDiagramsClass = ""; + $scope.buttonDiagramsClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + $rootScope.$broadcast("resizeDiagrams"); + } + else { + $scope.sidebarDiagramsClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarRadarDiagramClick = function () { + $scope.undockButtons(); + if ($scope.sidebarRadarDiagramClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarRadarDiagramClass = ""; + $scope.buttonRadarDiagramClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + $rootScope.$broadcast("resizeDiagrams"); + } + else { + $scope.sidebarRadarDiagramClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarProcessingClick = function () { + $scope.undockButtons(); + if ($scope.sidebarProcessingClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarProcessingClass = ""; + $scope.buttonProcessingClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else { + $scope.sidebarProcessingClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarRegressionDiagramClick = function () { + $scope.undockButtons(); + if ($scope.sidebarRegressionDiagramClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarRegressionDiagramClass = ""; + $scope.buttonRegressionDiagramClass = "btn btn-custom-docked btn-docked"; + if (kommonitorDataExchangeService.anySideBarIsShown === false) { + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + $rootScope.$broadcast("resizeDiagrams"); + } + else { + $scope.sidebarRegressionDiagramClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + }; + $scope.onSidebarLegendButtonClick = function () { + if ($scope.sidebarLegendClass === "disappear") { + $scope.hideSidebars(); + $scope.sidebarLegendClass = ""; + $scope.buttonLegendClass = "btn btn-custom-docked-right btn-docked-right"; + } + else { + $scope.sidebarLegendClass = "disappear"; + $scope.buttonLegendClass = "btn btn-custom-right btn-circle-right"; + } + $rootScope.$broadcast("invalidateMapSize"); + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + }; + $scope.onRecenterMapButtonClick = function () { + $rootScope.$broadcast("recenterMapContent"); + }; + $scope.onExportMapButtonClick = function () { + $rootScope.$broadcast("exportMap"); + }; + $scope.onUnselectFeaturesButtonClick = function () { + $rootScope.$broadcast("unselectAllFeatures"); + }; + $scope.onToggleInfoControlButtonClick = function () { + $rootScope.$broadcast("toggleInfoControl"); + }; + $scope.onToggleLegendControlButtonClick = function () { + $rootScope.$broadcast("toggleLegendControl"); + }; + $scope.$on("startGuidedTour", function (event) { + $scope.startGuidedTour(); + }); + $scope.tourOptions = { + container: "body", + backdrop: true, + backdropContainer: "body", + smartPlacement: false, + onEnd: function (tour) { + kommonitorDataExchangeService.guidedTour = undefined; + }, + template: "

    ", + steps: [ + { + element: "#map", + title: "Willkommen zur Guided Tour von KomMonitor", + placement: "left", + content: "In dieser Tour werden die Funktionalitäten der Weboberfläche erläutert. Hier werden sie mit den Elementen der Oberfläche sowie den verschiedenen Buttons vertraut gemacht. " + + "
    Die Tour kann jederzeit über den Button Guided Tour beenden verlassen werden. ", + onNext: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#sidebarLegendCollapse").click(); + } + } + }, + { + element: "#map", + title: "Inhaltsverzeichnis", + placement: "top", + content: "
      ", + onNext: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#sidebarLegendCollapse").click(); + } + }, + onShown: function (tour) { + $scope.generateTableOfContent(); + } + }, + { + element: "#header", + title: "Kopfzeile", + placement: "bottom", + content: "In der Kopfzeile befinden sich neben den Logos und dem Titel der Webanwendung mehrere Buttons.
      " + + "Mit kann zwischen einer vereinfachten und einer erweiterten Ansicht gewechselt werden.
      " + + "Diese Guided Tour kann stets erneut mit aufgerufen werden. " + + " öffnet das beim Aufruf der Seite erschienene Informationsfenster und
      " + + " ermöglicht mit entsprechenden Zugangsdaten den Zugang zur Administrationsoberfläche." + }, + { + element: "#map", + title: "Kartenfenster", + placement: "top", + content: "Die Standardansicht besteht aus einer kartografischen Darstellung, die bereits eine Hintergrundkarte und einen Indikator anzeigt. In dieser Darstellung können Sie in der " + + "Karte frei navigieren (zoomen, verschieben) und beim Herüberfahren mit dem Mauszeiger über eine der Raumeinheiten werden der Name, der Wert und die Einheit des dargestellten Indikators angezeigt.", + // onNext: function(tour){ + // // make sure that legend control is displayed + // var control = document.getElementById("legendControl"); + // var controlButton = document.getElementById("toggleLegendControlButton"); + // if(control.style.display === "none" || (controlButton.style.display !== undefined && controlButton.style.display !== "none")){ + // $rootScope.$broadcast("toggleLegendControl"); + // } + // }, + onNext: function (tour) { + if ($scope.sidebarLegendClass === "disappear") { + $("#sidebarLegendCollapse").click(); + } + } + }, + { + element: "#kommonitorLegend", + title: "Indikatorenlegende und Klassifizierung", + placement: "left", + content: "Dieses Element ist in drei Teilbereiche untergliedert, welche
      1. die wichtigsten Metadaten des dargestellten Indikator abbilden,
      " + + "2. Kartenlegenden zur Interpretation der Karteninhalte anbieten und
      3. weitergehende Möglichkeiten zur Klassifizierung bieten.", + onNext: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#legendSymbologyCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#sidebarLegendCollapse").click(); + } + } + }, + { + element: "#kommonitorIndicatorBasicMetadata", + title: "Indikator-Metadaten, Einstellung- und Exportmöglichkeiten", + placement: "left", + content: "Im oberen Bereich sind der Name eine kurze Beschreibung sowie das Fortführungsintervall des angezeigten Indikators zu finden.
      " + + "Im mittleren Bereich kann die angezeigte Raumebene per Dropdown-Liste gewechselt, der Zeitpunkt per Kalenderauswahl gewählt sowie
      " + + "die Transparenz der Kartendarstellung per Schieberegler angepasst werden.
      " + + "Der untere Bereich bietet Exportmöglichkeiten für die angezeigten Daten in den Formaten GeoJSON, ESRI Shapefile sowie CSV.
      " + + "Zudem kann ein Metadatenblatt aller Metadaten des dargestellten Indikators als PDF-Datei heruntergeladen werden.", + onNext: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#indicatorBasicMetadataCollapse").click(); + $("#legendSymbologyCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#legendSymbologyCollapse").click(); + } + } + }, + { + element: "#kommonitorLegendSymbology", + title: "Kartenlegenden und Interpretation", + placement: "left", + content: "Dieser Bereich beinhaltet eine Farblegende mit fünf Klassen für den angezeigten Indikator sowie die Wertebereiche und Fallzahlen je Klasse
      " + + "Als ergänzende Informationen werden der Indikatortyp, der Stichtag, die Einheit sowie eine kurze Interpretationshilfe angezeigt.
      " + + "Die einzelnen Reiter ganz oben ermöglichen den Wechsel zwischen verschiedenen Legenden, sofern zusätzlich zu einem Indikator
      " + + "auch die Legende für berechnete Isochronen, ein Routingergebnis oder einen eingebundenen WMS-Dienst angezeigt werden sollen.", + onNext: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#legendSymbologyCollapse").click(); + $("#indicatorClassificationCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#legendSymbologyCollapse").click(); + $("#indicatorBasicMetadataCollapse").click(); + } + } + }, + { + element: "#kommonitorIndicatorClassification", + title: "Klassifikationsoptionen", + placement: "left", + content: "Hier kann zwischen den drei Klassifizierungsmethoden Jenks, Gleiches Intervall und Quantile gewählt werden
      " + + "
      Detaillierte Informationen zu den Klassifizierungsmethoden können dem Popup entnommen werden, das beim Herüberfahren mit dem Mauszeiger über eine der drei Optionen erscheint. " + + "
      Zudem lässt sich per einstellen, ob die Klassifizierung die Indikatorenwerte der gesamten Zeitreihe berücksichtigen soll, oder nur jene des aktuellen Zeitschnitts.
      " + + "So kann ein vergleichbares Kartenbild für eine komplette Zeitreihe gewährleistet werden.
      " + + "
      KomMonitor überprüft jeden Indikatorendatensatz auf statistische Ausreißer. Werden ein oder mehrere Ausreißer erkannt, so können mit " + + "Ausreißer gesondert markiert und
      aus der Klassifizierung entfernt werden
      . Dies kann hilfreich sein, " + + "um ein differenzierteres Kartenbild zu erzeugen.", + onNext: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#sidebarLegendCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarLegendClass !== "disappear") { + $("#legendSymbologyCollapse").click(); + $("#indicatorClassificationCollapse").click(); + } + } + }, + { + element: "#dateSliderWrapper", + title: "Zeitstrahl", + placement: "top", + content: "Die Zeitleiste am unteren Bildschirmrand enthält die verfügbaren Zeitschnitte des selektierten Indikators. Standardmäßig ist der aktuellste Zeitschnitt voreingestellt. " + + "
      Durch ein Klicken auf einen beliebigen Punkt der Leiste oder durch Verschieben des runden Auswahlknopfs kann ein anderer Zeitschnitt gewählt werden.", + onPrev: function (tour) { + if ($scope.sidebarLegendClass === "disappear") { + $("#sidebarLegendCollapse").click(); + } + } + }, + { + element: "#mapUtilButtons", + title: "Steuerung der Kartendarstellung", + placement: "bottom", + content: "Diese Buttons bieten Steuerungsmöglichkeiten für die Kartendarstellung. Über und kann alternativ zur Verwendung des Mausrades hinein- bzw. hinausgezoomt werden. " + + "

      zentriert die Karte und zoomt auf die maximale Ausdehnung des dargestellten Themas. " + + "

      hebt jegliche benutzerdefinierte Selektionen auf. " + + "

      erlaubt den Export des aktuellen Kartenausschnitts als Bilddatei. " + + "

      bietet die Möglichkeit, einzelne Karteninhalte temporär auszublenden oder die Hintergrundkarte zu wechseln. " + + "

      ermöglicht das Filtern innerhalb dargestellter Vektorlayer anhand des Namens oder der ID vorhandener Raumelemente. " + + "

      repräsentiert eine Geolokalisierung von Adressen und Orten. " + + "

      Darüber hinaus bietet eine Messfunktion für Abstände und Flächen." + }, + { + element: "#sideBarButtons", + title: "Menü-Buttons", + placement: "right", + content: "Diese Buttons öffnen jeweils ein linksseitig angeordnetets Menü mitzusätzlichen Funktionen. Jedes einzelne Menü wird in den folgenden Schritten kurz erläutert." + }, + { + element: "#sidebarIndicatorConfigCollapse", + title: "Indikatorenkatalog und Metadaten", + placement: "right", + content: "Ein Klick auf diesen Button öffnet das Indikatoren-Auswahl-Fenster.

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function (tour) { + if ($scope.sidebarIndicatorConfigClass === "disappear") { + $("#sidebarIndicatorConfigCollapse").click(); + } + } + }, + { + element: "#indicatorSetup", + title: "Indikatorenkatalog und Metadaten", + placement: "right", + content: "Dieses Menü enthält eine Übersicht aller verfügbarer Indikatoren sowie die Option, " + + "den aktuell betrachteten Indikator zu wechseln.

      Indikatoren können in Form einer Themenhierarchie im Datenkatalog oder in einer " + + "alphabetischen Liste betrachtet und selektiert werden.
      " + + "Einen transparenten Zugang zu zusammenschauenden, bewertenden Indikatoren bietet die Leitindikatoren-Hierarchie.
      " + + "Hiermit können Leitindikatoren sowie die zur Berechnung verwendeten Basis-Indikatoren aufgerufen und deren Verknüpfung nachvollzogen werden.
      " + + "Auch die Metadaten des ausgewählten Indikators können hier detailliert eingesehen werden.", + onNext: function (tour) { + if ($scope.sidebarIndicatorConfigClass !== "disappear") { + $("#sidebarIndicatorConfigCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarIndicatorConfigClass !== "disappear") { + $("#sidebarIndicatorConfigCollapse").click(); + } + } + }, + { + element: "#sidebarPoiCollapse", + title: "Georessourcen und -dienste", + placement: "right", + content: "Ein Klick auf diesen Button öffnet das Georessourcen Fenster.

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function (tour) { + if ($scope.sidebarPoiClass === "disappear") { + $("#sidebarPoiCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarIndicatorConfigClass === "disappear") { + $("#sidebarIndicatorConfigCollapse").click(); + } + } + }, + { + element: "#poi", + title: "Georessourcen und -dienste", + placement: "right", + content: "Zur Überlagerung von flächenhaft dargestellten Indikatoren mit weiteren relevanten Geodaten können Punkt- Linien und Flächendaten sowie Geodatendienste " + + "zur Karte hinzugefügt werden. Hinzufügen und Entfernen dieser Datensätze geschieht dabei durch (De-) Selektion der Auswahlbox links neben dem jeweiligen Datensatz. " + + "

      In der Standardkonfiguration werden Punktdaten räumlich zu sogenannten Cluster-Punkten zusammengefasst, um die Darstellung je nach Zoom-Stufe zu optimieren und
      " + + "selbst bei bei vielen Punkten eine übersichtliche Darstellung zu gewährleisten." + + "Über eine entsprechende Auswahloption können jedoch bei jeder Zoomstufe wahlweise auch alle Einzelpunkte angezeigt werden. " + + "

      Hinweis zum Zeitbezug der darzustellenden Daten:
      Der Abruf eines Punkt-, Linien- oder Flächendatensatzes bezieht sich immer auf ein Datum. " + + "Standardmäßig wird der aktuelle Zeitpunkt des dargestellten Indikators verwendet. Diese Option kann jedoch auf ein beliebiges frei definierbares Datum oder eine " + + "listenbasierte Auswahl verfügbarer Zeitpunkte jedes Datensatzes abgeändert werden.", + onNext: function (tour) { + if ($scope.sidebarPoiClass !== "disappear") { + $("#sidebarPoiCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarPoiClass !== "disappear") { + $("#sidebarPoiCollapse").click(); + } + } + }, + // { + // element: "#sidebarDataImportCollapse", + // title: "Datenimport aus externen Quellen", + // placement: "right", + // content: "Ein Klick auf diesen Button öffnet das Datenimport Fenster.

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + // onNext: function(tour){ + // if($scope.sidebarDataImportClass === "disappear"){ + // $("#sidebarDataImportCollapse").click(); + // } + // } + // }, + // { + // element: "#dataImport", + // title: "Datenimport aus externen Quellen", + // placement: "right", + // content: "Dieses Fenster bietet Optionen zum Datenimport aus externen Datenquellen, insbesondere mittels Web Map Services und Datei-basierten Quellen wie GeoJSON oder ESRI Shape.

      Jeder WMS-Datensatz wird tabellarisch inklusive Titel, Beschreibung, Transparenzschieberegler, URL und Legende dargestellt. Durch Anhaken/Deselektion der Checkbox kann ein Datensatz hinzugefügt/entfernt werden. Neben den bereits vorkonfigurierten Datensätzen lassen sich weitere Quellen über den unten stehenden Button ergänzen.

      Die Möglichkeit Layer aus einer lokalen Datei einzuladen wird in Kürze verfügbar sein.", + // onNext: function(tour){ + // if($scope.sidebarDataImportClass !== "disappear"){ + // $("#sidebarDataImportCollapse").click(); + // } + // }, + // onPrev: function(tour){ + // if($scope.sidebarDataImportClass !== "disappear"){ + // $("#sidebarDataImportCollapse").click(); + // } + // } + // }, + { + element: "#sidebarFilterCollapse", + title: "Darstellungsfilter", + placement: "right", + content: "Ein Klick auf diesen Button öffnet ein Fenster zur Definition von Darstellungsfiltern.

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function (tour) { + if ($scope.sidebarFilterClass === "disappear") { + $("#sidebarFilterCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarPoiClass === "disappear") { + $("#sidebarPoiCollapse").click(); + } + } + }, + { + element: "#kommonitorFilter", + title: "Darstellungsfilter", + placement: "right", + //

      Darüber hinaus können je nach Fragestellung die Raumebenen-Geometrien (z.B. Stadtteile) auf diejenigen eingeschränkt werden, die zur Beantwortung der Fragestellung beitragen. + content: "Hier können verschiedene Darstellungsfilter angewendet werden, die sich auf die kartografische Darstellung auswirken. " + + "Über den Wertebereichsfilter können die angezeigten Raumeinheiten anhand der Wertausprägung des angezeigten Indikators gefiltert werden. " + + "Dazu kann der Schieberegler an dem minimalen und maximalen Werten nach rechts oder links geschoben werden. Alternativ kann die untere und/oder obere Grenze " + + "auch als Zahlenwert eingetragen werden.
      " + + "
      Eine weitere Option ist die dynamische Schwellenwertklassifizierung, bei der ein spezifischer Wert definiert werden kann, " + + "der die Indikator-Darstellung in zwei Bereiche unterteilt (oberhalb und unterhalb des Schwellenwerts) und entsprechend farbig darstellt.", + onNext: function (tour) { + if ($scope.sidebarFilterClass !== "disappear") { + $("#sidebarFilterCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarFilterClass !== "disappear") { + $("#sidebarFilterCollapse").click(); + } + } + }, + { + element: "#sidebarBalanceCollapse", + title: "Zeitliche Bilanzierung", + placement: "right", + content: "Ein Klick auf diesen Button öffnet ein Fenster zur zeitlichen Bilanzierung des aktuell dargestellten Indikators. " + + "

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function (tour) { + if ($scope.sidebarBalanceClass === "disappear") { + $("#sidebarBalanceCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarFilterClass === "disappear") { + $("#sidebarFilterCollapse").click(); + } + } + }, + { + element: "#kommonitorBalance", + title: "Zeitliche Bilanzierung", + placement: "right", + content: "Bei der zeitlichen Bilanzierung steht die Wertentwicklung eines Indikators über die Zeit im Fokus (z. B. Wachstum / Schrumpfung). " + + "Wird die Bilanzierung anhand der Auswahlbox aktiviert, kann über die Zeitleiste ein Start- sowie ein Endzeitpunkt festgelegt werden.
      " + + "Für diesen spezifizifischen Betrachtungszeitraum wird dann automatisch die Wertentwicklung des angezeigten Indikators berechnet und dargestellt. " + + "

      Auch die Indikatoren-Legende am rechten Rand der Anwendung beinhaltet dann die Information, dass eine Bilanz des Indikators dargestellt wird. " + + "

      Der Trendverlauf im Betrachtungszeitraumwird zudem in Form eines Liniendiagrammes visualisiert. " + + "
      Zur Trendberechnung kann in KomMonitor zwischen einer linearen, exponentiellen und polynomialen Herleitung gewählt werden. " + + "
      Des Weiteren sind statistische Merkmale der gewählten Trendbetrachtung hinterlegt. Hierzu zählen beispielsweise Standardabweichung, Varianz, Mittelwert und Median sowie " + + "die Art des Trendverlaufes. " + + "

      Bitte beachten Sie, dass eine Bilanzierung nur bei Status-Indikatoren möglich ist, " + + "deren Zeitreihe mehr als einen Zeitpunkt enthält.", + onNext: function (tour) { + if ($scope.sidebarBalanceClass !== "disappear") { + $("#sidebarBalanceCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarBalanceClass !== "disappear") { + $("#sidebarBalanceCollapse").click(); + } + } + }, + { + element: "#sidebarDiagramsCollapse", + title: "Statistische Diagramme", + placement: "right", + content: "Ein Klick auf diesen Button öffnet ein Fenster mit statistischen Diagrammen. " + + "

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function (tour) { + if ($scope.sidebarDiagramsClass === "disappear") { + $("#sidebarDiagramsCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarBalanceClass === "disappear") { + $("#sidebarBalanceCollapse").click(); + } + } + }, + { + element: "#indicatorDiagrams", + title: "Statistische Diagramme", + placement: "right", + content: "Zusätzlich zur kartografischen Darstellung bieten grundlegende statistische Diagramme hilfreiche Zusatzinformationen zum gewählten Indikator. " + + "

      Ein Ranking der jeweiligen Raumeinheiten wird anhand eines Säulendiagramms dargestellt. " + + "

      Das untere Liniendiagramm visualisiert die zeitliche Entwicklung des aktuellen Indikators über alle jeweils verfügbaren Zeitschnitte. " + + "Als Zusatzinformation wird hier der Durchschnittswert über alle Raumeinheiten dargestellt. " + + "

      Um einzelne Elemente der gewählten Raumebene im Säulen- und Liniendiagramm zu betrachten und hervorzuheben, " + + "kann mit dem Mauszeiger entweder über die Säule innerhalb des Säulendiagramms oder über das jeweilige Element in der Karte gefahren werden. " + + "Eine dauerhafte Selektion durch Klicken auf das kartografische Element oder die dazugehörige Säule ermöglicht das simultane Betrachten mehrerer Elemente. " + + "

      Jedes Diagramm enthält in der oberen rechte Ecke eine Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann.", + onNext: function (tour) { + if ($scope.sidebarDiagramsClass !== "disappear") { + $("#sidebarDiagramsCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarDiagramsClass !== "disappear") { + $("#sidebarDiagramsCollapse").click(); + } + } + }, + { + element: "#sidebarRadarDiagramCollapse", + title: "Indikatorenradar", + placement: "right", + content: "Ein Klick auf diesen Button öffnet das Indiktorenradar für die Querschnittsbetrachtung mehrerer Indikatoren.

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function (tour) { + if ($scope.sidebarRadarDiagramClass === "disappear") { + $("#sidebarRadarDiagramCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarDiagramsClass === "disappear") { + $("#sidebarDiagramsCollapse").click(); + } + } + }, + { + element: "#indicatorRadar", + title: "Indikatorenradar", + placement: "right", + content: "Das Indikatorenradar eignet sich insbesondere für die querschnittsorientierte Betrachtung mehrerer Indikatoren. " + + "
      Für die Anzeige eines solchen Diagramms, selektieren Sie bitte mindestens drei Indikatoren aus der oben stehenden Liste.

      " + + "Für jeden gewählten Indikator wird im Diagramm eine Achse genutzt, auf der einzelne Raumeinheiten anhand ihrer Wertausprägung abgetragen werden. " + + "Jede Achse wird dabei durch Minimum und Maximum der Werte des betrachteten Indikators gebildet (daher ist die Radarmitte ausdrücklich nicht zwingend " + + "mit dem Wert '0' gleichzusetzen, sondern mit dem Minimalwert des Indikators).

      Auch hier ist der Durchschnitt aller Raumeinheiten bereits vorberechnet und " + + "einzelne Elemente können mittels Selektion innerhalb der Karte dem Radar hinzugefügt werden. Die Indikatorenauswahl umfasst dabei nur solche Indikatoren, " + + "die die gewählte Raumebene und den aktuell gewählten Zeitschnitt unterstützen.

      Auch das Radardiagramm besitzt in der oberen rechte Ecke eine " + + "Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann", + onNext: function (tour) { + if ($scope.sidebarRadarDiagramClass !== "disappear") { + $("#sidebarRadarDiagramCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarRadarDiagramClass !== "disappear") { + $("#sidebarRadarDiagramCollapse").click(); + } + } + }, + { + element: "#sidebarRegressionDiagramCollapse", + title: "Regressionsdiagramm", + placement: "right", + content: "Ein Klick auf diesen Button öffnet das Fenster zur Definition von Regressionsdiagrammen.

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function (tour) { + if ($scope.sidebarRegressionDiagramClass === "disappear") { + $("#sidebarRegressionDiagramCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarRadarDiagramClass === "disappear") { + $("#sidebarRadarDiagramCollapse").click(); + } + } + }, + { + element: "#indicatorRegression", + title: "Regressionsdiagramm", + placement: "right", + content: "Als exemplarischer weiterer Diagrammtyp unterstützt KomMonitor die Berechnung einer linearen Regression zwischen zwei zu wählenden Indikatoren, um insbesondere die Korrelation zwischen diesen zu betrachten. Nach Auswahl der Indikatoren werden die Regressionsgerade und alle Elemente der gewählten Raumebene gemäß ihrer Wertausprägungen entlang der Indikatorenachsen im Diagramm abgetragen.

      Beim Überfahren eines Datenpunkts mit der Maus im Diagramm oder einer in der Karte dargestellten Raumeinheit, wird das jeweilige Pendant visuell hervorgehoben.

      Die Indikatorenauswahl umfasst dabei nur solche Indikatoren, die die gewählte Raumebene und den aktuell gewählten Zeitschnitt unterstützen.

      Auch das Regressionsdiagramm besitzt in der oberen rechte Ecke eine Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann.", + onNext: function (tour) { + if ($scope.sidebarRegressionDiagramClass !== "disappear") { + $("#sidebarRegressionDiagramCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarRegressionDiagramClass !== "disappear") { + $("#sidebarRegressionDiagramCollapse").click(); + } + } + }, + { + element: "#sidebarReachabilityCollapse", + title: "Erreichbarkeitsanalysen", + placement: "right", + content: "Ein Klick auf diesen Button öffnet ein Fenster für Erreichbarkeitsanalysen.

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function (tour) { + if ($scope.sidebarReachabilityClass === "disappear") { + $("#sidebarReachabilityCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarRegressionDiagramClass === "disappear") { + $("#sidebarRegressionDiagramCollapse").click(); + } + } + }, + { + element: "#kommonitorReachability", + title: "Erreichbarkeitsanalysen", + placement: "right", + content: "Als GIS-basiertes Werkzeug soll KomMonitor ausgewählte räumliche Analysen unterstützen. " + + "Insbesondere stehen Erreichbarkeitsanalysen im Fokus, bei denen, neben reinen Puffer-basierten Ansätzen, " + + "Erreichbarkeiten anhand tatsächlicher Wegenetze für verschiedene Transportmittel (z.B. Fußgänger, Fahrrad, Auto) " + + "berechnet werden können. Konkret soll hierbei sowohl ein Routing zwischen einzelnen Punkten sowie " + + "die Berechnung von Isochronen (Äquidistanzen und zeitliches Abbruchkriterium) angeboten werden.

      " + + "Auswahl der Startpunkte
      " + + "Die Auswahl der Startpunkte kann entweder über die Selektion eines vorhandenen Punktdatensatzes vorgenommen werden oder mittels Einzeichnen eigener beliebiger Punkte in die Karte.

      " + + "Ergebnisdarstellung
      " + + "Sowohl Isochronen- als auch Routingergebnisse werden der Karte als neuer, eigener Layer hinzugefügt. " + + "Die jeweilige Legende über jeweiligen Reiter des rechten Legendenmenüs einsehbar.

      " + + "Punkt in Isochronen Analyse
      " + + "Nachdem eine Isochronenberechnung erfolgt ist, können vorhandene Punktdatensätze räumlich mit den Isochronen verschnitten werden, bspw. um eine Umfeldanalyse für relevante Einrichtungen durchzuführen.", + onNext: function (tour) { + if ($scope.sidebarReachabilityClass !== "disappear") { + $("#sidebarReachabilityCollapse").click(); + } + }, + onPrev: function (tour) { + if ($scope.sidebarReachabilityClass !== "disappear") { + $("#sidebarReachabilityCollapse").click(); + } + } + }, + { + element: "#map", + title: "Vielen Dank für die Nutzung der Guided Tour von KomMonitor!", + placement: "left", + content: "Wir hoffen, die Erläuterungen konnten einen guten Einblick in die Funktionen bieten, " + + "bei der ersten Orientierung helfen und die zukünftige Nutzung erleichtern!

      " + + "Kritik, Anregungen oder Fragen sind jederzeit willkommen.
      (siehe Begrüßungsfenster für den Kontakt).

      " + + "Viel Spaß bei der Nutzung von KomMonitor! ", + onNext: function (tour) { + kommonitorDataExchangeService.guidedTour = undefined; // ends the tour + } + } + // { + // element: "#sidebarProcessingCollapse", + // title: "Individuelle Indikatoren-Neuberechnung", + // placement: "right", + // content: "Ein Klick auf diesen Button öffnet ein Fenster zur individuellen Neuberechnung einzelner Indikatoren.

      Im nächsten Schritt wird das Menü automatisch geöffnet.", + // onNext: function(tour){ + // if($scope.sidebarProcessingClass === "disappear"){ + // $("#sidebarProcessingCollapse").click(); + // } + // }, + // onPrev: function(tour){ + // if($scope.sidebarReachabilityClass === "disappear"){ + // $("#sidebarReachabilityCollapse").click(); + // } + // } + // }, + // { + // element: "#indicatorProcessing", + // title: "Individuelle Indikatoren-Neuberechnung", + // placement: "right", + // content: "KomMonitor ist mehr als nur ein Darstellungswerkzeug. Es ermöglicht insbesondere auch die automatisierte Berechnung von Indikatoren. Je nach Berechnungsvorschrift kann es dabei konfigurierbare Parameter geben, die die resultierenden Indikatorenwerte beeinflussen (bspw. eine maximle Distanz bei Erreichbarkeiten oder Gewichtungen grundlegender Eingangsdaten).

      Dieses Menü bietet die Möglichkeit einer Nutzer-definierten Neuberechnung von Indikatoren mit mindestens einem konfigurierbaren Parameter. Das jeweilige Berechnungsergebnis steht anschließend temporär zur Verfügung und kann bei Bedarf exportiert werden.

      Künftig sollen darüber hinaus unmittelbare Vergleiche mit der 'Standard'-Variante des Indikators angeboten werden. Diese sind jedoch zum gegenwärtigen Zeitpunkt noch nicht in der Anwendung umgesetzt.", + // onNext: function(tour){ + // if($scope.sidebarProcessingClass !== "disappear"){ + // $("#sidebarProcessingCollapse").click(); + // } + // }, + // onPrev: function(tour){ + // if($scope.sidebarProcessingClass !== "disappear"){ + // $("#sidebarProcessingCollapse").click(); + // } + // } + // } + ], + onShown: function (tour) { + // add shortcut to toc to each title + let titleElement = document.getElementsByClassName("popover-title").item(0); + titleElement.innerHTML += + "" + + ""; + $compile(titleElement)($scope); // let angularjs know that there is new html, add the ng-click event + } + }; + $scope.generateTableOfContent = function () { + let prevStepTitle = undefined; + for (var i = 0; i < $scope.tourOptions.steps.length; i++) { + let step = $scope.tourOptions.steps[i]; + // only show the first guided tour step for each subtheme + // specifically exclude "Individuelle Indikatoren-Neuberechnung" for now as it is not shown in the guided tour + if (step.title !== prevStepTitle && step.title !== "Individuelle Indikatoren-Neuberechnung") { + let html = "
    1. " + step.title + "
    2. "; + let compiled = $compile(html)($scope); // let angularjs know that there is new html, add the ng-click event + angular.element(document.getElementById('guided-tour-toc')).append(compiled); + } + prevStepTitle = step.title; + } + }; + $scope.goToGuidedTourStep = function (tour, targetStepIndex) { + // The method "goTo" provided by the library jumps directly to the target step, ignoring the "onNext" and "onPrev" methods. + // That leads to menues not being opened/closed. To fix this we iterate the steps manually. + while (tour.getCurrentStep() < targetStepIndex) + tour.next(); + while (tour.getCurrentStep() > targetStepIndex) + tour.prev(); + }; + $scope.startGuidedTour = function () { + // GUIDED TOUR + // Instance the tour + kommonitorDataExchangeService.guidedTour = new Tour($scope.tourOptions); + // Initialize the tour + kommonitorDataExchangeService.guidedTour.init(); + // Start the tour + try { + kommonitorDataExchangeService.guidedTour.restart(); + } + catch (error) { + kommonitorDataExchangeService.guidedTour.start(true); + } + // tour gotTo() example to jump to step 7 --> index starts from 0 + // kommonitorDataExchangeService.guidedTour.goTo(6); + }; + $scope.$on("redrawGuidedTourElement", async function (event) { + await sleep(100); + if (kommonitorDataExchangeService.guidedTour) { + kommonitorDataExchangeService.guidedTour.redraw(); + } + }); + $scope.init(); + } + ] +}); +//# sourceMappingURL=kommonitor-user-interface.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitor-user-interface.component.js.map b/app/components/kommonitorUserInterface/kommonitor-user-interface.component.js.map new file mode 100644 index 000000000..3ae5711ef --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitor-user-interface.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-user-interface.component.js","sourceRoot":"","sources":["kommonitor-user-interface.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitor-user-interface.component.ts b/app/components/kommonitorUserInterface/kommonitor-user-interface.component.ts new file mode 100644 index 000000000..4c8a2733f --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitor-user-interface.component.ts @@ -0,0 +1,1077 @@ +angular.module('kommonitorUserInterface').component('kommonitorUserInterface', { + templateUrl : "components/kommonitorUserInterface/kommonitor-user-interface.template.html", + controller : ['kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', 'kommonitorElementVisibilityHelperService', '$scope', + '$rootScope', '$location', 'Auth', 'ControlsConfigService', '$compile', 'kommonitorShareHelperService', '__env', + function UserInterfaceController(kommonitorDataExchangeService, kommonitorKeycloakHelperService, kommonitorElementVisibilityHelperService, + $scope, $rootScope, $location, Auth, ControlsConfigService, $compile, kommonitorShareHelperService, __env) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorKeycloakHelperServiceInstance = kommonitorKeycloakHelperService; + this.kommonitorElementVisibilityHelperServiceInstance = kommonitorElementVisibilityHelperService; + + kommonitorDataExchangeService.anySideBarIsShown = false; + + + kommonitorDataExchangeService.currentKeycloakUser; + $scope.password; + $scope.showAdminLogin = false; + + $scope.init = async function () { + // initialize application + console.log("Initialize Application"); + if ($scope.authenticated) { + console.log("Authetication successfull"); + } + + await checkAuthentication(); + + kommonitorShareHelperService.init(); + + kommonitorDataExchangeService.fetchAllMetadata(); + }; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $scope.sidebarIndicatorConfigClass = "disappear"; + $scope.sidebarDiagramsClass = "disappear"; + $scope.sidebarRadarDiagramClass = "disappear"; + $scope.sidebarProcessingClass = "disappear"; + $scope.sidebarRegressionDiagramClass = "disappear"; + $scope.sidebarFilterClass = "disappear"; + $scope.sidebarBalanceClass = "disappear"; + $scope.sidebarReachabilityClass = "disappear"; + $scope.sidebarPoiClass = "disappear"; + $scope.sidebarDataImportClass = "disappear"; + + $scope.sidebarLegendClass = ""; + + $scope.buttonIndicatorConfigClass = "btn btn-custom btn-circle"; + $scope.buttonDiagramsClass = "btn btn-custom btn-circle"; + $scope.buttonRadarDiagramClass = "btn btn-custom btn-circle"; + $scope.buttonProcessingClass = "btn btn-custom btn-circle"; + $scope.buttonRegressionDiagramClass = "btn btn-custom btn-circle"; + $scope.buttonFilterClass = "btn btn-custom btn-circle"; + $scope.buttonBalanceClass = "btn btn-custom btn-circle"; + $scope.buttonReachabilityClass = "btn btn-custom btn-circle"; + $scope.buttonPoiClass = "btn btn-custom btn-circle"; + $scope.buttonDataImportClass = "btn btn-custom btn-circle"; + + $scope.buttonLegendClass = "btn btn-custom-docked-right btn-docked-right"; + + function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + Auth.keycloak.onAuthLogout = function() { + console.log("Logout successfull"); + checkAuthentication(); + } + + Auth.keycloak.onAuthSuccess = function() { + console.log("User successfully authenticated"); + checkAuthentication(); + } + + $scope.tryLoginUser_withoutKeycloak = function(){ + // TODO FIXME make generic user login once user/role concept is implemented + + // currently only simple ADMIN user login is possible + console.log("Check user login"); + if (kommonitorDataExchangeService.adminUserName === kommonitorDataExchangeService.currentKeycloakUser && kommonitorDataExchangeService.adminPassword === $scope.password){ + // success login --> currently switch to ADMIN page directly + console.log("User Login success - redirect to Admin Page"); + kommonitorDataExchangeService.adminIsLoggedIn = true; + $location.path('/administration'); + } + }; + + $scope.tryLoginUser = function(){ + if(kommonitorDataExchangeService.enableKeycloakSecurity){ + Auth.keycloak.login(); + } + else{ + $scope.tryLoginUser_withoutKeycloak(); + } + + }; + + $scope.tryLogoutUser = function() { + Auth.keycloak.logout(); + }; + + $scope.tryLoginUserByKeypress = function ($event) { + var keyCode = $event.which || $event.keyCode; + //check for enter key + if (keyCode === 13) { + $scope.tryLoginUser(); + } + }; + + var checkAuthentication = async function () { + kommonitorDataExchangeService.currentKeycloakLoginRoles = []; + + if (Auth.keycloak.authenticated) { + $scope.authenticated = Auth.keycloak.authenticated; + if(Auth.keycloak.tokenParsed + && Auth.keycloak.tokenParsed.realm_access + && Auth.keycloak.tokenParsed.realm_access.roles + && Auth.keycloak.tokenParsed.realm_access.roles.some(role => role.endsWith("-creator") || role.endsWith("-publisher") || role.endsWith("-editor"))){ + Auth.keycloak.showAdminView = true; + $scope.showAdminLogin = true; + } + } + }; + + $scope.openAdminUI = function () { + $location.path('/administration'); + }; + + $scope.undockButtons = function(){ + $scope.buttonIndicatorConfigClass = "btn btn-custom btn-circle"; + $scope.buttonDiagramsClass = "btn btn-custom btn-circle"; + $scope.buttonRadarDiagramClass = "btn btn-custom btn-circle"; + $scope.buttonProcessingClass = "btn btn-custom btn-circle"; + $scope.buttonRegressionDiagramClass = "btn btn-custom btn-circle"; + $scope.buttonFilterClass = "btn btn-custom btn-circle"; + $scope.buttonBalanceClass = "btn btn-custom btn-circle"; + $scope.buttonReachabilityClass = "btn btn-custom btn-circle"; + $scope.buttonPoiClass = "btn btn-custom btn-circle"; + $scope.buttonDataImportClass = "btn btn-custom btn-circle"; + + // in addition check if balance menue and button are allowed for current indicator + // it is not allowed if indicator is of type "DYNAMIC" + $scope.checkBalanceButtonAndMenueState(); + }; + + $scope.hideSidebars = function(){ + $scope.sidebarIndicatorConfigClass = "disappear"; + $scope.sidebarDiagramsClass = "disappear"; + $scope.sidebarRadarDiagramClass = "disappear"; + $scope.sidebarProcessingClass = "disappear"; + $scope.sidebarRegressionDiagramClass = "disappear"; + $scope.sidebarFilterClass = "disappear"; + $scope.sidebarBalanceClass = "disappear"; + $scope.sidebarReachabilityClass = "disappear"; + $scope.sidebarPoiClass = "disappear"; + $scope.sidebarDataImportClass = "disappear"; + }; + + $scope.checkBalanceButtonAndMenueState = function(){ + // disable if indicator is dynamic or if indicator only contains 1 or less timeseries entries + if(kommonitorDataExchangeService.selectedIndicator && (kommonitorDataExchangeService.selectedIndicator.indicatorType.includes("DYNAMIC") || kommonitorDataExchangeService.selectedIndicator.applicableDates.length < 2)){ + $scope.buttonBalanceClass = "btn btn-custom btn-circle disabled"; + $scope.sidebarBalanceClass = "disappear"; + } + else{ + $scope.buttonBalanceClass = "btn btn-custom btn-circle"; + } + }; + + $scope.$on("checkBalanceMenueAndButton", function(event){ + $scope.checkBalanceButtonAndMenueState(); + }); + + $scope.onSidebarIndicatorButtonClick = function(){ + $scope.undockButtons(); + + if($scope.sidebarIndicatorConfigClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarIndicatorConfigClass = ""; + $scope.buttonIndicatorConfigClass = "btn btn-custom-docked btn-docked"; + + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else{ + $scope.sidebarIndicatorConfigClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + + } + + $scope.onSidebarPoiButtonClick = function(){ + $scope.undockButtons(); + + if($scope.sidebarPoiClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarPoiClass = ""; + $scope.buttonPoiClass = "btn btn-custom-docked btn-docked"; + + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else{ + $scope.sidebarPoiClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + + } + + $scope.onSidebarDataImportButtonClick = function(){ + $scope.undockButtons(); + + if($scope.sidebarDataImportClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarDataImportClass = ""; + $scope.buttonDataImportClass = "btn btn-custom-docked btn-docked"; + + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else{ + $scope.sidebarDataImportClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + + } + + $scope.onSidebarFilterButtonClick = function(){ + $scope.undockButtons(); + + if($scope.sidebarFilterClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarFilterClass = ""; + $scope.buttonFilterClass = "btn btn-custom-docked btn-docked"; + + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else{ + $scope.sidebarFilterClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + + } + + $scope.onSidebarBalanceButtonClick = function(){ + + // check if button is marked as disabled + if($scope.buttonBalanceClass.includes("disabled")){ + // do nothing + return; + } + else{ + $scope.undockButtons(); + + if($scope.sidebarBalanceClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarBalanceClass = ""; + $scope.buttonBalanceClass = "btn btn-custom-docked btn-docked"; + + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else{ + $scope.sidebarBalanceClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + } + } + + $scope.onSidebarReachabilityButtonClick = function(){ + $scope.undockButtons(); + + if($scope.sidebarReachabilityClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarReachabilityClass = ""; + $scope.buttonReachabilityClass = "btn btn-custom-docked btn-docked"; + + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else{ + $scope.sidebarReachabilityClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + + } + + $scope.onSidebarDiagramsClick = function(){ + $scope.undockButtons(); + if($scope.sidebarDiagramsClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarDiagramsClass = ""; + $scope.buttonDiagramsClass = "btn btn-custom-docked btn-docked"; + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + $rootScope.$broadcast("resizeDiagrams"); + } + else{ + $scope.sidebarDiagramsClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + } + + $scope.onSidebarRadarDiagramClick = function(){ + $scope.undockButtons(); + if($scope.sidebarRadarDiagramClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarRadarDiagramClass = ""; + $scope.buttonRadarDiagramClass = "btn btn-custom-docked btn-docked"; + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + $rootScope.$broadcast("resizeDiagrams"); + } + else{ + $scope.sidebarRadarDiagramClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + } + + $scope.onSidebarProcessingClick = function(){ + $scope.undockButtons(); + if($scope.sidebarProcessingClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarProcessingClass = ""; + $scope.buttonProcessingClass = "btn btn-custom-docked btn-docked"; + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + } + else{ + $scope.sidebarProcessingClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + } + + $scope.onSidebarRegressionDiagramClick = function(){ + $scope.undockButtons(); + if($scope.sidebarRegressionDiagramClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarRegressionDiagramClass = ""; + $scope.buttonRegressionDiagramClass = "btn btn-custom-docked btn-docked"; + if(kommonitorDataExchangeService.anySideBarIsShown === false){ + $rootScope.$broadcast("recenterMapOnShowSideBar"); + } + kommonitorDataExchangeService.anySideBarIsShown = true; + $rootScope.$broadcast("resizeDiagrams"); + } + else{ + $scope.sidebarRegressionDiagramClass = "disappear"; + $rootScope.$broadcast("recenterMapOnHideSideBar"); + kommonitorDataExchangeService.anySideBarIsShown = false; + } + + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + $rootScope.$broadcast("redrawGuidedTourElement"); + } + + $scope.onSidebarLegendButtonClick = function(){ + + if($scope.sidebarLegendClass === "disappear"){ + $scope.hideSidebars(); + $scope.sidebarLegendClass = ""; + $scope.buttonLegendClass = "btn btn-custom-docked-right btn-docked-right"; + } + else{ + $scope.sidebarLegendClass = "disappear"; + $scope.buttonLegendClass = "btn btn-custom-right btn-circle-right"; + } + + $rootScope.$broadcast("invalidateMapSize"); + $rootScope.$broadcast("refreshIndicatorValueRangeSlider"); + }; + + $scope.onRecenterMapButtonClick = function(){ + $rootScope.$broadcast("recenterMapContent"); + } + + $scope.onExportMapButtonClick = function(){ + $rootScope.$broadcast("exportMap"); + } + + $scope.onUnselectFeaturesButtonClick = function(){ + $rootScope.$broadcast("unselectAllFeatures"); + } + + $scope.onToggleInfoControlButtonClick = function(){ + $rootScope.$broadcast("toggleInfoControl"); + } + + $scope.onToggleLegendControlButtonClick = function(){ + $rootScope.$broadcast("toggleLegendControl"); + } + + $scope.$on("startGuidedTour", function(event){ + $scope.startGuidedTour(); + }); + + $scope.tourOptions = { + container: "body", + backdrop: true, + backdropContainer: "body", + smartPlacement: false, + onEnd: function(tour){ + kommonitorDataExchangeService.guidedTour = undefined; + }, + template: "

      ", + steps: [ + { + element:"#map", + title: "Willkommen zur Guided Tour von KomMonitor", + placement: "left", + content: "In dieser Tour werden die Funktionalitäten der Weboberfläche erläutert. Hier werden sie mit den Elementen der Oberfläche sowie den verschiedenen Buttons vertraut gemacht. " + + "
      Die Tour kann jederzeit über den Button Guided Tour beenden verlassen werden. ", + onNext: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#sidebarLegendCollapse").click(); + } + } + }, + { + element: "#map", + title: "Inhaltsverzeichnis", + placement: "top", + content: "
        ", + onNext: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#sidebarLegendCollapse").click(); + } + }, + onShown: function(tour) { + $scope.generateTableOfContent(); + } + }, + { + element: "#header", + title: "Kopfzeile", + placement: "bottom", + content: "In der Kopfzeile befinden sich neben den Logos und dem Titel der Webanwendung mehrere Buttons.
        " + + "Mit kann zwischen einer vereinfachten und einer erweiterten Ansicht gewechselt werden.
        " + + "Diese Guided Tour kann stets erneut mit aufgerufen werden. " + + " öffnet das beim Aufruf der Seite erschienene Informationsfenster und
        " + + " ermöglicht mit entsprechenden Zugangsdaten den Zugang zur Administrationsoberfläche." + }, + { + element: "#map", + title: "Kartenfenster", + placement: "top", + content: "Die Standardansicht besteht aus einer kartografischen Darstellung, die bereits eine Hintergrundkarte und einen Indikator anzeigt. In dieser Darstellung können Sie in der " + + "Karte frei navigieren (zoomen, verschieben) und beim Herüberfahren mit dem Mauszeiger über eine der Raumeinheiten werden der Name, der Wert und die Einheit des dargestellten Indikators angezeigt.", + // onNext: function(tour){ + // // make sure that legend control is displayed + + // var control = document.getElementById("legendControl"); + // var controlButton = document.getElementById("toggleLegendControlButton"); + // if(control.style.display === "none" || (controlButton.style.display !== undefined && controlButton.style.display !== "none")){ + // $rootScope.$broadcast("toggleLegendControl"); + // } + + // }, + onNext: function(tour){ + if($scope.sidebarLegendClass === "disappear"){ + $("#sidebarLegendCollapse").click(); + } + } + }, + { + element: "#kommonitorLegend", + title: "Indikatorenlegende und Klassifizierung", + placement: "left", + content: "Dieses Element ist in drei Teilbereiche untergliedert, welche
        1. die wichtigsten Metadaten des dargestellten Indikator abbilden,
        " + + "2. Kartenlegenden zur Interpretation der Karteninhalte anbieten und
        3. weitergehende Möglichkeiten zur Klassifizierung bieten.", + onNext: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#legendSymbologyCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#sidebarLegendCollapse").click(); + } + } + }, + { + element: "#kommonitorIndicatorBasicMetadata", + title: "Indikator-Metadaten, Einstellung- und Exportmöglichkeiten", + placement: "left", + content: "Im oberen Bereich sind der Name eine kurze Beschreibung sowie das Fortführungsintervall des angezeigten Indikators zu finden.
        " + + "Im mittleren Bereich kann die angezeigte Raumebene per Dropdown-Liste gewechselt, der Zeitpunkt per Kalenderauswahl gewählt sowie
        " + + "die Transparenz der Kartendarstellung per Schieberegler angepasst werden.
        " + + "Der untere Bereich bietet Exportmöglichkeiten für die angezeigten Daten in den Formaten GeoJSON, ESRI Shapefile sowie CSV.
        " + + "Zudem kann ein Metadatenblatt aller Metadaten des dargestellten Indikators als PDF-Datei heruntergeladen werden.", + onNext: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#indicatorBasicMetadataCollapse").click(); + $("#legendSymbologyCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#legendSymbologyCollapse").click(); + } + } + }, + { + element: "#kommonitorLegendSymbology", + title: "Kartenlegenden und Interpretation", + placement: "left", + content: "Dieser Bereich beinhaltet eine Farblegende mit fünf Klassen für den angezeigten Indikator sowie die Wertebereiche und Fallzahlen je Klasse
        " + + "Als ergänzende Informationen werden der Indikatortyp, der Stichtag, die Einheit sowie eine kurze Interpretationshilfe angezeigt.
        " + + "Die einzelnen Reiter ganz oben ermöglichen den Wechsel zwischen verschiedenen Legenden, sofern zusätzlich zu einem Indikator
        " + + "auch die Legende für berechnete Isochronen, ein Routingergebnis oder einen eingebundenen WMS-Dienst angezeigt werden sollen.", + onNext: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#legendSymbologyCollapse").click(); + $("#indicatorClassificationCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#legendSymbologyCollapse").click(); + $("#indicatorBasicMetadataCollapse").click(); + } + } + }, + { + element: "#kommonitorIndicatorClassification", + title: "Klassifikationsoptionen", + placement: "left", + content: "Hier kann zwischen den drei Klassifizierungsmethoden Jenks, Gleiches Intervall und Quantile gewählt werden
        " + + "
        Detaillierte Informationen zu den Klassifizierungsmethoden können dem Popup entnommen werden, das beim Herüberfahren mit dem Mauszeiger über eine der drei Optionen erscheint. " + + "
        Zudem lässt sich per einstellen, ob die Klassifizierung die Indikatorenwerte der gesamten Zeitreihe berücksichtigen soll, oder nur jene des aktuellen Zeitschnitts.
        " + + "So kann ein vergleichbares Kartenbild für eine komplette Zeitreihe gewährleistet werden.
        " + + "
        KomMonitor überprüft jeden Indikatorendatensatz auf statistische Ausreißer. Werden ein oder mehrere Ausreißer erkannt, so können mit " + + "Ausreißer gesondert markiert und
        aus der Klassifizierung entfernt werden
        . Dies kann hilfreich sein, " + + "um ein differenzierteres Kartenbild zu erzeugen.", + onNext: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#sidebarLegendCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarLegendClass !== "disappear"){ + $("#legendSymbologyCollapse").click(); + $("#indicatorClassificationCollapse").click(); + } + } + }, + { + element: "#dateSliderWrapper", + title: "Zeitstrahl", + placement: "top", + content: "Die Zeitleiste am unteren Bildschirmrand enthält die verfügbaren Zeitschnitte des selektierten Indikators. Standardmäßig ist der aktuellste Zeitschnitt voreingestellt. "+ + "
        Durch ein Klicken auf einen beliebigen Punkt der Leiste oder durch Verschieben des runden Auswahlknopfs kann ein anderer Zeitschnitt gewählt werden.", + onPrev: function(tour){ + if($scope.sidebarLegendClass === "disappear"){ + $("#sidebarLegendCollapse").click(); + } + } + }, + { + element: "#mapUtilButtons", + title: "Steuerung der Kartendarstellung", + placement: "bottom", + content: "Diese Buttons bieten Steuerungsmöglichkeiten für die Kartendarstellung. Über und kann alternativ zur Verwendung des Mausrades hinein- bzw. hinausgezoomt werden. "+ + "

        zentriert die Karte und zoomt auf die maximale Ausdehnung des dargestellten Themas. " + + "

        hebt jegliche benutzerdefinierte Selektionen auf. " + + "

        erlaubt den Export des aktuellen Kartenausschnitts als Bilddatei. " + + "

        bietet die Möglichkeit, einzelne Karteninhalte temporär auszublenden oder die Hintergrundkarte zu wechseln. " + + "

        ermöglicht das Filtern innerhalb dargestellter Vektorlayer anhand des Namens oder der ID vorhandener Raumelemente. " + + "

        repräsentiert eine Geolokalisierung von Adressen und Orten. " + + "

        Darüber hinaus bietet eine Messfunktion für Abstände und Flächen." + }, + { + element: "#sideBarButtons", + title: "Menü-Buttons", + placement: "right", + content: "Diese Buttons öffnen jeweils ein linksseitig angeordnetets Menü mitzusätzlichen Funktionen. Jedes einzelne Menü wird in den folgenden Schritten kurz erläutert." + }, + { + element: "#sidebarIndicatorConfigCollapse", + title: "Indikatorenkatalog und Metadaten", + placement: "right", + content: "Ein Klick auf diesen Button öffnet das Indikatoren-Auswahl-Fenster.

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function(tour){ + if($scope.sidebarIndicatorConfigClass === "disappear"){ + $("#sidebarIndicatorConfigCollapse").click(); + } + } + }, + { + element: "#indicatorSetup", + title: "Indikatorenkatalog und Metadaten", + placement: "right", + content: "Dieses Menü enthält eine Übersicht aller verfügbarer Indikatoren sowie die Option, " + + "den aktuell betrachteten Indikator zu wechseln.

        Indikatoren können in Form einer Themenhierarchie im Datenkatalog oder in einer " + + "alphabetischen Liste betrachtet und selektiert werden.
        " + + "Einen transparenten Zugang zu zusammenschauenden, bewertenden Indikatoren bietet die Leitindikatoren-Hierarchie.
        " + + "Hiermit können Leitindikatoren sowie die zur Berechnung verwendeten Basis-Indikatoren aufgerufen und deren Verknüpfung nachvollzogen werden.
        " + + "Auch die Metadaten des ausgewählten Indikators können hier detailliert eingesehen werden.", + onNext: function(tour){ + if($scope.sidebarIndicatorConfigClass !== "disappear"){ + $("#sidebarIndicatorConfigCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarIndicatorConfigClass !== "disappear"){ + $("#sidebarIndicatorConfigCollapse").click(); + } + } + }, + { + element: "#sidebarPoiCollapse", + title: "Georessourcen und -dienste", + placement: "right", + content: "Ein Klick auf diesen Button öffnet das Georessourcen Fenster.

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function(tour){ + if($scope.sidebarPoiClass === "disappear"){ + $("#sidebarPoiCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarIndicatorConfigClass === "disappear"){ + $("#sidebarIndicatorConfigCollapse").click(); + } + } + }, + { + element: "#poi", + title: "Georessourcen und -dienste", + placement: "right", + content: "Zur Überlagerung von flächenhaft dargestellten Indikatoren mit weiteren relevanten Geodaten können Punkt- Linien und Flächendaten sowie Geodatendienste " + + "zur Karte hinzugefügt werden. Hinzufügen und Entfernen dieser Datensätze geschieht dabei durch (De-) Selektion der Auswahlbox links neben dem jeweiligen Datensatz. " + + "

        In der Standardkonfiguration werden Punktdaten räumlich zu sogenannten Cluster-Punkten zusammengefasst, um die Darstellung je nach Zoom-Stufe zu optimieren und
        " + + "selbst bei bei vielen Punkten eine übersichtliche Darstellung zu gewährleisten." + + "Über eine entsprechende Auswahloption können jedoch bei jeder Zoomstufe wahlweise auch alle Einzelpunkte angezeigt werden. " + + "

        Hinweis zum Zeitbezug der darzustellenden Daten:
        Der Abruf eines Punkt-, Linien- oder Flächendatensatzes bezieht sich immer auf ein Datum. " + + "Standardmäßig wird der aktuelle Zeitpunkt des dargestellten Indikators verwendet. Diese Option kann jedoch auf ein beliebiges frei definierbares Datum oder eine " + + "listenbasierte Auswahl verfügbarer Zeitpunkte jedes Datensatzes abgeändert werden.", + onNext: function(tour){ + if($scope.sidebarPoiClass !== "disappear"){ + $("#sidebarPoiCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarPoiClass !== "disappear"){ + $("#sidebarPoiCollapse").click(); + } + } + }, + // { + // element: "#sidebarDataImportCollapse", + // title: "Datenimport aus externen Quellen", + // placement: "right", + // content: "Ein Klick auf diesen Button öffnet das Datenimport Fenster.

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + // onNext: function(tour){ + // if($scope.sidebarDataImportClass === "disappear"){ + // $("#sidebarDataImportCollapse").click(); + // } + // } + // }, + // { + // element: "#dataImport", + // title: "Datenimport aus externen Quellen", + // placement: "right", + // content: "Dieses Fenster bietet Optionen zum Datenimport aus externen Datenquellen, insbesondere mittels Web Map Services und Datei-basierten Quellen wie GeoJSON oder ESRI Shape.

        Jeder WMS-Datensatz wird tabellarisch inklusive Titel, Beschreibung, Transparenzschieberegler, URL und Legende dargestellt. Durch Anhaken/Deselektion der Checkbox kann ein Datensatz hinzugefügt/entfernt werden. Neben den bereits vorkonfigurierten Datensätzen lassen sich weitere Quellen über den unten stehenden Button ergänzen.

        Die Möglichkeit Layer aus einer lokalen Datei einzuladen wird in Kürze verfügbar sein.", + // onNext: function(tour){ + // if($scope.sidebarDataImportClass !== "disappear"){ + // $("#sidebarDataImportCollapse").click(); + // } + // }, + // onPrev: function(tour){ + // if($scope.sidebarDataImportClass !== "disappear"){ + // $("#sidebarDataImportCollapse").click(); + // } + // } + // }, + { + element: "#sidebarFilterCollapse", + title: "Darstellungsfilter", + placement: "right", + content: "Ein Klick auf diesen Button öffnet ein Fenster zur Definition von Darstellungsfiltern.

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function(tour){ + if($scope.sidebarFilterClass === "disappear"){ + $("#sidebarFilterCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarPoiClass === "disappear"){ + $("#sidebarPoiCollapse").click(); + } + } + }, + { + element: "#kommonitorFilter", + title: "Darstellungsfilter", + placement: "right", + //

        Darüber hinaus können je nach Fragestellung die Raumebenen-Geometrien (z.B. Stadtteile) auf diejenigen eingeschränkt werden, die zur Beantwortung der Fragestellung beitragen. + content: "Hier können verschiedene Darstellungsfilter angewendet werden, die sich auf die kartografische Darstellung auswirken. " + + "Über den Wertebereichsfilter können die angezeigten Raumeinheiten anhand der Wertausprägung des angezeigten Indikators gefiltert werden. " + + "Dazu kann der Schieberegler an dem minimalen und maximalen Werten nach rechts oder links geschoben werden. Alternativ kann die untere und/oder obere Grenze " + + "auch als Zahlenwert eingetragen werden.
        " + + "
        Eine weitere Option ist die dynamische Schwellenwertklassifizierung, bei der ein spezifischer Wert definiert werden kann, " + + "der die Indikator-Darstellung in zwei Bereiche unterteilt (oberhalb und unterhalb des Schwellenwerts) und entsprechend farbig darstellt.", + onNext: function(tour){ + if($scope.sidebarFilterClass !== "disappear"){ + $("#sidebarFilterCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarFilterClass !== "disappear"){ + $("#sidebarFilterCollapse").click(); + } + } + }, + { + element: "#sidebarBalanceCollapse", + title: "Zeitliche Bilanzierung", + placement: "right", + content: "Ein Klick auf diesen Button öffnet ein Fenster zur zeitlichen Bilanzierung des aktuell dargestellten Indikators. " + + "

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function(tour){ + if($scope.sidebarBalanceClass === "disappear"){ + $("#sidebarBalanceCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarFilterClass === "disappear"){ + $("#sidebarFilterCollapse").click(); + } + } + }, + { + element: "#kommonitorBalance", + title: "Zeitliche Bilanzierung", + placement: "right", + content: "Bei der zeitlichen Bilanzierung steht die Wertentwicklung eines Indikators über die Zeit im Fokus (z. B. Wachstum / Schrumpfung). " + + "Wird die Bilanzierung anhand der Auswahlbox aktiviert, kann über die Zeitleiste ein Start- sowie ein Endzeitpunkt festgelegt werden.
        " + + "Für diesen spezifizifischen Betrachtungszeitraum wird dann automatisch die Wertentwicklung des angezeigten Indikators berechnet und dargestellt. " + + "

        Auch die Indikatoren-Legende am rechten Rand der Anwendung beinhaltet dann die Information, dass eine Bilanz des Indikators dargestellt wird. " + + "

        Der Trendverlauf im Betrachtungszeitraumwird zudem in Form eines Liniendiagrammes visualisiert. " + + "
        Zur Trendberechnung kann in KomMonitor zwischen einer linearen, exponentiellen und polynomialen Herleitung gewählt werden. " + + "
        Des Weiteren sind statistische Merkmale der gewählten Trendbetrachtung hinterlegt. Hierzu zählen beispielsweise Standardabweichung, Varianz, Mittelwert und Median sowie " + + "die Art des Trendverlaufes. " + + "

        Bitte beachten Sie, dass eine Bilanzierung nur bei Status-Indikatoren möglich ist, " + + "deren Zeitreihe mehr als einen Zeitpunkt enthält.", + onNext: function(tour){ + if($scope.sidebarBalanceClass !== "disappear"){ + $("#sidebarBalanceCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarBalanceClass !== "disappear"){ + $("#sidebarBalanceCollapse").click(); + } + } + }, + { + element: "#sidebarDiagramsCollapse", + title: "Statistische Diagramme", + placement: "right", + content: "Ein Klick auf diesen Button öffnet ein Fenster mit statistischen Diagrammen. " + + "

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function(tour){ + if($scope.sidebarDiagramsClass === "disappear"){ + $("#sidebarDiagramsCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarBalanceClass === "disappear"){ + $("#sidebarBalanceCollapse").click(); + } + } + }, + { + element: "#indicatorDiagrams", + title: "Statistische Diagramme", + placement: "right", + content: "Zusätzlich zur kartografischen Darstellung bieten grundlegende statistische Diagramme hilfreiche Zusatzinformationen zum gewählten Indikator. " + + "

        Ein Ranking der jeweiligen Raumeinheiten wird anhand eines Säulendiagramms dargestellt. " + + "

        Das untere Liniendiagramm visualisiert die zeitliche Entwicklung des aktuellen Indikators über alle jeweils verfügbaren Zeitschnitte. " + + "Als Zusatzinformation wird hier der Durchschnittswert über alle Raumeinheiten dargestellt. " + + "

        Um einzelne Elemente der gewählten Raumebene im Säulen- und Liniendiagramm zu betrachten und hervorzuheben, " + + "kann mit dem Mauszeiger entweder über die Säule innerhalb des Säulendiagramms oder über das jeweilige Element in der Karte gefahren werden. " + + "Eine dauerhafte Selektion durch Klicken auf das kartografische Element oder die dazugehörige Säule ermöglicht das simultane Betrachten mehrerer Elemente. " + + "

        Jedes Diagramm enthält in der oberen rechte Ecke eine Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann.", + onNext: function(tour){ + if($scope.sidebarDiagramsClass !== "disappear"){ + $("#sidebarDiagramsCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarDiagramsClass !== "disappear"){ + $("#sidebarDiagramsCollapse").click(); + } + } + }, + { + element: "#sidebarRadarDiagramCollapse", + title: "Indikatorenradar", + placement: "right", + content: "Ein Klick auf diesen Button öffnet das Indiktorenradar für die Querschnittsbetrachtung mehrerer Indikatoren.

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function(tour){ + if($scope.sidebarRadarDiagramClass === "disappear"){ + $("#sidebarRadarDiagramCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarDiagramsClass === "disappear"){ + $("#sidebarDiagramsCollapse").click(); + } + } + }, + { + element: "#indicatorRadar", + title: "Indikatorenradar", + placement: "right", + content: "Das Indikatorenradar eignet sich insbesondere für die querschnittsorientierte Betrachtung mehrerer Indikatoren. " + + "
        Für die Anzeige eines solchen Diagramms, selektieren Sie bitte mindestens drei Indikatoren aus der oben stehenden Liste.

        " + + "Für jeden gewählten Indikator wird im Diagramm eine Achse genutzt, auf der einzelne Raumeinheiten anhand ihrer Wertausprägung abgetragen werden. " + + "Jede Achse wird dabei durch Minimum und Maximum der Werte des betrachteten Indikators gebildet (daher ist die Radarmitte ausdrücklich nicht zwingend " + + "mit dem Wert '0' gleichzusetzen, sondern mit dem Minimalwert des Indikators).

        Auch hier ist der Durchschnitt aller Raumeinheiten bereits vorberechnet und " + + "einzelne Elemente können mittels Selektion innerhalb der Karte dem Radar hinzugefügt werden. Die Indikatorenauswahl umfasst dabei nur solche Indikatoren, " + + "die die gewählte Raumebene und den aktuell gewählten Zeitschnitt unterstützen.

        Auch das Radardiagramm besitzt in der oberen rechte Ecke eine " + + "Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann", + onNext: function(tour){ + if($scope.sidebarRadarDiagramClass !== "disappear"){ + $("#sidebarRadarDiagramCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarRadarDiagramClass !== "disappear"){ + $("#sidebarRadarDiagramCollapse").click(); + } + } + }, + { + element: "#sidebarRegressionDiagramCollapse", + title: "Regressionsdiagramm", + placement: "right", + content: "Ein Klick auf diesen Button öffnet das Fenster zur Definition von Regressionsdiagrammen.

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function(tour){ + if($scope.sidebarRegressionDiagramClass === "disappear"){ + $("#sidebarRegressionDiagramCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarRadarDiagramClass === "disappear"){ + $("#sidebarRadarDiagramCollapse").click(); + } + } + }, + { + element: "#indicatorRegression", + title: "Regressionsdiagramm", + placement: "right", + content: "Als exemplarischer weiterer Diagrammtyp unterstützt KomMonitor die Berechnung einer linearen Regression zwischen zwei zu wählenden Indikatoren, um insbesondere die Korrelation zwischen diesen zu betrachten. Nach Auswahl der Indikatoren werden die Regressionsgerade und alle Elemente der gewählten Raumebene gemäß ihrer Wertausprägungen entlang der Indikatorenachsen im Diagramm abgetragen.

        Beim Überfahren eines Datenpunkts mit der Maus im Diagramm oder einer in der Karte dargestellten Raumeinheit, wird das jeweilige Pendant visuell hervorgehoben.

        Die Indikatorenauswahl umfasst dabei nur solche Indikatoren, die die gewählte Raumebene und den aktuell gewählten Zeitschnitt unterstützen.

        Auch das Regressionsdiagramm besitzt in der oberen rechte Ecke eine Toolbox, über die das Diagramm entweder als Bilddatei oder im Tabellenformat exportiert werden kann.", + onNext: function(tour){ + if($scope.sidebarRegressionDiagramClass !== "disappear"){ + $("#sidebarRegressionDiagramCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarRegressionDiagramClass !== "disappear"){ + $("#sidebarRegressionDiagramCollapse").click(); + } + } + }, + { + element: "#sidebarReachabilityCollapse", + title: "Erreichbarkeitsanalysen", + placement: "right", + content: "Ein Klick auf diesen Button öffnet ein Fenster für Erreichbarkeitsanalysen.

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + onNext: function(tour){ + if($scope.sidebarReachabilityClass === "disappear"){ + $("#sidebarReachabilityCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarRegressionDiagramClass === "disappear"){ + $("#sidebarRegressionDiagramCollapse").click(); + } + } + }, + { + element: "#kommonitorReachability", + title: "Erreichbarkeitsanalysen", + placement: "right", + content: "Als GIS-basiertes Werkzeug soll KomMonitor ausgewählte räumliche Analysen unterstützen. " + + "Insbesondere stehen Erreichbarkeitsanalysen im Fokus, bei denen, neben reinen Puffer-basierten Ansätzen, " + + "Erreichbarkeiten anhand tatsächlicher Wegenetze für verschiedene Transportmittel (z.B. Fußgänger, Fahrrad, Auto) "+ + "berechnet werden können. Konkret soll hierbei sowohl ein Routing zwischen einzelnen Punkten sowie " + + "die Berechnung von Isochronen (Äquidistanzen und zeitliches Abbruchkriterium) angeboten werden.

        " + + "Auswahl der Startpunkte
        " + + "Die Auswahl der Startpunkte kann entweder über die Selektion eines vorhandenen Punktdatensatzes vorgenommen werden oder mittels Einzeichnen eigener beliebiger Punkte in die Karte.

        " + + "Ergebnisdarstellung
        " + + "Sowohl Isochronen- als auch Routingergebnisse werden der Karte als neuer, eigener Layer hinzugefügt. " + + "Die jeweilige Legende über jeweiligen Reiter des rechten Legendenmenüs einsehbar.

        "+ + "Punkt in Isochronen Analyse
        " + + "Nachdem eine Isochronenberechnung erfolgt ist, können vorhandene Punktdatensätze räumlich mit den Isochronen verschnitten werden, bspw. um eine Umfeldanalyse für relevante Einrichtungen durchzuführen.", + onNext: function(tour){ + if($scope.sidebarReachabilityClass !== "disappear"){ + $("#sidebarReachabilityCollapse").click(); + } + }, + onPrev: function(tour){ + if($scope.sidebarReachabilityClass !== "disappear"){ + $("#sidebarReachabilityCollapse").click(); + } + } + }, + { + element: "#map", + title: "Vielen Dank für die Nutzung der Guided Tour von KomMonitor!", + placement: "left", + content: "Wir hoffen, die Erläuterungen konnten einen guten Einblick in die Funktionen bieten, " + + "bei der ersten Orientierung helfen und die zukünftige Nutzung erleichtern!

        " + + "Kritik, Anregungen oder Fragen sind jederzeit willkommen.
        (siehe Begrüßungsfenster für den Kontakt).

        " + + "Viel Spaß bei der Nutzung von KomMonitor! ", + onNext: function(tour){ + kommonitorDataExchangeService.guidedTour = undefined; // ends the tour + } + } + // { + // element: "#sidebarProcessingCollapse", + // title: "Individuelle Indikatoren-Neuberechnung", + // placement: "right", + // content: "Ein Klick auf diesen Button öffnet ein Fenster zur individuellen Neuberechnung einzelner Indikatoren.

        Im nächsten Schritt wird das Menü automatisch geöffnet.", + // onNext: function(tour){ + // if($scope.sidebarProcessingClass === "disappear"){ + // $("#sidebarProcessingCollapse").click(); + // } + // }, + // onPrev: function(tour){ + // if($scope.sidebarReachabilityClass === "disappear"){ + // $("#sidebarReachabilityCollapse").click(); + // } + // } + // }, + // { + // element: "#indicatorProcessing", + // title: "Individuelle Indikatoren-Neuberechnung", + // placement: "right", + // content: "KomMonitor ist mehr als nur ein Darstellungswerkzeug. Es ermöglicht insbesondere auch die automatisierte Berechnung von Indikatoren. Je nach Berechnungsvorschrift kann es dabei konfigurierbare Parameter geben, die die resultierenden Indikatorenwerte beeinflussen (bspw. eine maximle Distanz bei Erreichbarkeiten oder Gewichtungen grundlegender Eingangsdaten).

        Dieses Menü bietet die Möglichkeit einer Nutzer-definierten Neuberechnung von Indikatoren mit mindestens einem konfigurierbaren Parameter. Das jeweilige Berechnungsergebnis steht anschließend temporär zur Verfügung und kann bei Bedarf exportiert werden.

        Künftig sollen darüber hinaus unmittelbare Vergleiche mit der 'Standard'-Variante des Indikators angeboten werden. Diese sind jedoch zum gegenwärtigen Zeitpunkt noch nicht in der Anwendung umgesetzt.", + // onNext: function(tour){ + // if($scope.sidebarProcessingClass !== "disappear"){ + // $("#sidebarProcessingCollapse").click(); + // } + // }, + // onPrev: function(tour){ + // if($scope.sidebarProcessingClass !== "disappear"){ + // $("#sidebarProcessingCollapse").click(); + // } + // } + // } + ], + onShown: function(tour) { + // add shortcut to toc to each title + let titleElement = document.getElementsByClassName("popover-title").item(0); + titleElement.innerHTML += + "" + + ""; + $compile(titleElement)($scope); // let angularjs know that there is new html, add the ng-click event + } + }; + + $scope.generateTableOfContent = function() { + let prevStepTitle = undefined; + for(var i=0;i<$scope.tourOptions.steps.length;i++) { + let step = $scope.tourOptions.steps[i]; + // only show the first guided tour step for each subtheme + // specifically exclude "Individuelle Indikatoren-Neuberechnung" for now as it is not shown in the guided tour + if (step.title !== prevStepTitle && step.title !== "Individuelle Indikatoren-Neuberechnung") { + let html = "
      1. " + step.title + "
      2. "; + let compiled = $compile(html)($scope); // let angularjs know that there is new html, add the ng-click event + angular.element(document.getElementById('guided-tour-toc')).append(compiled); + } + prevStepTitle = step.title; + } + }; + + $scope.goToGuidedTourStep = function(tour, targetStepIndex) { + // The method "goTo" provided by the library jumps directly to the target step, ignoring the "onNext" and "onPrev" methods. + // That leads to menues not being opened/closed. To fix this we iterate the steps manually. + while(tour.getCurrentStep() < targetStepIndex) + tour.next(); + while(tour.getCurrentStep() > targetStepIndex) + tour.prev(); + }; + + $scope.startGuidedTour = function(){ + // GUIDED TOUR + // Instance the tour + kommonitorDataExchangeService.guidedTour = new Tour($scope.tourOptions); + + // Initialize the tour + kommonitorDataExchangeService.guidedTour.init(); + // Start the tour + try{ + kommonitorDataExchangeService.guidedTour.restart(); + } + catch(error){ + kommonitorDataExchangeService.guidedTour.start(true); + } + + // tour gotTo() example to jump to step 7 --> index starts from 0 + // kommonitorDataExchangeService.guidedTour.goTo(6); + + }; + + $scope.$on("redrawGuidedTourElement", async function(event){ + + await sleep(100); + + if(kommonitorDataExchangeService.guidedTour){ + kommonitorDataExchangeService.guidedTour.redraw(); + } + }); + + $scope.init(); + + } +]}); diff --git a/app/components/kommonitorUserInterface/kommonitor-user-interface.module.js b/app/components/kommonitorUserInterface/kommonitor-user-interface.module.js index 3f277716e..310280377 100644 --- a/app/components/kommonitorUserInterface/kommonitor-user-interface.module.js +++ b/app/components/kommonitorUserInterface/kommonitor-user-interface.module.js @@ -1,4 +1,6 @@ +"use strict"; angular.module('kommonitorUserInterface', ['kommonitorMap', 'kommonitorDataSetup', 'kommonitorAdmin', - 'kommonitorIndividualIndicatorComputation', 'kommonitorDiagrams', 'indicatorRadar', 'regressionDiagram', 'kommonitorFilter', 'kommonitorBalance', - 'kommonitorReachability', 'poi', 'infoModal', 'spatialUnitNotificationModal', 'feedbackModal', 'reportingModal', 'wmsModal', 'wfsModal', 'kommonitorDataImport', - 'kommonitorLegend', 'kommonitorElementVisibilityHelper', 'kommonitorShareHelper']); + 'kommonitorIndividualIndicatorComputation', 'kommonitorDiagrams', 'indicatorRadar', 'regressionDiagram', 'kommonitorFilter', 'kommonitorBalance', + 'kommonitorReachability', 'poi', 'infoModal', 'spatialUnitNotificationModal', 'feedbackModal', 'reportingModal', 'wmsModal', 'wfsModal', 'kommonitorDataImport', + 'kommonitorLegend', 'kommonitorElementVisibilityHelper', 'kommonitorShareHelper']); +//# sourceMappingURL=kommonitor-user-interface.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitor-user-interface.module.js.map b/app/components/kommonitorUserInterface/kommonitor-user-interface.module.js.map new file mode 100644 index 000000000..6a0d84fa9 --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitor-user-interface.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-user-interface.module.js","sourceRoot":"","sources":["kommonitor-user-interface.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,eAAe,EAAE,qBAAqB,EAAE,iBAAiB;IAClG,0CAA0C,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,mBAAmB;IAChJ,wBAAwB,EAAE,KAAK,EAAE,WAAW,EAAE,8BAA8B,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,sBAAsB;IAC/J,kBAAkB,EAAE,mCAAmC,EAAE,uBAAuB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitor-user-interface.module.ts b/app/components/kommonitorUserInterface/kommonitor-user-interface.module.ts new file mode 100644 index 000000000..3f277716e --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitor-user-interface.module.ts @@ -0,0 +1,4 @@ +angular.module('kommonitorUserInterface', ['kommonitorMap', 'kommonitorDataSetup', 'kommonitorAdmin', + 'kommonitorIndividualIndicatorComputation', 'kommonitorDiagrams', 'indicatorRadar', 'regressionDiagram', 'kommonitorFilter', 'kommonitorBalance', + 'kommonitorReachability', 'poi', 'infoModal', 'spatialUnitNotificationModal', 'feedbackModal', 'reportingModal', 'wmsModal', 'wfsModal', 'kommonitorDataImport', + 'kommonitorLegend', 'kommonitorElementVisibilityHelper', 'kommonitorShareHelper']); diff --git a/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.js b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.js index 561a9f63b..c03d4a88d 100644 --- a/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.js +++ b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.js @@ -1,135 +1,110 @@ +"use strict"; angular.module('feedbackModal').component('feedbackModal', { - templateUrl : "components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.template.html", - controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '__env', '$http', function FeedbackModalController(kommonitorDataExchangeService, $scope, $rootScope, __env, $http) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - const feedbackMailRecipient = __env.feedbackMailRecipient; - const emailURL = __env.targetUrlToProcessingEngine + "feedback-mail"; - - // $scope.titel; - $scope.organization; - $scope.contactDetails; - $scope.feedbackType = undefined; - $scope.feedbackContent; - $scope.like = undefined; - $scope.attachment = undefined; - document.getElementById("attachment").value = ""; - - $scope.error = undefined; - $scope.success = undefined; - - var fileToBase64 = (file) => { - return new Promise(resolve => { - var reader = new FileReader(); - // Read file content on file loaded event - reader.onload = function(event) { - resolve(event.target.result); - }; - - // Convert data to base64 - reader.readAsDataURL(file); - }); - }; - - $scope.onSubmit = async function(){ - // var body = "Titel: " + $scope.titel + "\n"; - var body = "Fachbereich/Organisation: " + $scope.organization + "\n\n"; - body += "Kontaktdaten: " + $scope.contactDetails + "\n\n"; - body += "Feedback Typ: " + $scope.feedbackType + "\n\n"; - body += "Feedback Inhalt: " + $scope.feedbackContent + "\n\n"; - body += "KomMonitor Bewertung: " + $scope.like + "\n\n"; - - // var blobFile = $('#attachment').files[0]; - var files = document.getElementById('attachment').files; - if(files.length > 0){ - var uploadFile = files[0]; - var base64 = await fileToBase64(uploadFile); - $scope.attachment = base64; - } - - - // var formData = undefined; - // - // if(files.length > 0){ - // formData = new FormData(); - // - // for (var i = 0; i < files.length; i++) { - // formData.append("files[]", files[i]); - // } - // - // } - - var mailInput = {}; - mailInput.recipientMail = feedbackMailRecipient; - mailInput.subject = "KomMonitor - Feedback"; - mailInput.body = body; - mailInput.attachment = $scope.attachment; - - $scope.sendMail(mailInput); - }; - - $scope.sendMail = function(mailInput){ - - if(! $scope.validate()){ - return; - } - - $scope.error = undefined; - $scope.success = undefined; - - $http({ - url: emailURL, - method: "POST", - data: mailInput - }).then(function successCallback(response) { - - $scope.error = undefined; - $scope.success = true; - - $("#mailSuccessInfo").show(); - - // auto-close after 3 seconds - // setTimeout(function() { - // $("#mailSuccessInfo").alert('close'); - // }, 3000); - - }, function errorCallback(error) { - - $scope.error = error; - $scope.success = undefined; - - $("#mailErrorInfo").show(); - }); - } - - $scope.onCloseSuccessAlert = function(){ - $("#mailSuccessInfo").hide(); - }; - - $scope.onCloseErrorAlert = function(){ - $("#mailErrorInfo").hide(); - }; - - $scope.validate = function(){ - if ($scope.feedbackType && $scope.feedbackContent){ - return true; - } - return false; - } - - $scope.reset = function(){ - $scope.organization = undefined; - $scope.contactDetails = undefined; - $scope.feedbackType = undefined; - $scope.feedbackContent = undefined; - $scope.like = undefined; - $scope.attachment = undefined; - document.getElementById("attachment").value = ""; - - $scope.error = undefined; - $scope.success = undefined; - } - - } -]}); + templateUrl: "components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.template.html", + controller: ['kommonitorDataExchangeService', '$scope', '$rootScope', '__env', '$http', function FeedbackModalController(kommonitorDataExchangeService, $scope, $rootScope, __env, $http) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + const feedbackMailRecipient = __env.feedbackMailRecipient; + const emailURL = __env.targetUrlToProcessingEngine + "feedback-mail"; + // $scope.titel; + $scope.organization; + $scope.contactDetails; + $scope.feedbackType = undefined; + $scope.feedbackContent; + $scope.like = undefined; + $scope.attachment = undefined; + document.getElementById("attachment").value = ""; + $scope.error = undefined; + $scope.success = undefined; + var fileToBase64 = (file) => { + return new Promise(resolve => { + var reader = new FileReader(); + // Read file content on file loaded event + reader.onload = function (event) { + resolve(event.target.result); + }; + // Convert data to base64 + reader.readAsDataURL(file); + }); + }; + $scope.onSubmit = async function () { + // var body = "Titel: " + $scope.titel + "\n"; + var body = "Fachbereich/Organisation: " + $scope.organization + "\n\n"; + body += "Kontaktdaten: " + $scope.contactDetails + "\n\n"; + body += "Feedback Typ: " + $scope.feedbackType + "\n\n"; + body += "Feedback Inhalt: " + $scope.feedbackContent + "\n\n"; + body += "KomMonitor Bewertung: " + $scope.like + "\n\n"; + // var blobFile = $('#attachment').files[0]; + var files = document.getElementById('attachment').files; + if (files.length > 0) { + var uploadFile = files[0]; + var base64 = await fileToBase64(uploadFile); + $scope.attachment = base64; + } + // var formData = undefined; + // + // if(files.length > 0){ + // formData = new FormData(); + // + // for (var i = 0; i < files.length; i++) { + // formData.append("files[]", files[i]); + // } + // + // } + var mailInput = {}; + mailInput.recipientMail = feedbackMailRecipient; + mailInput.subject = "KomMonitor - Feedback"; + mailInput.body = body; + mailInput.attachment = $scope.attachment; + $scope.sendMail(mailInput); + }; + $scope.sendMail = function (mailInput) { + if (!$scope.validate()) { + return; + } + $scope.error = undefined; + $scope.success = undefined; + $http({ + url: emailURL, + method: "POST", + data: mailInput + }).then(function successCallback(response) { + $scope.error = undefined; + $scope.success = true; + $("#mailSuccessInfo").show(); + // auto-close after 3 seconds + // setTimeout(function() { + // $("#mailSuccessInfo").alert('close'); + // }, 3000); + }, function errorCallback(error) { + $scope.error = error; + $scope.success = undefined; + $("#mailErrorInfo").show(); + }); + }; + $scope.onCloseSuccessAlert = function () { + $("#mailSuccessInfo").hide(); + }; + $scope.onCloseErrorAlert = function () { + $("#mailErrorInfo").hide(); + }; + $scope.validate = function () { + if ($scope.feedbackType && $scope.feedbackContent) { + return true; + } + return false; + }; + $scope.reset = function () { + $scope.organization = undefined; + $scope.contactDetails = undefined; + $scope.feedbackType = undefined; + $scope.feedbackContent = undefined; + $scope.like = undefined; + $scope.attachment = undefined; + document.getElementById("attachment").value = ""; + $scope.error = undefined; + $scope.success = undefined; + }; + } + ] +}); +//# sourceMappingURL=feedback-modal.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.js.map b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.js.map new file mode 100644 index 000000000..7b30005e1 --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"feedback-modal.component.js","sourceRoot":"","sources":["feedback-modal.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.ts b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.ts new file mode 100644 index 000000000..561a9f63b --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.component.ts @@ -0,0 +1,135 @@ +angular.module('feedbackModal').component('feedbackModal', { + templateUrl : "components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.template.html", + controller : ['kommonitorDataExchangeService', '$scope', '$rootScope', '__env', '$http', function FeedbackModalController(kommonitorDataExchangeService, $scope, $rootScope, __env, $http) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + const feedbackMailRecipient = __env.feedbackMailRecipient; + const emailURL = __env.targetUrlToProcessingEngine + "feedback-mail"; + + // $scope.titel; + $scope.organization; + $scope.contactDetails; + $scope.feedbackType = undefined; + $scope.feedbackContent; + $scope.like = undefined; + $scope.attachment = undefined; + document.getElementById("attachment").value = ""; + + $scope.error = undefined; + $scope.success = undefined; + + var fileToBase64 = (file) => { + return new Promise(resolve => { + var reader = new FileReader(); + // Read file content on file loaded event + reader.onload = function(event) { + resolve(event.target.result); + }; + + // Convert data to base64 + reader.readAsDataURL(file); + }); + }; + + $scope.onSubmit = async function(){ + // var body = "Titel: " + $scope.titel + "\n"; + var body = "Fachbereich/Organisation: " + $scope.organization + "\n\n"; + body += "Kontaktdaten: " + $scope.contactDetails + "\n\n"; + body += "Feedback Typ: " + $scope.feedbackType + "\n\n"; + body += "Feedback Inhalt: " + $scope.feedbackContent + "\n\n"; + body += "KomMonitor Bewertung: " + $scope.like + "\n\n"; + + // var blobFile = $('#attachment').files[0]; + var files = document.getElementById('attachment').files; + if(files.length > 0){ + var uploadFile = files[0]; + var base64 = await fileToBase64(uploadFile); + $scope.attachment = base64; + } + + + // var formData = undefined; + // + // if(files.length > 0){ + // formData = new FormData(); + // + // for (var i = 0; i < files.length; i++) { + // formData.append("files[]", files[i]); + // } + // + // } + + var mailInput = {}; + mailInput.recipientMail = feedbackMailRecipient; + mailInput.subject = "KomMonitor - Feedback"; + mailInput.body = body; + mailInput.attachment = $scope.attachment; + + $scope.sendMail(mailInput); + }; + + $scope.sendMail = function(mailInput){ + + if(! $scope.validate()){ + return; + } + + $scope.error = undefined; + $scope.success = undefined; + + $http({ + url: emailURL, + method: "POST", + data: mailInput + }).then(function successCallback(response) { + + $scope.error = undefined; + $scope.success = true; + + $("#mailSuccessInfo").show(); + + // auto-close after 3 seconds + // setTimeout(function() { + // $("#mailSuccessInfo").alert('close'); + // }, 3000); + + }, function errorCallback(error) { + + $scope.error = error; + $scope.success = undefined; + + $("#mailErrorInfo").show(); + }); + } + + $scope.onCloseSuccessAlert = function(){ + $("#mailSuccessInfo").hide(); + }; + + $scope.onCloseErrorAlert = function(){ + $("#mailErrorInfo").hide(); + }; + + $scope.validate = function(){ + if ($scope.feedbackType && $scope.feedbackContent){ + return true; + } + return false; + } + + $scope.reset = function(){ + $scope.organization = undefined; + $scope.contactDetails = undefined; + $scope.feedbackType = undefined; + $scope.feedbackContent = undefined; + $scope.like = undefined; + $scope.attachment = undefined; + document.getElementById("attachment").value = ""; + + $scope.error = undefined; + $scope.success = undefined; + } + + } +]}); diff --git a/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.js b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.js index 57061d6ab..e000de570 100644 --- a/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.js +++ b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.js @@ -1,14 +1,15 @@ +"use strict"; angular.module('feedbackModal', []); - // custom directive to read files and parse them to ngModel -angular.module("feedbackModal").directive("selectNgFiles", function() { - return { - require: "ngModel", - link: function postLink(scope,elem,attrs,ngModel) { - elem.on("change", function(e) { - var files = elem[0].files; - ngModel.$setViewValue(files); - }) - } - } +angular.module("feedbackModal").directive("selectNgFiles", function () { + return { + require: "ngModel", + link: function postLink(scope, elem, attrs, ngModel) { + elem.on("change", function (e) { + var files = elem[0].files; + ngModel.$setViewValue(files); + }); + } + }; }); +//# sourceMappingURL=feedback-modal.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.js.map b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.js.map new file mode 100644 index 000000000..78f70d9c4 --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"feedback-modal.module.js","sourceRoot":"","sources":["feedback-modal.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;AAEpC,2DAA2D;AAC3D,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,eAAe,EAAE;IACzD,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS,QAAQ,CAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO;YAC9C,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAS,CAAC;gBAC1B,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC1B,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.ts b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.ts new file mode 100644 index 000000000..57061d6ab --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/feedbackModal/feedback-modal.module.ts @@ -0,0 +1,14 @@ +angular.module('feedbackModal', []); + +// custom directive to read files and parse them to ngModel +angular.module("feedbackModal").directive("selectNgFiles", function() { + return { + require: "ngModel", + link: function postLink(scope,elem,attrs,ngModel) { + elem.on("change", function(e) { + var files = elem[0].files; + ngModel.$setViewValue(files); + }) + } + } +}); diff --git a/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.js b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.js index 95cceef81..57b899a81 100644 --- a/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.js +++ b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.js @@ -1,612 +1,484 @@ +"use strict"; angular - .module('indicatorRadar') - .component( - 'indicatorRadar', - { - templateUrl: "components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.template.html", - - controller: [ - 'kommonitorDataExchangeService', 'kommonitorDiagramHelperService', 'kommonitorFilterHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', - function indicatorRadarController( - kommonitorDataExchangeService, kommonitorDiagramHelperService, kommonitorFilterHelperService, $scope, $rootScope, $timeout, $http, __env) { - /* - * reference to kommonitorDataExchangeService instances - */ - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - this.kommonitorDiagramHelperServiceInstance = kommonitorDiagramHelperService; - - var self = this; - - $scope.activeTab = 0; - - // initialize any adminLTE box widgets - $('.box').boxWidget(); - - $(window).on('resize', function () { - if ($scope.radarChart != null && $scope.radarChart != undefined) { - $scope.radarChart.resize(); - } - }); - - $scope.$on("resizeDiagrams", function (event) { - - setTimeout(function () { - if ($scope.radarChart != null && $scope.radarChart != undefined) { - $scope.radarChart.resize(); - } - }, 350); - }); - - const DATE_PREFIX = __env.indicatorDatePrefix; - - $scope.indicatorNameFilter = undefined; - - $scope.eventsRegistered = false; - - var numberOfDecimals = __env.numberOfDecimals; - - $scope.setupCompleted = true; - - $scope.onChangeFilterSameUnitAndSameTime = function(){ - if($scope.radarChart){ - $scope.radarChart.dispose(); - $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); - } - kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime = []; - - kommonitorDiagramHelperService.setupIndicatorPropertiesForCurrentSpatialUnitAndTime(kommonitorDiagramHelperService.filterSameUnitAndSameTime); - }; - - $scope.date; - $scope.spatialUnitName; - - $scope.$on("updateDiagrams", function (event, indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, justRestyling) { - - // if the layer is just restyled (i.e. due to change of measureOfValue) - // then we do not need to costly update the radar diagram - if (justRestyling) { - return; - } - - console.log("updating radar diagram"); - - $scope.setupCompleted = false; - - updateRadarChart(indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date); - - $rootScope.$broadcast("preserveHighlightedFeatures"); - - }); - - // RADAR CHART TIME SERIES FUNCTION - var updateRadarChart = async function (indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date) { - // based on prepared DOM, initialize echarts instance - $scope.date = date; - $scope.spatialUnitName = spatialUnitName; - - if (!$scope.radarChart) - $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); - else { - // explicitly kill and reinstantiate radar diagram to avoid zombie states on spatial unit change - $scope.radarChart.dispose(); - $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); - kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime = new Array(); - } - - await $scope.radarChart.showLoading(); - - kommonitorDiagramHelperService.setupIndicatorPropertiesForCurrentSpatialUnitAndTime(); - - $scope.activeTab = 0; - if(kommonitorDataExchangeService.selectedIndicator.creationType == "COMPUTATION"){ - $scope.activeTab = 1; - } - if(kommonitorDataExchangeService.selectedIndicator.isHeadlineIndicator){ - $scope.activeTab = 2; - } - - modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); - }; - - $scope.onChangeSelectedDate = function(input){ - if(input.isSelected){ - modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); - } - }; - - var wait = ms => new Promise((r, j) => setTimeout(r, ms)); - - $scope.$on("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup begin", async function (event) { - - await wait(130); - $scope.setupCompleted = false; - - - $timeout(function(){ - $scope.$digest(); - }, 500); - - }); - - $scope.$on("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup completed", async function (event) { - - await wait(130); - $scope.setupCompleted = true; - - - $timeout(function(){ - $scope.$digest(); - self.filterDisplayedIndicatorsOnRadar(); - }, 500); - - }); - - var modifyRadarContent = async function (indicatorsForRadar) { - var indicatorArrayForRadarChart = new Array(); - var defaultSeriesValueArray = new Array(); - - var sampleProperties = null; - - for (var i = 0; i < indicatorsForRadar.length; i++) { - if (indicatorsForRadar[i].isSelected) { - - await kommonitorDiagramHelperService.fetchIndicatorPropertiesIfNotExists(i); - - // make object to hold indicatorName, max value and average value - var indicatorProperties = indicatorsForRadar[i].indicatorProperties; - - if(kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay && kommonitorFilterHelperService.filteredIndicatorFeatureIds.size > 0){ - indicatorProperties = indicatorProperties.filter(featureProperties => ! kommonitorFilterHelperService.featureIsCurrentlyFiltered(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])); - } - - sampleProperties = indicatorsForRadar[i].indicatorProperties; - - // var closestApplicableTimestamp = kommonitorDiagramHelperService.findClostestTimestamForTargetDate(indicatorsForRadar[i], $scope.date); - // indicatorsForRadar[i].closestTimestamp = closestApplicableTimestamp; - - var sample = indicatorProperties[0]; - var maxValue = sample[DATE_PREFIX + indicatorsForRadar[i].selectedDate]; - var minValue = sample[DATE_PREFIX + indicatorsForRadar[i].selectedDate]; - var valueSum = 0; - - for (var indicatorPropertyInstance of indicatorProperties) { - // for average only apply real numeric values - if (!kommonitorDataExchangeService.indicatorValueIsNoData(indicatorPropertyInstance[DATE_PREFIX + indicatorsForRadar[i].selectedDate])) { - var value = kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(indicatorPropertyInstance, indicatorsForRadar[i].selectedDate) - valueSum += value; - - if (value > maxValue) - maxValue = value; - - if (value < minValue) - minValue = value; - } - } - - if (minValue == null) { - minValue = 0; - } - - if (maxValue == null) { - maxValue = 1; - } - - // IT MIGHT HAPPEN THAT AN INDICATOR IS INSPECTED THAT DOES NOT SUPPORT THE DATE - // HENCE ONLY ADD VALUES TO DEFAULT IF THEY SHOW MEANINGFUL VALUES - // if(valueSum != null){ - indicatorArrayForRadarChart.push({ - name: indicatorsForRadar[i].indicatorMetadata.indicatorName + " - " + indicatorsForRadar[i].selectedDate, - unit: indicatorsForRadar[i].indicatorMetadata.unit, - max: maxValue, - min: minValue - }); - - defaultSeriesValueArray.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(Number(valueSum / indicatorProperties.length))); - // } - } - - } - - if (defaultSeriesValueArray.length === 0) { - - if ($scope.radarChart) { - $scope.radarChart.dispose(); - $scope.radarChart = undefined; - } - - } - else { - - if (!$scope.radarChart) - $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); - // else{ - // // explicitly kill and reinstantiate radar diagram to avoid zombie states on spatial unit change - // $scope.radarChart.dispose(); - // $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); - // } - - $scope.radarOption = { - grid: { - left: '4%', - top: 0, - right: '4%', - bottom: 30, - containLabel: true - }, - title: { - text: 'Indikatorenradar - ' + $scope.spatialUnitName + ' - ' + $scope.date, - left: 'center', - top: 0, - show: false - }, - tooltip: { - confine: 'true', - formatter: function (params) { - - var string = "" + params.name + "
        "; - - for (var index = 0; index < params.value.length; index++) { - string += $scope.radarOption.radar.indicator[index].name + ": " + kommonitorDataExchangeService.getIndicatorValue_asFormattedText(params.value[index]) + " [" + $scope.radarOption.radar.indicator[index].unit + "]
        "; - }; - - return string; - } - // position: ['50%', '50%'] - }, - toolbox: { - show: true, - right: '15', - feature: { - // mark : {show: true}, - dataView: { - show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Indikatorenradar', 'schließen', 'refresh'], optionToContent: function (opt) { - - // - // - // - // - // - // - // - // - // - // - // - // - // - //
        Indikator-NameBeschreibung der Verknüpfung
        {{indicator.referencedIndicatorName}}{{indicator.referencedIndicatorDescription}}
        - - var radarSeries = opt.series[0].data; - var indicators = opt.radar[0].indicator; - - var dataTableId = "radarDataTable"; - var tableExportName = opt.title[0].text; - - var htmlString = ''; - htmlString += ""; - htmlString += ""; - htmlString += ""; - - for (var i = 0; i < indicators.length; i++) { - htmlString += ""; - } - - htmlString += ""; - htmlString += ""; - - htmlString += ""; - - - - for (var j = 0; j < radarSeries.length; j++) { - htmlString += ""; - htmlString += ""; - for (var k = 0; k < indicators.length; k++) { - htmlString += ""; - } - htmlString += ""; - } - - htmlString += ""; - htmlString += "
        Feature-Name" + indicators[i].name + " [" + indicators[i].unit + "]
        " + radarSeries[j].name + "" + kommonitorDataExchangeService.getIndicatorValue_asNumber(radarSeries[j].value[k]) + "
        "; - - $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); - - return htmlString; - } - }, - restore: { show: false, title: "Darstellung erneuern" }, - saveAsImage: { show: true, title: "Export", pixelRatio: 4 } - } - }, - legend: { - type: "scroll", - bottom: 0, - align: 'left', - left: 5, - data: ['Arithmetisches Mittel'] - }, - radar: { - // shape: 'circle', - // name: { - // textStyle: { - // color: '#fff', - // backgroundColor: '#999', - // borderRadius: 3, - // padding: [3, 5] - // } - // }, - name: { - formatter: function (value, indicator) { - - return kommonitorDataExchangeService.formatIndicatorNameForLabel(value, 15); - }, - textStyle: { - color: '#525252' - }, - fontSize: 11 - }, - indicator: indicatorArrayForRadarChart - }, - series: [{ - name: 'Indikatorvergleich', - type: 'radar', - symbolSize: 8, - data: [ - { - value: defaultSeriesValueArray, - name: 'Arithmetisches Mittel', - lineStyle: { - color: 'gray', - type: 'dashed', - width: 3 - }, - itemStyle: { - borderWidth: 2, - color: 'gray' - }, - emphasis: { - lineStyle: { - width: 4 - }, - itemStyle: { - borderType: 'dashed' - } - } - } - ] - }] - }; - - // check if any feature is still clicked/selected - // then append those as series within radar chart - appendSelectedFeaturesIfNecessary(sampleProperties); - - // use configuration item and data specified to show chart - $scope.radarChart.setOption($scope.radarOption); - - $scope.radarChart.hideLoading(); - setTimeout(function () { - $scope.radarChart.resize(); - $scope.$digest(); - }, 350); - registerEventsIfNecessary(); - - } - - } - - var appendSelectedFeaturesIfNecessary = function (sampleProperties) { - - for (var propertiesInstance of sampleProperties) { - if (kommonitorFilterHelperService.featureIsCurrentlySelected(propertiesInstance[__env.FEATURE_ID_PROPERTY_NAME])) { - appendSeriesToRadarChart(propertiesInstance); - } - } - }; - - function registerEventsIfNecessary() { - if (!$scope.eventsRegistered) { - // when hovering over elements of the chart then highlight them in the map. - $scope.radarChart.on('mouseOver', function (params) { - // $scope.userHoveresOverItem = true; - var spatialFeatureName = params.data.name; - // console.log(spatialFeatureName); - if(spatialFeatureName){ - $rootScope.$broadcast("highlightFeatureOnMap", spatialFeatureName); - } - - }); - - $scope.radarChart.on('mouseOut', function (params) { - // $scope.userHoveresOverItem = false; - - var spatialFeatureName = params.data.name; - // console.log(spatialFeatureName); - if(spatialFeatureName){ - $rootScope.$broadcast("unhighlightFeatureOnMap", spatialFeatureName); - } - - }); - - //disable feature removal for radar chart - seems to be unintuititve - // $scope.radarChart.on('click', function(params){ - // var spatialFeatureName = params.data.name; - // // console.log(spatialFeatureName); - // if(spatialFeatureName){ - // $rootScope.$broadcast("switchHighlightFeatureOnMap", spatialFeatureName); - // } - // }); - - $scope.eventsRegistered = true; - } - }; - - - $scope.$on("updateDiagramsForHoveredFeature", function (event, featureProperties) { - - if (!$scope.radarChart || !$scope.radarOption || !$scope.radarOption.legend || !$scope.radarOption.series) { - return; - } - - if (!kommonitorFilterHelperService.featureIsCurrentlySelected(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])) { - appendSeriesToRadarChart(featureProperties); - } - - highlightFeatureInRadarChart(featureProperties); - }); - - var appendSeriesToRadarChart = function (featureProperties) { - // append feature name to legend - $scope.radarOption.legend.data.push(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - - // create feature data series - var featureSeries = {}; - featureSeries.name = featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]; - featureSeries.value = new Array(); - featureSeries.emphasis = { - lineStyle: { - width: 4, - type: 'dotted' - } - }; - featureSeries.lineStyle = { - width: 3, - type: 'solid' - }; - featureSeries.itemStyle = { - borderWidth: 2 - }; - - - // for each indicator create series data entry for feature - for (var i = 0; i < kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime.length; i++) { - if (kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].isSelected) { - // make object to hold indicatorName, max value and average value - var indicatorProperties = kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].indicatorProperties; - var date = kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].selectedDate; - - for (var indicatorPropertyInstance of indicatorProperties) { - if (indicatorPropertyInstance[__env.FEATURE_NAME_PROPERTY_NAME] == featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]) { - if (!kommonitorDataExchangeService.indicatorValueIsNoData(indicatorPropertyInstance[DATE_PREFIX + date])) { - featureSeries.value.push(kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(indicatorPropertyInstance, date)); - } - else { - featureSeries.value.push(null); - } - break; - } - } - } - - } - - $scope.radarOption.series[0].data.push(featureSeries); - - $scope.radarChart.setOption($scope.radarOption); - setTimeout(function () { - $scope.radarChart.resize(); - }, 350); - registerEventsIfNecessary(); - }; - - var highlightFeatureInRadarChart = function (featureProperties) { - // highlight the corresponding bar diagram item - // get series index of series - var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - - if (dataIndex > -1) { - $scope.radarChart.dispatchAction({ - type: 'highlight', - seriesIndex: 0, - dataIndex: dataIndex - }); - } - }; - - $scope.$on("updateDiagramsForUnhoveredFeature", function (event, featureProperties) { - - if (!$scope.radarChart || !$scope.radarOption || !$scope.radarOption.legend || !$scope.radarOption.series) { - return; - } - - unhighlightFeatureInRadarChart(featureProperties); - - if (!kommonitorFilterHelperService.featureIsCurrentlySelected(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])) { - removeSeriesFromRadarChart(featureProperties); - } - }); - - var getSeriesDataIndexByFeatureName = function (featureName) { - for (var index = 0; index < $scope.radarOption.series[0].data.length; index++) { - if ($scope.radarOption.series[0].data[index].name == featureName) - return index; - } - - //return -1 if none was found - return -1; - }; - - var removeSeriesFromRadarChart = function (featureProperties) { - // remove feature from legend - var legendIndex = $scope.radarOption.legend.data.indexOf(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - if (legendIndex > -1) { - $scope.radarOption.legend.data.splice(legendIndex, 1); - } - - // remove feature data series - var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - if (dataIndex > -1) { - $scope.radarOption.series[0].data.splice(dataIndex, 1); - } - - // second parameter tells echarts to not merge options with previous data. hence really remove series from graphic - $scope.radarChart.setOption($scope.radarOption, true); - setTimeout(function () { - $scope.radarChart.resize(); - }, 350); - registerEventsIfNecessary(); - }; - - var unhighlightFeatureInRadarChart = function (featureProperties) { - // highlight the corresponding bar diagram item - // get series index of series - var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - - if (dataIndex > -1) { - $scope.radarChart.dispatchAction({ - type: 'downplay', - seriesIndex: 0, - dataIndex: dataIndex - }); - } - }; - - this.filterDisplayedIndicatorsOnRadar = function () { - console.log("Filtering indicator radar"); - - modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); - - } - - this.selectAllIndicatorsForRadar = function () { - - for (var indicator of kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime) { - indicator.isSelected = true; - } - - modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); - } - - this.deselectAllIndicatorsForRadar = function () { - - for (var indicator of kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime) { - indicator.isSelected = false; - } - - modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); - } - - - }] - }); + .module('indicatorRadar') + .component('indicatorRadar', { + templateUrl: "components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.template.html", + controller: [ + 'kommonitorDataExchangeService', 'kommonitorDiagramHelperService', 'kommonitorFilterHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', + function indicatorRadarController(kommonitorDataExchangeService, kommonitorDiagramHelperService, kommonitorFilterHelperService, $scope, $rootScope, $timeout, $http, __env) { + /* + * reference to kommonitorDataExchangeService instances + */ + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorDiagramHelperServiceInstance = kommonitorDiagramHelperService; + var self = this; + $scope.activeTab = 0; + // initialize any adminLTE box widgets + $('.box').boxWidget(); + $(window).on('resize', function () { + if ($scope.radarChart != null && $scope.radarChart != undefined) { + $scope.radarChart.resize(); + } + }); + $scope.$on("resizeDiagrams", function (event) { + setTimeout(function () { + if ($scope.radarChart != null && $scope.radarChart != undefined) { + $scope.radarChart.resize(); + } + }, 350); + }); + const DATE_PREFIX = __env.indicatorDatePrefix; + $scope.indicatorNameFilter = undefined; + $scope.eventsRegistered = false; + var numberOfDecimals = __env.numberOfDecimals; + $scope.setupCompleted = true; + $scope.onChangeFilterSameUnitAndSameTime = function () { + if ($scope.radarChart) { + $scope.radarChart.dispose(); + $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + } + kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime = []; + kommonitorDiagramHelperService.setupIndicatorPropertiesForCurrentSpatialUnitAndTime(kommonitorDiagramHelperService.filterSameUnitAndSameTime); + }; + $scope.date; + $scope.spatialUnitName; + $scope.$on("updateDiagrams", function (event, indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, justRestyling) { + // if the layer is just restyled (i.e. due to change of measureOfValue) + // then we do not need to costly update the radar diagram + if (justRestyling) { + return; + } + console.log("updating radar diagram"); + $scope.setupCompleted = false; + updateRadarChart(indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date); + $rootScope.$broadcast("preserveHighlightedFeatures"); + }); + // RADAR CHART TIME SERIES FUNCTION + var updateRadarChart = async function (indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date) { + // based on prepared DOM, initialize echarts instance + $scope.date = date; + $scope.spatialUnitName = spatialUnitName; + if (!$scope.radarChart) + $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + else { + // explicitly kill and reinstantiate radar diagram to avoid zombie states on spatial unit change + $scope.radarChart.dispose(); + $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime = new Array(); + } + await $scope.radarChart.showLoading(); + kommonitorDiagramHelperService.setupIndicatorPropertiesForCurrentSpatialUnitAndTime(); + $scope.activeTab = 0; + if (kommonitorDataExchangeService.selectedIndicator.creationType == "COMPUTATION") { + $scope.activeTab = 1; + } + if (kommonitorDataExchangeService.selectedIndicator.isHeadlineIndicator) { + $scope.activeTab = 2; + } + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + }; + $scope.onChangeSelectedDate = function (input) { + if (input.isSelected) { + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + } + }; + var wait = ms => new Promise((r, j) => setTimeout(r, ms)); + $scope.$on("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup begin", async function (event) { + await wait(130); + $scope.setupCompleted = false; + $timeout(function () { + $scope.$digest(); + }, 500); + }); + $scope.$on("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup completed", async function (event) { + await wait(130); + $scope.setupCompleted = true; + $timeout(function () { + $scope.$digest(); + self.filterDisplayedIndicatorsOnRadar(); + }, 500); + }); + var modifyRadarContent = async function (indicatorsForRadar) { + var indicatorArrayForRadarChart = new Array(); + var defaultSeriesValueArray = new Array(); + var sampleProperties = null; + for (var i = 0; i < indicatorsForRadar.length; i++) { + if (indicatorsForRadar[i].isSelected) { + await kommonitorDiagramHelperService.fetchIndicatorPropertiesIfNotExists(i); + // make object to hold indicatorName, max value and average value + var indicatorProperties = indicatorsForRadar[i].indicatorProperties; + if (kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay && kommonitorFilterHelperService.filteredIndicatorFeatureIds.size > 0) { + indicatorProperties = indicatorProperties.filter(featureProperties => !kommonitorFilterHelperService.featureIsCurrentlyFiltered(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])); + } + sampleProperties = indicatorsForRadar[i].indicatorProperties; + // var closestApplicableTimestamp = kommonitorDiagramHelperService.findClostestTimestamForTargetDate(indicatorsForRadar[i], $scope.date); + // indicatorsForRadar[i].closestTimestamp = closestApplicableTimestamp; + var sample = indicatorProperties[0]; + var maxValue = sample[DATE_PREFIX + indicatorsForRadar[i].selectedDate]; + var minValue = sample[DATE_PREFIX + indicatorsForRadar[i].selectedDate]; + var valueSum = 0; + for (var indicatorPropertyInstance of indicatorProperties) { + // for average only apply real numeric values + if (!kommonitorDataExchangeService.indicatorValueIsNoData(indicatorPropertyInstance[DATE_PREFIX + indicatorsForRadar[i].selectedDate])) { + var value = kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(indicatorPropertyInstance, indicatorsForRadar[i].selectedDate); + valueSum += value; + if (value > maxValue) + maxValue = value; + if (value < minValue) + minValue = value; + } + } + if (minValue == null) { + minValue = 0; + } + if (maxValue == null) { + maxValue = 1; + } + // IT MIGHT HAPPEN THAT AN INDICATOR IS INSPECTED THAT DOES NOT SUPPORT THE DATE + // HENCE ONLY ADD VALUES TO DEFAULT IF THEY SHOW MEANINGFUL VALUES + // if(valueSum != null){ + indicatorArrayForRadarChart.push({ + name: indicatorsForRadar[i].indicatorMetadata.indicatorName + " - " + indicatorsForRadar[i].selectedDate, + unit: indicatorsForRadar[i].indicatorMetadata.unit, + max: maxValue, + min: minValue + }); + defaultSeriesValueArray.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(Number(valueSum / indicatorProperties.length))); + // } + } + } + if (defaultSeriesValueArray.length === 0) { + if ($scope.radarChart) { + $scope.radarChart.dispose(); + $scope.radarChart = undefined; + } + } + else { + if (!$scope.radarChart) + $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + // else{ + // // explicitly kill and reinstantiate radar diagram to avoid zombie states on spatial unit change + // $scope.radarChart.dispose(); + // $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + // } + $scope.radarOption = { + grid: { + left: '4%', + top: 0, + right: '4%', + bottom: 30, + containLabel: true + }, + title: { + text: 'Indikatorenradar - ' + $scope.spatialUnitName + ' - ' + $scope.date, + left: 'center', + top: 0, + show: false + }, + tooltip: { + confine: 'true', + formatter: function (params) { + var string = "" + params.name + "
        "; + for (var index = 0; index < params.value.length; index++) { + string += $scope.radarOption.radar.indicator[index].name + ": " + kommonitorDataExchangeService.getIndicatorValue_asFormattedText(params.value[index]) + " [" + $scope.radarOption.radar.indicator[index].unit + "]
        "; + } + ; + return string; + } + // position: ['50%', '50%'] + }, + toolbox: { + show: true, + right: '15', + feature: { + // mark : {show: true}, + dataView: { + show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Indikatorenradar', 'schließen', 'refresh'], optionToContent: function (opt) { + // + // + // + // + // + // + // + // + // + // + // + // + // + //
        Indikator-NameBeschreibung der Verknüpfung
        {{indicator.referencedIndicatorName}}{{indicator.referencedIndicatorDescription}}
        + var radarSeries = opt.series[0].data; + var indicators = opt.radar[0].indicator; + var dataTableId = "radarDataTable"; + var tableExportName = opt.title[0].text; + var htmlString = ''; + htmlString += ""; + htmlString += ""; + htmlString += ""; + for (var i = 0; i < indicators.length; i++) { + htmlString += ""; + } + htmlString += ""; + htmlString += ""; + htmlString += ""; + for (var j = 0; j < radarSeries.length; j++) { + htmlString += ""; + htmlString += ""; + for (var k = 0; k < indicators.length; k++) { + htmlString += ""; + } + htmlString += ""; + } + htmlString += ""; + htmlString += "
        Feature-Name" + indicators[i].name + " [" + indicators[i].unit + "]
        " + radarSeries[j].name + "" + kommonitorDataExchangeService.getIndicatorValue_asNumber(radarSeries[j].value[k]) + "
        "; + $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); + return htmlString; + } + }, + restore: { show: false, title: "Darstellung erneuern" }, + saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + } + }, + legend: { + type: "scroll", + bottom: 0, + align: 'left', + left: 5, + data: ['Arithmetisches Mittel'] + }, + radar: { + // shape: 'circle', + // name: { + // textStyle: { + // color: '#fff', + // backgroundColor: '#999', + // borderRadius: 3, + // padding: [3, 5] + // } + // }, + name: { + formatter: function (value, indicator) { + return kommonitorDataExchangeService.formatIndicatorNameForLabel(value, 15); + }, + textStyle: { + color: '#525252' + }, + fontSize: 11 + }, + indicator: indicatorArrayForRadarChart + }, + series: [{ + name: 'Indikatorvergleich', + type: 'radar', + symbolSize: 8, + data: [ + { + value: defaultSeriesValueArray, + name: 'Arithmetisches Mittel', + lineStyle: { + color: 'gray', + type: 'dashed', + width: 3 + }, + itemStyle: { + borderWidth: 2, + color: 'gray' + }, + emphasis: { + lineStyle: { + width: 4 + }, + itemStyle: { + borderType: 'dashed' + } + } + } + ] + }] + }; + // check if any feature is still clicked/selected + // then append those as series within radar chart + appendSelectedFeaturesIfNecessary(sampleProperties); + // use configuration item and data specified to show chart + $scope.radarChart.setOption($scope.radarOption); + $scope.radarChart.hideLoading(); + setTimeout(function () { + $scope.radarChart.resize(); + $scope.$digest(); + }, 350); + registerEventsIfNecessary(); + } + }; + var appendSelectedFeaturesIfNecessary = function (sampleProperties) { + for (var propertiesInstance of sampleProperties) { + if (kommonitorFilterHelperService.featureIsCurrentlySelected(propertiesInstance[__env.FEATURE_ID_PROPERTY_NAME])) { + appendSeriesToRadarChart(propertiesInstance); + } + } + }; + function registerEventsIfNecessary() { + if (!$scope.eventsRegistered) { + // when hovering over elements of the chart then highlight them in the map. + $scope.radarChart.on('mouseOver', function (params) { + // $scope.userHoveresOverItem = true; + var spatialFeatureName = params.data.name; + // console.log(spatialFeatureName); + if (spatialFeatureName) { + $rootScope.$broadcast("highlightFeatureOnMap", spatialFeatureName); + } + }); + $scope.radarChart.on('mouseOut', function (params) { + // $scope.userHoveresOverItem = false; + var spatialFeatureName = params.data.name; + // console.log(spatialFeatureName); + if (spatialFeatureName) { + $rootScope.$broadcast("unhighlightFeatureOnMap", spatialFeatureName); + } + }); + //disable feature removal for radar chart - seems to be unintuititve + // $scope.radarChart.on('click', function(params){ + // var spatialFeatureName = params.data.name; + // // console.log(spatialFeatureName); + // if(spatialFeatureName){ + // $rootScope.$broadcast("switchHighlightFeatureOnMap", spatialFeatureName); + // } + // }); + $scope.eventsRegistered = true; + } + } + ; + $scope.$on("updateDiagramsForHoveredFeature", function (event, featureProperties) { + if (!$scope.radarChart || !$scope.radarOption || !$scope.radarOption.legend || !$scope.radarOption.series) { + return; + } + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])) { + appendSeriesToRadarChart(featureProperties); + } + highlightFeatureInRadarChart(featureProperties); + }); + var appendSeriesToRadarChart = function (featureProperties) { + // append feature name to legend + $scope.radarOption.legend.data.push(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + // create feature data series + var featureSeries = {}; + featureSeries.name = featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]; + featureSeries.value = new Array(); + featureSeries.emphasis = { + lineStyle: { + width: 4, + type: 'dotted' + } + }; + featureSeries.lineStyle = { + width: 3, + type: 'solid' + }; + featureSeries.itemStyle = { + borderWidth: 2 + }; + // for each indicator create series data entry for feature + for (var i = 0; i < kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime.length; i++) { + if (kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].isSelected) { + // make object to hold indicatorName, max value and average value + var indicatorProperties = kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].indicatorProperties; + var date = kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].selectedDate; + for (var indicatorPropertyInstance of indicatorProperties) { + if (indicatorPropertyInstance[__env.FEATURE_NAME_PROPERTY_NAME] == featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]) { + if (!kommonitorDataExchangeService.indicatorValueIsNoData(indicatorPropertyInstance[DATE_PREFIX + date])) { + featureSeries.value.push(kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(indicatorPropertyInstance, date)); + } + else { + featureSeries.value.push(null); + } + break; + } + } + } + } + $scope.radarOption.series[0].data.push(featureSeries); + $scope.radarChart.setOption($scope.radarOption); + setTimeout(function () { + $scope.radarChart.resize(); + }, 350); + registerEventsIfNecessary(); + }; + var highlightFeatureInRadarChart = function (featureProperties) { + // highlight the corresponding bar diagram item + // get series index of series + var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + if (dataIndex > -1) { + $scope.radarChart.dispatchAction({ + type: 'highlight', + seriesIndex: 0, + dataIndex: dataIndex + }); + } + }; + $scope.$on("updateDiagramsForUnhoveredFeature", function (event, featureProperties) { + if (!$scope.radarChart || !$scope.radarOption || !$scope.radarOption.legend || !$scope.radarOption.series) { + return; + } + unhighlightFeatureInRadarChart(featureProperties); + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])) { + removeSeriesFromRadarChart(featureProperties); + } + }); + var getSeriesDataIndexByFeatureName = function (featureName) { + for (var index = 0; index < $scope.radarOption.series[0].data.length; index++) { + if ($scope.radarOption.series[0].data[index].name == featureName) + return index; + } + //return -1 if none was found + return -1; + }; + var removeSeriesFromRadarChart = function (featureProperties) { + // remove feature from legend + var legendIndex = $scope.radarOption.legend.data.indexOf(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + if (legendIndex > -1) { + $scope.radarOption.legend.data.splice(legendIndex, 1); + } + // remove feature data series + var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + if (dataIndex > -1) { + $scope.radarOption.series[0].data.splice(dataIndex, 1); + } + // second parameter tells echarts to not merge options with previous data. hence really remove series from graphic + $scope.radarChart.setOption($scope.radarOption, true); + setTimeout(function () { + $scope.radarChart.resize(); + }, 350); + registerEventsIfNecessary(); + }; + var unhighlightFeatureInRadarChart = function (featureProperties) { + // highlight the corresponding bar diagram item + // get series index of series + var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + if (dataIndex > -1) { + $scope.radarChart.dispatchAction({ + type: 'downplay', + seriesIndex: 0, + dataIndex: dataIndex + }); + } + }; + this.filterDisplayedIndicatorsOnRadar = function () { + console.log("Filtering indicator radar"); + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + }; + this.selectAllIndicatorsForRadar = function () { + for (var indicator of kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime) { + indicator.isSelected = true; + } + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + }; + this.deselectAllIndicatorsForRadar = function () { + for (var indicator of kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime) { + indicator.isSelected = false; + } + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + }; + } + ] +}); +//# sourceMappingURL=indicator-radar.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.js.map b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.js.map new file mode 100644 index 000000000..083afbe64 --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-radar.component.js","sourceRoot":"","sources":["indicator-radar.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.ts b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.ts new file mode 100644 index 000000000..95cceef81 --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.component.ts @@ -0,0 +1,612 @@ +angular + .module('indicatorRadar') + .component( + 'indicatorRadar', + { + templateUrl: "components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.template.html", + + controller: [ + 'kommonitorDataExchangeService', 'kommonitorDiagramHelperService', 'kommonitorFilterHelperService', '$scope', '$rootScope', '$timeout', '$http', '__env', + function indicatorRadarController( + kommonitorDataExchangeService, kommonitorDiagramHelperService, kommonitorFilterHelperService, $scope, $rootScope, $timeout, $http, __env) { + /* + * reference to kommonitorDataExchangeService instances + */ + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.kommonitorDiagramHelperServiceInstance = kommonitorDiagramHelperService; + + var self = this; + + $scope.activeTab = 0; + + // initialize any adminLTE box widgets + $('.box').boxWidget(); + + $(window).on('resize', function () { + if ($scope.radarChart != null && $scope.radarChart != undefined) { + $scope.radarChart.resize(); + } + }); + + $scope.$on("resizeDiagrams", function (event) { + + setTimeout(function () { + if ($scope.radarChart != null && $scope.radarChart != undefined) { + $scope.radarChart.resize(); + } + }, 350); + }); + + const DATE_PREFIX = __env.indicatorDatePrefix; + + $scope.indicatorNameFilter = undefined; + + $scope.eventsRegistered = false; + + var numberOfDecimals = __env.numberOfDecimals; + + $scope.setupCompleted = true; + + $scope.onChangeFilterSameUnitAndSameTime = function(){ + if($scope.radarChart){ + $scope.radarChart.dispose(); + $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + } + kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime = []; + + kommonitorDiagramHelperService.setupIndicatorPropertiesForCurrentSpatialUnitAndTime(kommonitorDiagramHelperService.filterSameUnitAndSameTime); + }; + + $scope.date; + $scope.spatialUnitName; + + $scope.$on("updateDiagrams", function (event, indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, justRestyling) { + + // if the layer is just restyled (i.e. due to change of measureOfValue) + // then we do not need to costly update the radar diagram + if (justRestyling) { + return; + } + + console.log("updating radar diagram"); + + $scope.setupCompleted = false; + + updateRadarChart(indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date); + + $rootScope.$broadcast("preserveHighlightedFeatures"); + + }); + + // RADAR CHART TIME SERIES FUNCTION + var updateRadarChart = async function (indicatorMetadataAndGeoJSON, spatialUnitName, spatialUnitId, date) { + // based on prepared DOM, initialize echarts instance + $scope.date = date; + $scope.spatialUnitName = spatialUnitName; + + if (!$scope.radarChart) + $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + else { + // explicitly kill and reinstantiate radar diagram to avoid zombie states on spatial unit change + $scope.radarChart.dispose(); + $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime = new Array(); + } + + await $scope.radarChart.showLoading(); + + kommonitorDiagramHelperService.setupIndicatorPropertiesForCurrentSpatialUnitAndTime(); + + $scope.activeTab = 0; + if(kommonitorDataExchangeService.selectedIndicator.creationType == "COMPUTATION"){ + $scope.activeTab = 1; + } + if(kommonitorDataExchangeService.selectedIndicator.isHeadlineIndicator){ + $scope.activeTab = 2; + } + + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + }; + + $scope.onChangeSelectedDate = function(input){ + if(input.isSelected){ + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + } + }; + + var wait = ms => new Promise((r, j) => setTimeout(r, ms)); + + $scope.$on("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup begin", async function (event) { + + await wait(130); + $scope.setupCompleted = false; + + + $timeout(function(){ + $scope.$digest(); + }, 500); + + }); + + $scope.$on("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup completed", async function (event) { + + await wait(130); + $scope.setupCompleted = true; + + + $timeout(function(){ + $scope.$digest(); + self.filterDisplayedIndicatorsOnRadar(); + }, 500); + + }); + + var modifyRadarContent = async function (indicatorsForRadar) { + var indicatorArrayForRadarChart = new Array(); + var defaultSeriesValueArray = new Array(); + + var sampleProperties = null; + + for (var i = 0; i < indicatorsForRadar.length; i++) { + if (indicatorsForRadar[i].isSelected) { + + await kommonitorDiagramHelperService.fetchIndicatorPropertiesIfNotExists(i); + + // make object to hold indicatorName, max value and average value + var indicatorProperties = indicatorsForRadar[i].indicatorProperties; + + if(kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay && kommonitorFilterHelperService.filteredIndicatorFeatureIds.size > 0){ + indicatorProperties = indicatorProperties.filter(featureProperties => ! kommonitorFilterHelperService.featureIsCurrentlyFiltered(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])); + } + + sampleProperties = indicatorsForRadar[i].indicatorProperties; + + // var closestApplicableTimestamp = kommonitorDiagramHelperService.findClostestTimestamForTargetDate(indicatorsForRadar[i], $scope.date); + // indicatorsForRadar[i].closestTimestamp = closestApplicableTimestamp; + + var sample = indicatorProperties[0]; + var maxValue = sample[DATE_PREFIX + indicatorsForRadar[i].selectedDate]; + var minValue = sample[DATE_PREFIX + indicatorsForRadar[i].selectedDate]; + var valueSum = 0; + + for (var indicatorPropertyInstance of indicatorProperties) { + // for average only apply real numeric values + if (!kommonitorDataExchangeService.indicatorValueIsNoData(indicatorPropertyInstance[DATE_PREFIX + indicatorsForRadar[i].selectedDate])) { + var value = kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(indicatorPropertyInstance, indicatorsForRadar[i].selectedDate) + valueSum += value; + + if (value > maxValue) + maxValue = value; + + if (value < minValue) + minValue = value; + } + } + + if (minValue == null) { + minValue = 0; + } + + if (maxValue == null) { + maxValue = 1; + } + + // IT MIGHT HAPPEN THAT AN INDICATOR IS INSPECTED THAT DOES NOT SUPPORT THE DATE + // HENCE ONLY ADD VALUES TO DEFAULT IF THEY SHOW MEANINGFUL VALUES + // if(valueSum != null){ + indicatorArrayForRadarChart.push({ + name: indicatorsForRadar[i].indicatorMetadata.indicatorName + " - " + indicatorsForRadar[i].selectedDate, + unit: indicatorsForRadar[i].indicatorMetadata.unit, + max: maxValue, + min: minValue + }); + + defaultSeriesValueArray.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(Number(valueSum / indicatorProperties.length))); + // } + } + + } + + if (defaultSeriesValueArray.length === 0) { + + if ($scope.radarChart) { + $scope.radarChart.dispose(); + $scope.radarChart = undefined; + } + + } + else { + + if (!$scope.radarChart) + $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + // else{ + // // explicitly kill and reinstantiate radar diagram to avoid zombie states on spatial unit change + // $scope.radarChart.dispose(); + // $scope.radarChart = echarts.init(document.getElementById('radarDiagram')); + // } + + $scope.radarOption = { + grid: { + left: '4%', + top: 0, + right: '4%', + bottom: 30, + containLabel: true + }, + title: { + text: 'Indikatorenradar - ' + $scope.spatialUnitName + ' - ' + $scope.date, + left: 'center', + top: 0, + show: false + }, + tooltip: { + confine: 'true', + formatter: function (params) { + + var string = "" + params.name + "
        "; + + for (var index = 0; index < params.value.length; index++) { + string += $scope.radarOption.radar.indicator[index].name + ": " + kommonitorDataExchangeService.getIndicatorValue_asFormattedText(params.value[index]) + " [" + $scope.radarOption.radar.indicator[index].unit + "]
        "; + }; + + return string; + } + // position: ['50%', '50%'] + }, + toolbox: { + show: true, + right: '15', + feature: { + // mark : {show: true}, + dataView: { + show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Indikatorenradar', 'schließen', 'refresh'], optionToContent: function (opt) { + + // + // + // + // + // + // + // + // + // + // + // + // + // + //
        Indikator-NameBeschreibung der Verknüpfung
        {{indicator.referencedIndicatorName}}{{indicator.referencedIndicatorDescription}}
        + + var radarSeries = opt.series[0].data; + var indicators = opt.radar[0].indicator; + + var dataTableId = "radarDataTable"; + var tableExportName = opt.title[0].text; + + var htmlString = ''; + htmlString += ""; + htmlString += ""; + htmlString += ""; + + for (var i = 0; i < indicators.length; i++) { + htmlString += ""; + } + + htmlString += ""; + htmlString += ""; + + htmlString += ""; + + + + for (var j = 0; j < radarSeries.length; j++) { + htmlString += ""; + htmlString += ""; + for (var k = 0; k < indicators.length; k++) { + htmlString += ""; + } + htmlString += ""; + } + + htmlString += ""; + htmlString += "
        Feature-Name" + indicators[i].name + " [" + indicators[i].unit + "]
        " + radarSeries[j].name + "" + kommonitorDataExchangeService.getIndicatorValue_asNumber(radarSeries[j].value[k]) + "
        "; + + $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); + + return htmlString; + } + }, + restore: { show: false, title: "Darstellung erneuern" }, + saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + } + }, + legend: { + type: "scroll", + bottom: 0, + align: 'left', + left: 5, + data: ['Arithmetisches Mittel'] + }, + radar: { + // shape: 'circle', + // name: { + // textStyle: { + // color: '#fff', + // backgroundColor: '#999', + // borderRadius: 3, + // padding: [3, 5] + // } + // }, + name: { + formatter: function (value, indicator) { + + return kommonitorDataExchangeService.formatIndicatorNameForLabel(value, 15); + }, + textStyle: { + color: '#525252' + }, + fontSize: 11 + }, + indicator: indicatorArrayForRadarChart + }, + series: [{ + name: 'Indikatorvergleich', + type: 'radar', + symbolSize: 8, + data: [ + { + value: defaultSeriesValueArray, + name: 'Arithmetisches Mittel', + lineStyle: { + color: 'gray', + type: 'dashed', + width: 3 + }, + itemStyle: { + borderWidth: 2, + color: 'gray' + }, + emphasis: { + lineStyle: { + width: 4 + }, + itemStyle: { + borderType: 'dashed' + } + } + } + ] + }] + }; + + // check if any feature is still clicked/selected + // then append those as series within radar chart + appendSelectedFeaturesIfNecessary(sampleProperties); + + // use configuration item and data specified to show chart + $scope.radarChart.setOption($scope.radarOption); + + $scope.radarChart.hideLoading(); + setTimeout(function () { + $scope.radarChart.resize(); + $scope.$digest(); + }, 350); + registerEventsIfNecessary(); + + } + + } + + var appendSelectedFeaturesIfNecessary = function (sampleProperties) { + + for (var propertiesInstance of sampleProperties) { + if (kommonitorFilterHelperService.featureIsCurrentlySelected(propertiesInstance[__env.FEATURE_ID_PROPERTY_NAME])) { + appendSeriesToRadarChart(propertiesInstance); + } + } + }; + + function registerEventsIfNecessary() { + if (!$scope.eventsRegistered) { + // when hovering over elements of the chart then highlight them in the map. + $scope.radarChart.on('mouseOver', function (params) { + // $scope.userHoveresOverItem = true; + var spatialFeatureName = params.data.name; + // console.log(spatialFeatureName); + if(spatialFeatureName){ + $rootScope.$broadcast("highlightFeatureOnMap", spatialFeatureName); + } + + }); + + $scope.radarChart.on('mouseOut', function (params) { + // $scope.userHoveresOverItem = false; + + var spatialFeatureName = params.data.name; + // console.log(spatialFeatureName); + if(spatialFeatureName){ + $rootScope.$broadcast("unhighlightFeatureOnMap", spatialFeatureName); + } + + }); + + //disable feature removal for radar chart - seems to be unintuititve + // $scope.radarChart.on('click', function(params){ + // var spatialFeatureName = params.data.name; + // // console.log(spatialFeatureName); + // if(spatialFeatureName){ + // $rootScope.$broadcast("switchHighlightFeatureOnMap", spatialFeatureName); + // } + // }); + + $scope.eventsRegistered = true; + } + }; + + + $scope.$on("updateDiagramsForHoveredFeature", function (event, featureProperties) { + + if (!$scope.radarChart || !$scope.radarOption || !$scope.radarOption.legend || !$scope.radarOption.series) { + return; + } + + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])) { + appendSeriesToRadarChart(featureProperties); + } + + highlightFeatureInRadarChart(featureProperties); + }); + + var appendSeriesToRadarChart = function (featureProperties) { + // append feature name to legend + $scope.radarOption.legend.data.push(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + + // create feature data series + var featureSeries = {}; + featureSeries.name = featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]; + featureSeries.value = new Array(); + featureSeries.emphasis = { + lineStyle: { + width: 4, + type: 'dotted' + } + }; + featureSeries.lineStyle = { + width: 3, + type: 'solid' + }; + featureSeries.itemStyle = { + borderWidth: 2 + }; + + + // for each indicator create series data entry for feature + for (var i = 0; i < kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime.length; i++) { + if (kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].isSelected) { + // make object to hold indicatorName, max value and average value + var indicatorProperties = kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].indicatorProperties; + var date = kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime[i].selectedDate; + + for (var indicatorPropertyInstance of indicatorProperties) { + if (indicatorPropertyInstance[__env.FEATURE_NAME_PROPERTY_NAME] == featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]) { + if (!kommonitorDataExchangeService.indicatorValueIsNoData(indicatorPropertyInstance[DATE_PREFIX + date])) { + featureSeries.value.push(kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(indicatorPropertyInstance, date)); + } + else { + featureSeries.value.push(null); + } + break; + } + } + } + + } + + $scope.radarOption.series[0].data.push(featureSeries); + + $scope.radarChart.setOption($scope.radarOption); + setTimeout(function () { + $scope.radarChart.resize(); + }, 350); + registerEventsIfNecessary(); + }; + + var highlightFeatureInRadarChart = function (featureProperties) { + // highlight the corresponding bar diagram item + // get series index of series + var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + + if (dataIndex > -1) { + $scope.radarChart.dispatchAction({ + type: 'highlight', + seriesIndex: 0, + dataIndex: dataIndex + }); + } + }; + + $scope.$on("updateDiagramsForUnhoveredFeature", function (event, featureProperties) { + + if (!$scope.radarChart || !$scope.radarOption || !$scope.radarOption.legend || !$scope.radarOption.series) { + return; + } + + unhighlightFeatureInRadarChart(featureProperties); + + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(featureProperties[__env.FEATURE_ID_PROPERTY_NAME])) { + removeSeriesFromRadarChart(featureProperties); + } + }); + + var getSeriesDataIndexByFeatureName = function (featureName) { + for (var index = 0; index < $scope.radarOption.series[0].data.length; index++) { + if ($scope.radarOption.series[0].data[index].name == featureName) + return index; + } + + //return -1 if none was found + return -1; + }; + + var removeSeriesFromRadarChart = function (featureProperties) { + // remove feature from legend + var legendIndex = $scope.radarOption.legend.data.indexOf(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + if (legendIndex > -1) { + $scope.radarOption.legend.data.splice(legendIndex, 1); + } + + // remove feature data series + var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + if (dataIndex > -1) { + $scope.radarOption.series[0].data.splice(dataIndex, 1); + } + + // second parameter tells echarts to not merge options with previous data. hence really remove series from graphic + $scope.radarChart.setOption($scope.radarOption, true); + setTimeout(function () { + $scope.radarChart.resize(); + }, 350); + registerEventsIfNecessary(); + }; + + var unhighlightFeatureInRadarChart = function (featureProperties) { + // highlight the corresponding bar diagram item + // get series index of series + var dataIndex = getSeriesDataIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + + if (dataIndex > -1) { + $scope.radarChart.dispatchAction({ + type: 'downplay', + seriesIndex: 0, + dataIndex: dataIndex + }); + } + }; + + this.filterDisplayedIndicatorsOnRadar = function () { + console.log("Filtering indicator radar"); + + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + + } + + this.selectAllIndicatorsForRadar = function () { + + for (var indicator of kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime) { + indicator.isSelected = true; + } + + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + } + + this.deselectAllIndicatorsForRadar = function () { + + for (var indicator of kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime) { + indicator.isSelected = false; + } + + modifyRadarContent(kommonitorDiagramHelperService.indicatorPropertiesForCurrentSpatialUnitAndTime); + } + + + }] + }); diff --git a/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.js b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.js index 4358673cd..a6bc83418 100644 --- a/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.js +++ b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.js @@ -1 +1,3 @@ -angular.module('indicatorRadar', [ 'kommonitorDataExchange', 'kommonitorDiagramHelper']); +"use strict"; +angular.module('indicatorRadar', ['kommonitorDataExchange', 'kommonitorDiagramHelper']); +//# sourceMappingURL=indicator-radar.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.js.map b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.js.map new file mode 100644 index 000000000..d2839e7fa --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indicator-radar.module.js","sourceRoot":"","sources":["indicator-radar.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAE,wBAAwB,EAAE,yBAAyB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.ts b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.ts new file mode 100644 index 000000000..4358673cd --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/indicatorRadar/indicator-radar.module.ts @@ -0,0 +1 @@ +angular.module('indicatorRadar', [ 'kommonitorDataExchange', 'kommonitorDiagramHelper']); diff --git a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.component.css b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.component.js b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.component.js deleted file mode 100644 index 90d76b4ef..000000000 --- a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.component.js +++ /dev/null @@ -1,81 +0,0 @@ -angular.module('infoModal').component('infoModal', { - templateUrl : "components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.template.html", - controller : [ - 'kommonitorDataExchangeService', '$scope', '$rootScope', '__env', '$timeout', - function InfoModalController(kommonitorDataExchangeService, $scope, $rootScope, __env, $timeout) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - $scope.isHideGreetings = false; - - $scope.init = function(){ - if(! (localStorage.getItem("hideKomMonitorAppGreeting") === "true")) { - - $scope.isHideGreetings = false; - - $('#infoModal').modal('show'); - } - else{ - $scope.isHideGreetings = true; - $("#changeHideGreetingsInput").prop('checked', true); - } - - let tab1 = document.getElementById("infoModalTab1"); - tab1.innerHTML = __env.standardInfoModalTabTitle; - tab1.click(); - tab1.focus(); - - if(__env.enableExtendedInfoModal) { - let tab3 = document.getElementById("infoModalTab3"); - let tab3content = document.getElementById("infoModalTab3Content"); - tab3.innerHTML = __env.extendedInfoModalTabTitle; - tab3content.innerHTML = __env.extendedInfoModalHTMLMessage; - } else { - document.getElementById("infoModalTab3").style.display = "none"; - } - - - $timeout(function(){ - $scope.$digest(); - }, 250); - - }; - - var onChangeHideGreetings = function(){ - if($scope.isHideGreetings){ - localStorage.setItem("hideKomMonitorAppGreeting", "true"); - } - else{ - localStorage.setItem("hideKomMonitorAppGreeting", "false"); - } - }; - - $('#changeHideGreetingsInput').on('click', function(event) { - - if($scope.isHideGreetings){ - $scope.isHideGreetings = false; - } - else{ - $scope.isHideGreetings = true; - } - onChangeHideGreetings(); - event.stopPropagation(); - }); - - var callStartGuidedTour = function(){ - $('#infoModal').modal('hide'); - $rootScope.$broadcast("startGuidedTour"); - }; - - $(document).on('click', '#callStartGuidedTourButton', function (e) { - callStartGuidedTour(); - }); - - $scope.showFeedbackForm = function(){ - $('#infoModal').modal('hide'); - $('#feedbackModal').modal('show'); - }; - - $scope.init(); - } -]}); diff --git a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.component.ts b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.component.ts new file mode 100644 index 000000000..b9331d2df --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.component.ts @@ -0,0 +1,89 @@ + +import { DomSanitizer, SafeHtml } from "@angular/platform-browser"; +import { Component, OnInit } from '@angular/core'; +import { NgbModule} from '@ng-bootstrap/ng-bootstrap'; +import { Router } from '@angular/router'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +@Component({ + selector: 'infoModal', + templateUrl: 'info-modal.template.html', + styleUrls: ['info-modal.component.css'] +}) +export class InfoModalComponent implements OnInit { + + isHideGreetings: boolean = false; + + customGreetingsContact_name: SafeHtml; + customGreetingsContact_organisation: SafeHtml; + customGreetingsContact_mail: string; + customGreetingsTextInfoMessage: SafeHtml; + sanitizer: any; + + + constructor(private modalService: NgbModal, private router: Router) { + this.customGreetingsContact_name = this.sanitizer.bypassSecurityTrustHtml(''); + this.customGreetingsContact_organisation = this.sanitizer.bypassSecurityTrustHtml(''); + this.customGreetingsContact_mail = ''; + this.customGreetingsTextInfoMessage = this.sanitizer.bypassSecurityTrustHtml(''); + + + } + + ngOnInit(): void { + if (!(localStorage.getItem('hideKomMonitorAppGreeting') === 'true')) { + this.isHideGreetings = false; + this.modalService.open('infoModal'); + } else { + this.isHideGreetings = true; + } + + } + dismissModal() { + this.modalService.dismissAll(); + } + + + onChangeHideGreetings(): void { + if (this.isHideGreetings) { + localStorage.setItem('hideKomMonitorAppGreeting', 'true'); + } else { + localStorage.setItem('hideKomMonitorAppGreeting', 'false'); + } + } + callStartGuidedTour(): void { + this.modalService.dismissAll('infoModal'); + this.router.navigate(['/guided-tour']); + } + showFeedbackForm(): void { + this.modalService.dismissAll('infoModal'); + this.router.navigate(['/feedback']); + } +} + + + + + + + + + + + + + + + + + + + + + + + + +function dismissModal() { + throw new Error("Function not implemented."); +} + diff --git a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.module.js b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.module.js deleted file mode 100644 index 3b47b77ce..000000000 --- a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.module.js +++ /dev/null @@ -1 +0,0 @@ -angular.module('infoModal', ['versionInfo']); diff --git a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.module.ts b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.module.ts new file mode 100644 index 000000000..35242685f --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { InfoModalComponent } from './info-modal.component'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { VersionInfoModule } from '../versionInfo/version-info.module'; +@NgModule({ +declarations:[InfoModalComponent], +imports:[CommonModule,NgbModule,VersionInfoModule], +exports:[InfoModalComponent] + +}) + +export class InfoModalModule{ + +} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.template.html b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.template.html index f77ca3f75..31b10a874 100644 --- a/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.template.html +++ b/app/components/kommonitorUserInterface/kommonitorControls/infoModal/info-modal.template.html @@ -1,134 +1,123 @@ - + @@ -79,11 +82,12 @@

        Neuerungen in KomMonitor V2.1.12

        Neuerungen in KomMonitor V2.1.11

        - +
        -
        +
        • @@ -118,11 +122,12 @@

          Neuerungen in KomMonitor V2.1.11

          Neuerungen in KomMonitor V2.1.10

          - +
        -
        +
        • @@ -158,11 +163,12 @@

          Neuerungen in KomMonitor V2.1.10

          Neuerungen in KomMonitor V2.1.9

          - +
        -
        +
        • @@ -199,11 +205,12 @@

          Neuerungen in KomMonitor V2.1.9

          Neuerungen in KomMonitor V2.1.8

          - +
        -
        +
        • @@ -238,11 +245,12 @@

          Neuerungen in KomMonitor V2.1.8

          Neuerungen in KomMonitor V2.1.7

          - +
        -
        +
        • @@ -287,11 +295,12 @@

          Neuerungen in KomMonitor V2.1.7

          Neuerungen in KomMonitor V2.1.6

          - +
        -
        +
        • @@ -316,11 +325,12 @@

          Neuerungen in KomMonitor V2.1.6

          Neuerungen in KomMonitor V2.1.5

          - +
        -
        +
        • @@ -343,11 +353,12 @@

          Neuerungen in KomMonitor V2.1.5

          Neuerungen in KomMonitor V2.1.4

          - +
        -
        +
        • @@ -368,11 +379,12 @@

          Neuerungen in KomMonitor V2.1.4

          Neuerungen in KomMonitor V2.1.3

          - +
        -
        +
        • @@ -392,11 +404,12 @@

          Neuerungen in KomMonitor V2.1.3

          Neuerungen in KomMonitor V2.1.2

          - +
        -
        +
        • @@ -419,11 +432,12 @@

          Neuerungen in KomMonitor V2.1.2

          Neuerungen in KomMonitor V2.1.1

          - +
        -
        +
        • @@ -443,11 +457,12 @@

          Neuerungen in KomMonitor V2.1.1

          Neuerungen in KomMonitor V2.1.0

          - +
        -
        +
        • @@ -526,11 +541,12 @@

          Neuerungen in KomMonitor V2.1.0

          Neuerungen in KomMonitor V2.0.1

          - +
        -
        +
        • @@ -550,11 +566,12 @@

          Neuerungen in KomMonitor V2.0.1

          Neuerungen in KomMonitor V2.0.0

          - +
        -
        +
        Grundlegende Erweiterung des Datenmodells und des Rollen- und Rechtemanagements

        Die Aktualisierung aller KomMonitor Komponenten auf eine Version >= V2.0.0 beinhaltet bedeutende @@ -677,7 +694,7 @@

        Upgradeempfehlung KomMonitor < V2.0.0

        -
        +
        KomMonitor wurde in Version 2.0.0 hinsichtlich des Datenmodells sowie Rechte- und Rollenkonzepts grundlegend erweitert. Es wird daher dringend empfohlen, alle Komponenten auf die neueste Version zu aktualisieren. diff --git a/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.js b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.js index 518355fc5..62414b88b 100644 --- a/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.js +++ b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.js @@ -1,3484 +1,2844 @@ -angular.module('kommonitorMap').component( - 'kommonitorMap', - { +"use strict"; +angular.module('kommonitorMap').component('kommonitorMap', { templateUrl: "components/kommonitorUserInterface/kommonitorMap/kommonitor-map.template.html", controller: [ - '$rootScope', - '$http', - '$scope', - '$timeout', - 'kommonitorMapService', - 'kommonitorDataExchangeService', - 'kommonitorVisualStyleHelperService', - 'kommonitorInfoLegendHelperService', - 'kommonitorFilterHelperService', - '__env', - function MapController($rootScope, $http, $scope, $timeout, kommonitorMapService, kommonitorDataExchangeService, kommonitorVisualStyleHelperService, - kommonitorInfoLegendHelperService, kommonitorFilterHelperService, __env) { - - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; - const numberOfDecimals = __env.numberOfDecimals; - var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; - var defaultBorderColorForFilteredValues = __env.defaultBorderColorForFilteredValues; - var defaultBorderColor = __env.defaultBorderColor; - var defaultFillOpacity = __env.defaultFillOpacity; - var defaultFillOpacityForFilteredFeatures = __env.defaultFillOpacityForFilteredFeatures; - var defaultFillOpacityForHighlightedFeatures = __env.defaultFillOpacityForHighlightedFeatures; - var defaultFillOpacityForZeroFeatures = __env.defaultFillOpacityForZeroFeatures; - var defaultColorBrewerPaletteForBalanceIncreasingValues = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; - var defaultColorBrewerPaletteForBalanceDecreasingValues = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; - var defaultColorBrewerPaletteForGtMovValues = __env.defaultColorBrewerPaletteForGtMovValues; - var defaultColorBrewerPaletteForLtMovValues = __env.defaultColorBrewerPaletteForLtMovValues; - var defaultColorForHoveredFeatures = __env.defaultColorForHoveredFeatures; - var defaultColorForClickedFeatures = __env.defaultColorForClickedFeatures; - var defaultBorderColorForNoDataValues = __env.defaultBorderColorForNoDataValues; - var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; - var defaultFillOpacityForNoDataValues = __env.defaultFillOpacityForNoDataValues; - - - var defaultColorForOutliers_high = __env.defaultColorForOutliers_high; - var defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; - var defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; - var defaultColorForOutliers_low = __env.defaultColorForOutliers_low; - var defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; - var defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; - var useOutlierDetectionOnIndicator = __env.useOutlierDetectionOnIndicator; - - const outlierPropertyName = "outlier"; - const outlierPropertyValue_high_soft = "high-soft"; - const outlierPropertyValue_low_soft = "low-soft"; - const outlierPropertyValue_high_extreme = "high-extreme"; - const outlierPropertyValue_low_extreme = "low-extreme"; - const outlierPropertyValue_no = "no"; - - $scope.containsOutliers_high = false; - $scope.containsOutliers_low = false; - $scope.outliers_high = undefined; - $scope.outliers_low = undefined; - kommonitorDataExchangeService.useOutlierDetectionOnIndicator = useOutlierDetectionOnIndicator; - - $scope.svgString_outlierLow = 'Sorry, your browser does not support inline SVG.'; - $scope.svgString_outlierHigh = 'Sorry, your browser does not support inline SVG.'; - - $scope.showOutlierInfoAlert = false; - - - - $scope.drawnPointFeatures = undefined; - $scope.drawPointControl = undefined; - - $scope.featuresWithValues = []; - $scope.featuresWithoutValues = []; - - - const MultipleResultsLeafletSearch = L.Control.Search.extend({ - - _makeUniqueKey: function (featureName, featureId) { - return featureName + " (Name) - " + featureId + " (ID)"; - }, - - _searchInLayer: function (layer, retRecords, propName) { - var self = this, loc; - var key_withUniqueID; - - if (layer instanceof L.Control.Search.Marker) return; - - if (layer instanceof L.Marker || layer instanceof L.CircleMarker) { - if (self._getPath(layer.options, propName)) { - loc = layer.getLatLng(); - loc.layer = layer; - retRecords[self._getPath(layer.options, propName)] = loc; - } - else if (self._getPath(layer.feature.properties, propName)) { - loc = layer.getLatLng(); - loc.layer = layer; - key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); - retRecords[key_withUniqueID] = loc; - } - else { - //throw new Error("propertyName '"+propName+"' not found in marker"); - console.warn("propertyName '" + propName + "' not found in marker"); - } - } - else if (layer instanceof L.Path || layer instanceof L.Polyline || layer instanceof L.Polygon) { - if (self._getPath(layer.options, propName)) { - loc = layer.getBounds().getCenter(); - loc.layer = layer; - retRecords[self._getPath(layer.options, propName)] = loc; - } - else if (self._getPath(layer.feature.properties, propName)) { - loc = layer.getBounds().getCenter(); - loc.layer = layer; - key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); - retRecords[key_withUniqueID] = loc; - } - else { - //throw new Error("propertyName '"+propName+"' not found in shape"); - console.warn("propertyName '" + propName + "' not found in shape"); - } - } - else if (layer.hasOwnProperty('feature'))//GeoJSON - { - if (layer.feature.properties.hasOwnProperty(propName)) { - - key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); - if (layer.getLatLng && typeof layer.getLatLng === 'function') { - loc = layer.getLatLng(); - loc.layer = layer; - retRecords[key_withUniqueID] = loc; - } else if (layer.getBounds && typeof layer.getBounds === 'function') { - loc = layer.getBounds().getCenter(); - loc.layer = layer; - retRecords[key_withUniqueID] = loc; - } else { - console.warn("Unknown type of Layer"); - } - } - else { - //throw new Error("propertyName '"+propName+"' not found in feature"); - console.warn("propertyName '" + propName + "' not found in feature"); - } - } - else if (layer instanceof L.LayerGroup) { - layer.eachLayer(function (layer) { - self._searchInLayer(layer, retRecords, propName); - }); - } - }, - _defaultMoveToLocation: function (latlng, title, map) { - if (this.options.zoom) - this._map.setView(latlng, this.options.zoom); - else - this._map.panTo(latlng); - - // add collapse after click on item - this.collapse(); - }, - _handleAutoresize: function () { - var maxWidth; - - if (!this._map) { - this._map = $scope.map; - } - - if (this._input.style.maxWidth !== this._map._container.offsetWidth) { - maxWidth = this._map._container.clientWidth; - - // other side margin + padding + width border + width search-button + width search-cancel - maxWidth -= 10 + 20 + 1 + 30 + 22; - - this._input.style.maxWidth = maxWidth.toString() + 'px'; - } - - if (this.options.autoResize && (this._container.offsetWidth + 20 < this._map._container.offsetWidth)) { - this._input.size = this._input.value.length < this._inputMinSize ? this._inputMinSize : this._input.value.length; - } - } - }); - - $scope.onCloseOutlierAlert = function () { - // $("#outlierInfo").hide(); - $scope.showOutlierInfoAlert = false; - }; - - - var refreshNoDataStyle = function () { - - $scope.currentIndicatorContainsNoDataValues = false; - $scope.svgString_noData = '' + - '' + - '' + - '' + - '' + - 'Sorry, your browser does not support inline SVG.'; - - $scope.noDataStyle = kommonitorVisualStyleHelperService.noDataStyle; - }; - - var refreshOutliersStyle = function () { - - $scope.containsOutliers_high = false; - $scope.containsOutliers_low = false; - $scope.outlierMinValue = undefined; - $scope.outlierMaxValue = undefined; - $scope.showOutlierInfoAlert = false; - - $scope.svgString_outlierLow = 'Sorry, your browser does not support inline SVG.'; - $scope.svgString_outlierHigh = 'Sorry, your browser does not support inline SVG.'; - - // if ($scope.useTransparencyOnIndicator) { - // fillOpacity_high = defaultFillOpacityForOutliers_high; - // fillOpacity_low = defaultFillOpacityForOutliers_low; - // } - - $scope.outlierStyle_high = kommonitorVisualStyleHelperService.outlierStyle_high; - - $scope.outlierStyle_low = kommonitorVisualStyleHelperService.outlierStyle_low; - }; - - $scope.useTransparencyOnIndicator = __env.useTransparencyOnIndicator; - - $scope.filteredStyle = kommonitorVisualStyleHelperService.filteredStyle; - - var refreshFilteredStyle = function () { - - $scope.filteredStyle = kommonitorVisualStyleHelperService.filteredStyle; - }; - - this.kommonitorMapServiceInstance = kommonitorMapService; - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - $scope.inputLayerCounter = 0; - - $scope.latCenter = __env.initialLatitude; - $scope.lonCenter = __env.initialLongitude; - $scope.zoomLevel = __env.initialZoomLevel; - - $scope.loadingData = true; - - $scope.drawnItems = new L.FeatureGroup(); - $scope.drawControl = undefined; - - $scope.allDrawingToolsEnabled = false; - $scope.date = undefined; - - // central map object - $scope.map = undefined; - $scope.scaleBar = undefined; - $scope.layerControl = undefined; - $scope.showInfoControl = true; - $scope.showLegendControl = true; - $scope.showLegend = true; - $scope.overlays = new Array(); - $scope.baseMaps = new Array(); - const spatialUnitLayerGroupName = "Raumeinheiten"; - const georesourceLayerGroupName = "Georessourcen"; - const poiLayerGroupName = "Points of Interest"; - const loiLayerGroupName = "Lines of Interest"; - const aoiLayerGroupName = "Areas of Interest"; - const indicatorLayerGroupName = "Indikatoren"; - const reachabilityLayerGroupName = "Erreichbarkeiten"; - const wmsLayerGroupName = "Web Map Services (WMS)"; - const wfsLayerGroupName = "Web Feature Services (WFS)"; - const fileLayerGroupName = "Dateilayer"; - - // create classyBrew object - $scope.defaultBrew = new classyBrew(); - $scope.gtMeasureOfValueBrew = new classyBrew(); - $scope.ltMeasureOfValueBrew = new classyBrew(); - - $scope.currentIndicatorMetadataAndGeoJSON; - $scope.currentGeoJSONOfCurrentLayer; - $scope.currentIndicatorContainsZeroValues = false; - $scope.currentIndicatorContainsNoDataValues = false; - $scope.indicatorTypeOfCurrentLayer; - $scope.defaultColorForZeroValues = __env.defaultColorForZeroValues; - - $scope.customIndicatorPropertyName; - $scope.customIndicatorName; - $scope.customIndicatorUnit; - - $scope.currentCustomIndicatorLayerOfCurrentLayer; - $scope.customPropertyName; - - $scope.currentCustomIndicatorLayer; - $scope.isochronesLayer = undefined; - $scope.isochroneMarkerLayer = undefined; - - /* - * L.TileLayer.Grayscale is a regular tilelayer with grayscale makeover. - */ - - L.TileLayer.Grayscale = L.TileLayer.extend({ - options: { - quotaRed: 21, - quotaGreen: 71, - quotaBlue: 8, - quotaDividerTune: 0, - quotaDivider: function () { - return this.quotaRed + this.quotaGreen + this.quotaBlue + this.quotaDividerTune; - } - }, - - initialize: function (url, options) { - options = options || {}; - options.crossOrigin = true; - L.TileLayer.prototype.initialize.call(this, url, options); - - this.on('tileload', function (e) { - this._makeGrayscale(e.tile); - }); - }, - - _createTile: function () { - var tile = L.TileLayer.prototype._createTile.call(this); - tile.crossOrigin = "Anonymous"; - return tile; - }, - - _makeGrayscale: function (img) { - if (img.getAttribute('data-grayscaled')) - return; - - img.crossOrigin = ''; - var canvas = document.createElement("canvas"); - canvas.width = img.width; - canvas.height = img.height; - var ctx = canvas.getContext("2d"); - ctx.drawImage(img, 0, 0); - - var imgd = ctx.getImageData(0, 0, canvas.width, canvas.height); - var pix = imgd.data; - for (var i = 0, n = pix.length; i < n; i += 4) { - pix[i] = pix[i + 1] = pix[i + 2] = (this.options.quotaRed * pix[i] + this.options.quotaGreen * pix[i + 1] + this.options.quotaBlue * pix[i + 2]) / this.options.quotaDivider(); - } - ctx.putImageData(imgd, 0, 0); - img.setAttribute('data-grayscaled', true); - img.src = canvas.toDataURL(); - } - }); - - L.tileLayer.grayscale = function (url, options) { - return new L.TileLayer.Grayscale(url, options); - }; - - this.initializeMap = function () { - - $scope.loadingData = true; - - // initialize map referring to div element with id="map" - - var baseLayerDefinitionsMap = new Map(); - - for (const baseMapEntry of __env.baseLayers) { - - if (baseMapEntry.layerType === "TILE_LAYER_GRAYSCALE"){ - var grayscaleLayer = new L.tileLayer.grayscale(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html }); - baseLayerDefinitionsMap.set(baseMapEntry.name, grayscaleLayer); - } - else if (baseMapEntry.layerType === "TILE_LAYER"){ - var tileLayer = new L.tileLayer(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html }); - baseLayerDefinitionsMap.set(baseMapEntry.name, tileLayer); - } - else if (baseMapEntry.layerType === "WMS"){ - var wmsLayer = new L.tileLayer.wms(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html, layers: baseMapEntry.layerName_WMS, format: 'image/png' }); - baseLayerDefinitionsMap.set(baseMapEntry.name, wmsLayer); - } - } - - $scope.map = L.map('map', { - center: [$scope.latCenter, $scope.lonCenter], - zoom: $scope.zoomLevel, - zoomDelta: 0.5, - zoomSnap: 0.5, - layers: [baseLayerDefinitionsMap.get(__env.baseLayers[0].name)] - }); - - // execute update search control on layer add and remove - $scope.map.on('overlayadd', function (eo) { - $scope.updateSearchControl(); - }); - $scope.map.on('overlayremove', function (eo) { - $scope.updateSearchControl(); - }); - - // update zoom and extent - $scope.map.on('zoomend', function (eo) { - let latLng = $scope.map.getCenter(); - __env.currentLatitude = latLng.lat; - __env.currentLongitude = latLng.lng; - __env.currentZoomLevel = $scope.map.getZoom(); - }); - $scope.map.on('moveend', function (eo) { - let latLng = $scope.map.getCenter(); - __env.currentLatitude = latLng.lat; - __env.currentLongitude = latLng.lng; - __env.currentZoomLevel = $scope.map.getZoom(); - }); - - $scope.baseMaps = { - }; - - baseLayerDefinitionsMap.forEach(function(value, key, map){ - $scope.baseMaps[key] = value; - }); - - $scope.groupedOverlays = { - indicatorLayerGroupName: { - - }, - poiLayerGroupName: { - - }, - loiLayerGroupName: { - - }, - aoiLayerGroupName: { - - }, - wmsLayerGroupName: { - - }, - wfsLayerGroupName: { - - }, - fileLayerGroupName: { - - }, - reachabilityLayerGroupName: { - - } - }; - - $scope.layerControl = L.control.groupedLayers($scope.baseMaps, $scope.groupedOverlays, { position: 'topleft' }); - $scope.map.addControl($scope.layerControl); - - // Disable dragging when user's cursor enters the element - $scope.layerControl.getContainer().addEventListener('mouseover', function () { - $scope.map.dragging.disable(); - $scope.map.touchZoom.disable(); - $scope.map.doubleClickZoom.disable(); - $scope.map.scrollWheelZoom.disable(); - }); - - // Re-enable dragging when user's cursor leaves the element - $scope.layerControl.getContainer().addEventListener('mouseout', function () { - $scope.map.dragging.enable(); - $scope.map.touchZoom.enable(); - $scope.map.doubleClickZoom.enable(); - $scope.map.scrollWheelZoom.enable(); - }); - - $scope.scaleBar = L.control.scale(); - $scope.scaleBar.addTo($scope.map); - - - - // hatch patterns - // var diagonalPattern = new L.PatternPath({ d: "M-1,1 l2,-2 M0,4 l4,-4 M3,5 l2,-2" , fill: true }); - - // $scope.outlierFillPattern_high = new L.Pattern(); - // $scope.outlierFillPattern_high.addShape(diagonalPattern); - // $scope.outlierFillPattern_high.addTo($scope.map); - - $scope.outlierFillPattern_low = kommonitorVisualStyleHelperService.outlierFillPattern_low; - $scope.outlierFillPattern_low.addTo($scope.map); - - $scope.outlierFillPattern_high = kommonitorVisualStyleHelperService.outlierFillPattern_high; - $scope.outlierFillPattern_high.addTo($scope.map); - - $scope.noDataFillPattern = kommonitorVisualStyleHelperService.noDataFillPattern; - $scope.noDataFillPattern.addTo($scope.map); - - // $scope.loadingData = false; - - ///////////////////////////////////////////////////// - ///// LEAFLET GEOSEARCH SETUP - ///////////////////////////////////////////////////// - var GeoSearchControl = window.GeoSearch.GeoSearchControl; - var OpenStreetMapProvider = window.GeoSearch.OpenStreetMapProvider; - - // remaining is the same as in the docs, accept for the var instead of const declarations - var provider = new OpenStreetMapProvider( - { - params: { - 'accept-language': 'de', // render results in Dutch - countrycodes: 'de', // limit search results to the Netherlands - addressdetails: 1, // include additional address detail parts - viewbox: "" + (Number(__env.initialLongitude) - 0.001) + "," + (Number(__env.initialLatitude) - 0.001) + "," + (Number(__env.initialLongitude) + 0.001) + "," + (Number(__env.initialLatitude) + 0.001) - }, - searchUrl: __env.targetUrlToGeocoderService + '/search', - reverseUrl: __env.targetUrlToGeocoderService + '/reverse' - } - ); - - $scope.geosearchControl = new GeoSearchControl({ - position: "topleft", - provider: provider, - style: 'button', - autoComplete: true, - autoCompleteDelay: 250, - showMarker: true, // optional: true|false - default true - showPopup: false, // optional: true|false - default false - marker: { // optional: L.Marker - default L.Icon.Default - icon: new L.Icon.Default(), - draggable: false, - }, - popupFormat: ({ query, result }) => result.label, // optional: function - default returns result label - maxMarkers: 1, // optional: number - default 1 - retainZoomLevel: false, // optional: true|false - default false - animateZoom: true, // optional: true|false - default true - autoClose: false, // optional: true|false - default false - searchLabel: 'Suche nach Adressen ...', // optional: string - default 'Enter address' - keepResult: false // optional: true|false - default false - }); - - $scope.map.addControl($scope.geosearchControl); - - - ///////////////////////////////////////////////////// - ///// LEAFLET SEARCH SETUP - ///////////////////////////////////////////////////// - // will be updated once example indicator layer is loaded - $scope.searchControl = new MultipleResultsLeafletSearch({ - }); - $scope.searchControl.addTo($scope.map); - - - ///////////////////////////////////////////////////// - ///// LEAFLET MEASURE SETUP - ///////////////////////////////////////////////////// - var measureOptions = { - position: 'topleft', - primaryLengthUnit: 'meters', - secondaryLengthUnit: 'kilometers', - primaryAreaUnit: 'sqmeters', - activeColor: "#d15c54", - completedColor: "#d15c54", - decPoint: ',', - thousandsSep: '.' - }; - - $scope.measureControl = new L.Control.Measure(measureOptions); - $scope.measureControl.addTo($scope.map); - - ///////////////////////////////////////////////////// - ///// LEAFLET SCREENSHOTER SETUP - ///////////////////////////////////////////////////// - - // from the docs, most of it is probably not needed - let screenshotterOptions = { - cropImageByInnerWH: true, // crop blank opacity from image borders - hidden: true, // hide screen icon - preventDownload: false, // prevent download on button click - domtoimageOptions: {}, // see options for dom-to-image - position: 'topleft', // position of take screen icon - screenName: 'screen', // string or function - hideElementsWithSelectors: ['.leaflet-control-container'], // by default hide map controls All els must be child of _map._container - mimeType: 'image/png', // used if format == image, - caption: null, // string or function, added caption to bottom of screen - captionFontSize: 15, - captionFont: 'Arial', - captionColor: 'black', - captionBgColor: 'white', - captionOffset: 5, - // callback for manually edit map if have warn: "May be map size very big on that zoom level, we have error" - // and screenshot not created - onPixelDataFail: async function({ node, plugin, error, mapPane, domtoimageOptions }) { - // Solutions: - // decrease size of map - // or decrease zoom level - // or remove elements with big distanses - // and after that return image in Promise - plugin._getPixelDataOfNormalMap - return plugin._getPixelDataOfNormalMap(domtoimageOptions) - } - } - - $scope.simpleMapScreenshoter = L.simpleMapScreenshoter(screenshotterOptions).addTo($scope.map); - $scope.map.simpleMapScreenshoter = $scope.simpleMapScreenshoter; - - }; // end initialize map - - - $scope.$on("exportMap", function (event) { - - // wait for print process to finish - let format = 'blob'; // 'image' - return base64, 'canvas' - return canvas - let overridedPluginOptions = { - mimeType: 'image/png' - }; - $scope.simpleMapScreenshoter.takeScreen(format, overridedPluginOptions); - $scope.simpleMapScreenshoter.takeScreen(format, overridedPluginOptions).then(blob => { - // FileSaver saveAs method - saveAs(blob, 'KomMonitor-Screenshot.png'); - }).catch(error => { - console.log("Error while exporting map view."); - console.error(error); - - kommonitorDataExchangeService.displayMapApplicationError(error); - }); - - }); - - function isKomMonitorSpecificProperty(propertyKey){ - let isKomMonitorSpecificProperty = false; - - if(propertyKey == "outlier"){ - isKomMonitorSpecificProperty = true; - } - else if(propertyKey == __env.VALID_START_DATE_PROPERTY_NAME){ - isKomMonitorSpecificProperty = true; - } - else if(propertyKey == __env.VALID_END_DATE_PROPERTY_NAME){ - isKomMonitorSpecificProperty = true; - } - else if(propertyKey == "bbox"){ - isKomMonitorSpecificProperty = true; - } - else if(propertyKey.includes(__env.indicatorDatePrefix)){ - isKomMonitorSpecificProperty = true; - } - - return isKomMonitorSpecificProperty; - } - - $scope.updateSearchControl = function () { - - setTimeout(function () { - if ($scope.searchControl) { - try { - $scope.map.removeControl($scope.searchControl); - $scope.searchControl = undefined; - } - catch (error) { - kommonitorDataExchangeService.displayMapApplicationError(error); - } - } - - // build L.layerGroup of available POI layers - var featureLayers = []; - - for (var layerEntry of $scope.layerControl._layers) { - if (layerEntry) { - if (layerEntry.overlay) { - if ($scope.map.hasLayer(layerEntry.layer)) { - if (layerEntry.group.name === poiLayerGroupName || layerEntry.group.name === loiLayerGroupName || layerEntry.group.name === aoiLayerGroupName || layerEntry.group.name === indicatorLayerGroupName || layerEntry.group.name === wfsLayerGroupName || layerEntry.group.name === fileLayerGroupName) { - featureLayers.push(layerEntry.layer); - } - } - - } - } - } - - var layerGroup; - // if no relevant layers are currently displayed, then - if (featureLayers.length === 0) { - $scope.searchControl = new MultipleResultsLeafletSearch({ - }); - $scope.searchControl.addTo($scope.map); - } - else { - layerGroup = L.featureGroup(featureLayers); - - $scope.searchControl = new MultipleResultsLeafletSearch({ - position: "topleft", - layer: layerGroup, - initial: false, - propertyName: __env.FEATURE_NAME_PROPERTY_NAME, - textPlaceholder: "Layer-Objekte nach Name und/oder ID filtern", - textCancel: "Abbrechen", - textErr: "Position nicht gefunden", - hideMarkerOnCollapse: true, - zoom: 15, - autoResize: true, - autoCollapse: false, - autoType: true, - formatData: function (json) { //adds coordinates to name. - var propName = this.options.propertyName, - propLoc = this.options.propertyLoc, - i, jsonret = {}; - if (L.Util.isArray(propLoc)) - for (i in json) { - if (!this._getPath(json[i], propName)) continue; - jsonret[this._getPath(json[i], propName) + " (" + json[i][propLoc[0]] + "," + json[i][propLoc[1]] + ")"] = L.latLng(json[i][propLoc[0]], json[i][propLoc[1]]); - } - else - for (i in json) { - if (!this._getPath(json[i], propName)) continue; - jsonret[this._getPath(json[i], propName) + " (" + json[i][propLoc][0] + "," + json[i][propLoc][1] + ")"] = L.latLng(this._getPath(json[i], propLoc)); - } - return jsonret; + '$rootScope', + '$http', + '$scope', + '$timeout', + 'kommonitorMapService', + 'kommonitorDataExchangeService', + 'kommonitorVisualStyleHelperService', + 'kommonitorInfoLegendHelperService', + 'kommonitorFilterHelperService', + '__env', + function MapController($rootScope, $http, $scope, $timeout, kommonitorMapService, kommonitorDataExchangeService, kommonitorVisualStyleHelperService, kommonitorInfoLegendHelperService, kommonitorFilterHelperService, __env) { + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; + const numberOfDecimals = __env.numberOfDecimals; + var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; + var defaultBorderColorForFilteredValues = __env.defaultBorderColorForFilteredValues; + var defaultBorderColor = __env.defaultBorderColor; + var defaultFillOpacity = __env.defaultFillOpacity; + var defaultFillOpacityForFilteredFeatures = __env.defaultFillOpacityForFilteredFeatures; + var defaultFillOpacityForHighlightedFeatures = __env.defaultFillOpacityForHighlightedFeatures; + var defaultFillOpacityForZeroFeatures = __env.defaultFillOpacityForZeroFeatures; + var defaultColorBrewerPaletteForBalanceIncreasingValues = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; + var defaultColorBrewerPaletteForBalanceDecreasingValues = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; + var defaultColorBrewerPaletteForGtMovValues = __env.defaultColorBrewerPaletteForGtMovValues; + var defaultColorBrewerPaletteForLtMovValues = __env.defaultColorBrewerPaletteForLtMovValues; + var defaultColorForHoveredFeatures = __env.defaultColorForHoveredFeatures; + var defaultColorForClickedFeatures = __env.defaultColorForClickedFeatures; + var defaultBorderColorForNoDataValues = __env.defaultBorderColorForNoDataValues; + var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; + var defaultFillOpacityForNoDataValues = __env.defaultFillOpacityForNoDataValues; + var defaultColorForOutliers_high = __env.defaultColorForOutliers_high; + var defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; + var defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; + var defaultColorForOutliers_low = __env.defaultColorForOutliers_low; + var defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; + var defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; + var useOutlierDetectionOnIndicator = __env.useOutlierDetectionOnIndicator; + const outlierPropertyName = "outlier"; + const outlierPropertyValue_high_soft = "high-soft"; + const outlierPropertyValue_low_soft = "low-soft"; + const outlierPropertyValue_high_extreme = "high-extreme"; + const outlierPropertyValue_low_extreme = "low-extreme"; + const outlierPropertyValue_no = "no"; + $scope.containsOutliers_high = false; + $scope.containsOutliers_low = false; + $scope.outliers_high = undefined; + $scope.outliers_low = undefined; + kommonitorDataExchangeService.useOutlierDetectionOnIndicator = useOutlierDetectionOnIndicator; + $scope.svgString_outlierLow = 'Sorry, your browser does not support inline SVG.'; + $scope.svgString_outlierHigh = 'Sorry, your browser does not support inline SVG.'; + $scope.showOutlierInfoAlert = false; + $scope.drawnPointFeatures = undefined; + $scope.drawPointControl = undefined; + $scope.featuresWithValues = []; + $scope.featuresWithoutValues = []; + const MultipleResultsLeafletSearch = L.Control.Search.extend({ + _makeUniqueKey: function (featureName, featureId) { + return featureName + " (Name) - " + featureId + " (ID)"; }, - filterData: function (text, records) { - var I, icase, regSearch, frecords = {}; - - text = text.replace(/[.*+?^${}()|[\]\\]/g, ''); //sanitize remove all special characters - if (text === '') - return []; - - I = this.options.initial ? '^' : ''; //search only initial text - icase = !this.options.casesensitive ? 'i' : undefined; - - regSearch = new RegExp(I + text, icase); - - for (var key in records) { - - // make a searchable string from all relevant feature properties - let recordString = ""; - let record = records[key]; - let recordProperties = record.layer.feature.properties; - - for (const propertyKey in recordProperties) { - if(recordProperties[propertyKey] && !isKomMonitorSpecificProperty(propertyKey)){ - recordString += recordProperties[propertyKey]; - } - } - - if (regSearch.test(recordString)) - frecords[key] = records[key]; - } - - return frecords; + _searchInLayer: function (layer, retRecords, propName) { + var self = this, loc; + var key_withUniqueID; + if (layer instanceof L.Control.Search.Marker) + return; + if (layer instanceof L.Marker || layer instanceof L.CircleMarker) { + if (self._getPath(layer.options, propName)) { + loc = layer.getLatLng(); + loc.layer = layer; + retRecords[self._getPath(layer.options, propName)] = loc; + } + else if (self._getPath(layer.feature.properties, propName)) { + loc = layer.getLatLng(); + loc.layer = layer; + key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); + retRecords[key_withUniqueID] = loc; + } + else { + //throw new Error("propertyName '"+propName+"' not found in marker"); + console.warn("propertyName '" + propName + "' not found in marker"); + } + } + else if (layer instanceof L.Path || layer instanceof L.Polyline || layer instanceof L.Polygon) { + if (self._getPath(layer.options, propName)) { + loc = layer.getBounds().getCenter(); + loc.layer = layer; + retRecords[self._getPath(layer.options, propName)] = loc; + } + else if (self._getPath(layer.feature.properties, propName)) { + loc = layer.getBounds().getCenter(); + loc.layer = layer; + key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); + retRecords[key_withUniqueID] = loc; + } + else { + //throw new Error("propertyName '"+propName+"' not found in shape"); + console.warn("propertyName '" + propName + "' not found in shape"); + } + } + else if (layer.hasOwnProperty('feature')) //GeoJSON + { + if (layer.feature.properties.hasOwnProperty(propName)) { + key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); + if (layer.getLatLng && typeof layer.getLatLng === 'function') { + loc = layer.getLatLng(); + loc.layer = layer; + retRecords[key_withUniqueID] = loc; + } + else if (layer.getBounds && typeof layer.getBounds === 'function') { + loc = layer.getBounds().getCenter(); + loc.layer = layer; + retRecords[key_withUniqueID] = loc; + } + else { + console.warn("Unknown type of Layer"); + } + } + else { + //throw new Error("propertyName '"+propName+"' not found in feature"); + console.warn("propertyName '" + propName + "' not found in feature"); + } + } + else if (layer instanceof L.LayerGroup) { + layer.eachLayer(function (layer) { + self._searchInLayer(layer, retRecords, propName); + }); + } }, - buildTip: function (text, val) { - var emString = ""; - - if (val.layer.metadataObject) { - if (val.layer.metadataObject.isPOI) { - emString += ''; - emString += ""; - emString += ''; - } - } - else { - emString += ""; - } - return '' + emString + '  ' + text + ''; - } - }); - - $scope.searchControl.addTo($scope.map); - } - }, 200); - }; - - $scope.$on("showLoadingIconOnMap", function (event) { - // console.log("Show loading icon on map"); - $scope.loadingData = true; - }); - - $scope.$on("hideLoadingIconOnMap", function (event) { - // console.log("Hide loading icon on map"); - $timeout(function(){ - $scope.loadingData = false; - }, 250); - - }); - - $(document).on('click', '#selectSpatialUnitViaInfoControl li p', function () { - var spatialUnitName = $(this).text(); - $('#selectSpatialUnitViaInfoControl_text').text(spatialUnitName); - - $rootScope.$broadcast("changeSpatialUnitViaInfoControl", spatialUnitName); - }); - - // $(document).on('change','#selectSimplifyGeometriesViaInfoControl',function(){ - // var selector = document.getElementById('selectSimplifyGeometriesViaInfoControl'); - // var simplifyGeometries = selector[selector.selectedIndex].value; - // - // kommonitorDataExchangeService.simplifyGeometries = simplifyGeometries; - // - // $rootScope.$broadcast("changeSpatialUnit"); - // }); - - $scope.$on("changeSpatialUnitViaInfoControl", function (event, spatialUnitLevel) { - - $rootScope.$broadcast("changeSpatialUnit"); - - }); - - - $scope.appendSpatialUnitOptions = function () { - - //
        - // - //
        - - // var innerHTMLString = "
        "; - // innerHTMLString += ""; - // innerHTMLString += "
        "; - // // innerHTMLString += "
        "; - - // - - var innerHTMLString = '
        '; - innerHTMLString += "
        "; - innerHTMLString += "
        "; - innerHTMLString += "
        "; - - return innerHTMLString; - }; - - // $scope.appendSimplifyGeometriesOptions = function(){ - // - // //
        - // // - // //
        - // - // var innerHTMLString = "
        "; - // innerHTMLString += ""; - // innerHTMLString += "
        "; - // // innerHTMLString += "
        "; - // - // return innerHTMLString; - // }; - - var toggleInfoControl = function () { - if ($scope.showInfoControl === true) { - /* use jquery to select your DOM elements that has the class 'legend' */ - $('.info').hide(); - $scope.showInfoControl = false; - - $('#toggleInfoControlButton').show(); - } else { - $('.info').show(); + _defaultMoveToLocation: function (latlng, title, map) { + if (this.options.zoom) + this._map.setView(latlng, this.options.zoom); + else + this._map.panTo(latlng); + // add collapse after click on item + this.collapse(); + }, + _handleAutoresize: function () { + var maxWidth; + if (!this._map) { + this._map = $scope.map; + } + if (this._input.style.maxWidth !== this._map._container.offsetWidth) { + maxWidth = this._map._container.clientWidth; + // other side margin + padding + width border + width search-button + width search-cancel + maxWidth -= 10 + 20 + 1 + 30 + 22; + this._input.style.maxWidth = maxWidth.toString() + 'px'; + } + if (this.options.autoResize && (this._container.offsetWidth + 20 < this._map._container.offsetWidth)) { + this._input.size = this._input.value.length < this._inputMinSize ? this._inputMinSize : this._input.value.length; + } + } + }); + $scope.onCloseOutlierAlert = function () { + // $("#outlierInfo").hide(); + $scope.showOutlierInfoAlert = false; + }; + var refreshNoDataStyle = function () { + $scope.currentIndicatorContainsNoDataValues = false; + $scope.svgString_noData = '' + + '' + + '' + + '' + + '' + + 'Sorry, your browser does not support inline SVG.'; + $scope.noDataStyle = kommonitorVisualStyleHelperService.noDataStyle; + }; + var refreshOutliersStyle = function () { + $scope.containsOutliers_high = false; + $scope.containsOutliers_low = false; + $scope.outlierMinValue = undefined; + $scope.outlierMaxValue = undefined; + $scope.showOutlierInfoAlert = false; + $scope.svgString_outlierLow = 'Sorry, your browser does not support inline SVG.'; + $scope.svgString_outlierHigh = 'Sorry, your browser does not support inline SVG.'; + // if ($scope.useTransparencyOnIndicator) { + // fillOpacity_high = defaultFillOpacityForOutliers_high; + // fillOpacity_low = defaultFillOpacityForOutliers_low; + // } + $scope.outlierStyle_high = kommonitorVisualStyleHelperService.outlierStyle_high; + $scope.outlierStyle_low = kommonitorVisualStyleHelperService.outlierStyle_low; + }; + $scope.useTransparencyOnIndicator = __env.useTransparencyOnIndicator; + $scope.filteredStyle = kommonitorVisualStyleHelperService.filteredStyle; + var refreshFilteredStyle = function () { + $scope.filteredStyle = kommonitorVisualStyleHelperService.filteredStyle; + }; + this.kommonitorMapServiceInstance = kommonitorMapService; + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.inputLayerCounter = 0; + $scope.latCenter = __env.initialLatitude; + $scope.lonCenter = __env.initialLongitude; + $scope.zoomLevel = __env.initialZoomLevel; + $scope.loadingData = true; + $scope.drawnItems = new L.FeatureGroup(); + $scope.drawControl = undefined; + $scope.allDrawingToolsEnabled = false; + $scope.date = undefined; + // central map object + $scope.map = undefined; + $scope.scaleBar = undefined; + $scope.layerControl = undefined; $scope.showInfoControl = true; - - // button is defined in kommonitor-user-interface component - $('#toggleInfoControlButton').hide(); - } - }; - - var toggleLegendControl = function () { - if ($scope.showLegendControl === true) { - /* use jquery to select your DOM elements that has the class 'legend' */ - $('.legendMap').hide(); - $scope.showLegendControl = false; - - $('#toggleLegendControlButton').show(); - } else { - $('.legendMap').show(); $scope.showLegendControl = true; - - // button is defined in kommonitor-user-interface component - $('#toggleLegendControlButton').hide(); - } - }; - - $scope.$on("toggleInfoControl", function (event) { - toggleInfoControl(); - }); - - $scope.$on("toggleLegendControl", function (event) { - toggleLegendControl(); - }); - - $scope.appendInfoCloseButton = function () { - return ''; - }; - - $scope.appendLegendCloseButton = function () { - return ''; - }; - - $scope.appendIndicatorInformation = function(isCustomComputation){ - var indicatorInfoHTML = '
        '; - var titel = $scope.indicatorName; - - if (isCustomComputation) { - titel += " - individuelles Berechnungsergebnis"; - } - - indicatorInfoHTML += '

        ' + titel + '


        '; - indicatorInfoHTML += 'Beschreibung: ' + $scope.indicatorDescription + '
        '; - indicatorInfoHTML += 'Datenquelle: ' + $scope.currentIndicatorMetadataAndGeoJSON.metadata.datasource + '
        '; - indicatorInfoHTML += $scope.appendSpatialUnitOptions(); - - var transparencyDomString = ""; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += ''; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += ''; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += ''; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - transparencyDomString += '
        '; - - indicatorInfoHTML += transparencyDomString; - - var exportDomString = '
        '; - exportDomString += ""; - exportDomString += '
        '; - exportDomString += ''; - exportDomString += ''; - // temporarily disable WMS and WFS export - exportDomString += 'WMS'; - exportDomString += 'WFS'; - exportDomString += "
        "; - - indicatorInfoHTML += exportDomString; - - indicatorInfoHTML += "



        "; - - // indicatorInfoHTML += $scope.appendSimplifyGeometriesOptions(); - return indicatorInfoHTML; - }; - - - $(document).on('click', '#controlIndicatorTransparency', function (e) { - var indicatorTransparencyCheckbox = document.getElementById('controlIndicatorTransparency'); - if (indicatorTransparencyCheckbox.checked) { - $scope.useTransparencyOnIndicator = true; - } - else { - $scope.useTransparencyOnIndicator = false; - } - $rootScope.$broadcast("restyleCurrentLayer", false); - - // ensure that highlighted features remain highlighted - preserveHighlightedFeatures(); - }); - - $(document).on('click', '#controlIndicatorOutlierDetection', function (e) { - var indicatorOutlierCheckbox = document.getElementById('controlIndicatorOutlierDetection'); - if (indicatorOutlierCheckbox.checked) { - kommonitorDataExchangeService.useOutlierDetectionOnIndicator = true; - } - else { - kommonitorDataExchangeService.useOutlierDetectionOnIndicator = false; - } - $rootScope.$broadcast("restyleCurrentLayer", false); - - // ensure that highlighted features remain highlighted - preserveHighlightedFeatures(); - }); - - $(document).on('click', '#controlIndicatorZeroClassifyOption', function (e) { - var zeroClassifyCheckbox = document.getElementById('controlIndicatorZeroClassifyOption'); - if (zeroClassifyCheckbox.checked) { - kommonitorDataExchangeService.classifyZeroSeparately = true; - } - else { - kommonitorDataExchangeService.classifyZeroSeparately = false; - } - $rootScope.$broadcast("restyleCurrentLayer", false); - - // ensure that highlighted features remain highlighted - preserveHighlightedFeatures(); - }); - - $scope.$on("changeClassifyMethod", function (event, method) { - kommonitorVisualStyleHelperService.classifyMethod = method; - - $timeout(function(){ - kommonitorVisualStyleHelperService.classifyMethod = method; - $rootScope.$apply(); - }, 350); - - $rootScope.$broadcast("restyleCurrentLayer", false); - }); - - $(document).on('click', '#controlNoDataDisplay', function (e) { - var controlNoDataDisplayCheckbox = document.getElementById('controlNoDataDisplay'); - - if (controlNoDataDisplayCheckbox.checked) { - $scope.applyNoDataDisplay(); - } else { - $scope.resetNoDataDisplay(); - } - - $rootScope.$broadcast("restyleCurrentLayer", false); - - // ensure that highlighted features remain highlighted - preserveHighlightedFeatures(); - }); - - - $scope.$on("applyNoDataDisplay", function() { - $scope.applyNoDataDisplay(); - }); - - - $scope.applyNoDataDisplay = function() { - kommonitorDataExchangeService.useNoDataToggle = true; - $scope.featuresWithValues = []; - for (var i = 0; i < $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { - if (!kommonitorDataExchangeService.indicatorValueIsNoData($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { - $scope.featuresWithValues.push($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i]) - } else { - $scope.featuresWithoutValues.push($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i]) - } - } - - // get feature names array - let featuresWithValuesNames = []; - for (var i = 0; i < $scope.featuresWithValues.length; i++) { - featuresWithValuesNames.push( $scope.featuresWithValues[i].properties["name"]); - } - - // store checkbox state - let completelyRemoveFilteredFeaturesFromDisplayChbState = kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay; - kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = true; // set checkbox true - // perform spatial filter - kommonitorFilterHelperService.applySpatialFilter_currentSpatialUnitFeatures(featuresWithValuesNames); - // set checkbox to previous state - kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = completelyRemoveFilteredFeaturesFromDisplayChbState; - } - - - $scope.$on("resetNoDataDisplay", function() { - $scope.resetNoDataDisplay(); - }); - - $scope.resetNoDataDisplay = function() { - kommonitorDataExchangeService.useNoDataToggle = false; - let visibleFeatures = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features; - let visibleAndNoDataFeatures = visibleFeatures.concat($scope.featuresWithoutValues); - - // get feature names array - let visibleAndNoDataFeaturesNames = []; - for (var i = 0; i < visibleAndNoDataFeatures.length; i++) { - visibleAndNoDataFeaturesNames.push( visibleAndNoDataFeatures[i].properties["name"]); + $scope.showLegend = true; + $scope.overlays = new Array(); + $scope.baseMaps = new Array(); + const spatialUnitLayerGroupName = "Raumeinheiten"; + const georesourceLayerGroupName = "Georessourcen"; + const poiLayerGroupName = "Points of Interest"; + const loiLayerGroupName = "Lines of Interest"; + const aoiLayerGroupName = "Areas of Interest"; + const indicatorLayerGroupName = "Indikatoren"; + const reachabilityLayerGroupName = "Erreichbarkeiten"; + const wmsLayerGroupName = "Web Map Services (WMS)"; + const wfsLayerGroupName = "Web Feature Services (WFS)"; + const fileLayerGroupName = "Dateilayer"; + // create classyBrew object + $scope.defaultBrew = new classyBrew(); + $scope.gtMeasureOfValueBrew = new classyBrew(); + $scope.ltMeasureOfValueBrew = new classyBrew(); + $scope.currentIndicatorMetadataAndGeoJSON; + $scope.currentGeoJSONOfCurrentLayer; + $scope.currentIndicatorContainsZeroValues = false; + $scope.currentIndicatorContainsNoDataValues = false; + $scope.indicatorTypeOfCurrentLayer; + $scope.defaultColorForZeroValues = __env.defaultColorForZeroValues; + $scope.customIndicatorPropertyName; + $scope.customIndicatorName; + $scope.customIndicatorUnit; + $scope.currentCustomIndicatorLayerOfCurrentLayer; + $scope.customPropertyName; + $scope.currentCustomIndicatorLayer; + $scope.isochronesLayer = undefined; + $scope.isochroneMarkerLayer = undefined; + /* + * L.TileLayer.Grayscale is a regular tilelayer with grayscale makeover. + */ + L.TileLayer.Grayscale = L.TileLayer.extend({ + options: { + quotaRed: 21, + quotaGreen: 71, + quotaBlue: 8, + quotaDividerTune: 0, + quotaDivider: function () { + return this.quotaRed + this.quotaGreen + this.quotaBlue + this.quotaDividerTune; + } + }, + initialize: function (url, options) { + options = options || {}; + options.crossOrigin = true; + L.TileLayer.prototype.initialize.call(this, url, options); + this.on('tileload', function (e) { + this._makeGrayscale(e.tile); + }); + }, + _createTile: function () { + var tile = L.TileLayer.prototype._createTile.call(this); + tile.crossOrigin = "Anonymous"; + return tile; + }, + _makeGrayscale: function (img) { + if (img.getAttribute('data-grayscaled')) + return; + img.crossOrigin = ''; + var canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + var imgd = ctx.getImageData(0, 0, canvas.width, canvas.height); + var pix = imgd.data; + for (var i = 0, n = pix.length; i < n; i += 4) { + pix[i] = pix[i + 1] = pix[i + 2] = (this.options.quotaRed * pix[i] + this.options.quotaGreen * pix[i + 1] + this.options.quotaBlue * pix[i + 2]) / this.options.quotaDivider(); + } + ctx.putImageData(imgd, 0, 0); + img.setAttribute('data-grayscaled', true); + img.src = canvas.toDataURL(); + } + }); + L.tileLayer.grayscale = function (url, options) { + return new L.TileLayer.Grayscale(url, options); + }; + this.initializeMap = function () { + $scope.loadingData = true; + // initialize map referring to div element with id="map" + var baseLayerDefinitionsMap = new Map(); + for (const baseMapEntry of __env.baseLayers) { + if (baseMapEntry.layerType === "TILE_LAYER_GRAYSCALE") { + var grayscaleLayer = new L.tileLayer.grayscale(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html }); + baseLayerDefinitionsMap.set(baseMapEntry.name, grayscaleLayer); + } + else if (baseMapEntry.layerType === "TILE_LAYER") { + var tileLayer = new L.tileLayer(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html }); + baseLayerDefinitionsMap.set(baseMapEntry.name, tileLayer); + } + else if (baseMapEntry.layerType === "WMS") { + var wmsLayer = new L.tileLayer.wms(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html, layers: baseMapEntry.layerName_WMS, format: 'image/png' }); + baseLayerDefinitionsMap.set(baseMapEntry.name, wmsLayer); + } + } + $scope.map = L.map('map', { + center: [$scope.latCenter, $scope.lonCenter], + zoom: $scope.zoomLevel, + zoomDelta: 0.5, + zoomSnap: 0.5, + layers: [baseLayerDefinitionsMap.get(__env.baseLayers[0].name)] + }); + // execute update search control on layer add and remove + $scope.map.on('overlayadd', function (eo) { + $scope.updateSearchControl(); + }); + $scope.map.on('overlayremove', function (eo) { + $scope.updateSearchControl(); + }); + // update zoom and extent + $scope.map.on('zoomend', function (eo) { + let latLng = $scope.map.getCenter(); + __env.currentLatitude = latLng.lat; + __env.currentLongitude = latLng.lng; + __env.currentZoomLevel = $scope.map.getZoom(); + }); + $scope.map.on('moveend', function (eo) { + let latLng = $scope.map.getCenter(); + __env.currentLatitude = latLng.lat; + __env.currentLongitude = latLng.lng; + __env.currentZoomLevel = $scope.map.getZoom(); + }); + $scope.baseMaps = {}; + baseLayerDefinitionsMap.forEach(function (value, key, map) { + $scope.baseMaps[key] = value; + }); + $scope.groupedOverlays = { + indicatorLayerGroupName: {}, + poiLayerGroupName: {}, + loiLayerGroupName: {}, + aoiLayerGroupName: {}, + wmsLayerGroupName: {}, + wfsLayerGroupName: {}, + fileLayerGroupName: {}, + reachabilityLayerGroupName: {} + }; + $scope.layerControl = L.control.groupedLayers($scope.baseMaps, $scope.groupedOverlays, { position: 'topleft' }); + $scope.map.addControl($scope.layerControl); + // Disable dragging when user's cursor enters the element + $scope.layerControl.getContainer().addEventListener('mouseover', function () { + $scope.map.dragging.disable(); + $scope.map.touchZoom.disable(); + $scope.map.doubleClickZoom.disable(); + $scope.map.scrollWheelZoom.disable(); + }); + // Re-enable dragging when user's cursor leaves the element + $scope.layerControl.getContainer().addEventListener('mouseout', function () { + $scope.map.dragging.enable(); + $scope.map.touchZoom.enable(); + $scope.map.doubleClickZoom.enable(); + $scope.map.scrollWheelZoom.enable(); + }); + $scope.scaleBar = L.control.scale(); + $scope.scaleBar.addTo($scope.map); + // hatch patterns + // var diagonalPattern = new L.PatternPath({ d: "M-1,1 l2,-2 M0,4 l4,-4 M3,5 l2,-2" , fill: true }); + // $scope.outlierFillPattern_high = new L.Pattern(); + // $scope.outlierFillPattern_high.addShape(diagonalPattern); + // $scope.outlierFillPattern_high.addTo($scope.map); + $scope.outlierFillPattern_low = kommonitorVisualStyleHelperService.outlierFillPattern_low; + $scope.outlierFillPattern_low.addTo($scope.map); + $scope.outlierFillPattern_high = kommonitorVisualStyleHelperService.outlierFillPattern_high; + $scope.outlierFillPattern_high.addTo($scope.map); + $scope.noDataFillPattern = kommonitorVisualStyleHelperService.noDataFillPattern; + $scope.noDataFillPattern.addTo($scope.map); + // $scope.loadingData = false; + ///////////////////////////////////////////////////// + ///// LEAFLET GEOSEARCH SETUP + ///////////////////////////////////////////////////// + var GeoSearchControl = window.GeoSearch.GeoSearchControl; + var OpenStreetMapProvider = window.GeoSearch.OpenStreetMapProvider; + // remaining is the same as in the docs, accept for the var instead of const declarations + var provider = new OpenStreetMapProvider({ + params: { + 'accept-language': 'de', + countrycodes: 'de', + addressdetails: 1, + viewbox: "" + (Number(__env.initialLongitude) - 0.001) + "," + (Number(__env.initialLatitude) - 0.001) + "," + (Number(__env.initialLongitude) + 0.001) + "," + (Number(__env.initialLatitude) + 0.001) + }, + searchUrl: __env.targetUrlToGeocoderService + '/search', + reverseUrl: __env.targetUrlToGeocoderService + '/reverse' + }); + $scope.geosearchControl = new GeoSearchControl({ + position: "topleft", + provider: provider, + style: 'button', + autoComplete: true, + autoCompleteDelay: 250, + showMarker: true, + showPopup: false, + marker: { + icon: new L.Icon.Default(), + draggable: false, + }, + popupFormat: ({ query, result }) => result.label, + maxMarkers: 1, + retainZoomLevel: false, + animateZoom: true, + autoClose: false, + searchLabel: 'Suche nach Adressen ...', + keepResult: false // optional: true|false - default false + }); + $scope.map.addControl($scope.geosearchControl); + ///////////////////////////////////////////////////// + ///// LEAFLET SEARCH SETUP + ///////////////////////////////////////////////////// + // will be updated once example indicator layer is loaded + $scope.searchControl = new MultipleResultsLeafletSearch({}); + $scope.searchControl.addTo($scope.map); + ///////////////////////////////////////////////////// + ///// LEAFLET MEASURE SETUP + ///////////////////////////////////////////////////// + var measureOptions = { + position: 'topleft', + primaryLengthUnit: 'meters', + secondaryLengthUnit: 'kilometers', + primaryAreaUnit: 'sqmeters', + activeColor: "#d15c54", + completedColor: "#d15c54", + decPoint: ',', + thousandsSep: '.' + }; + $scope.measureControl = new L.Control.Measure(measureOptions); + $scope.measureControl.addTo($scope.map); + ///////////////////////////////////////////////////// + ///// LEAFLET SCREENSHOTER SETUP + ///////////////////////////////////////////////////// + // from the docs, most of it is probably not needed + let screenshotterOptions = { + cropImageByInnerWH: true, + hidden: true, + preventDownload: false, + domtoimageOptions: {}, + position: 'topleft', + screenName: 'screen', + hideElementsWithSelectors: ['.leaflet-control-container'], + mimeType: 'image/png', + caption: null, + captionFontSize: 15, + captionFont: 'Arial', + captionColor: 'black', + captionBgColor: 'white', + captionOffset: 5, + // callback for manually edit map if have warn: "May be map size very big on that zoom level, we have error" + // and screenshot not created + onPixelDataFail: async function ({ node, plugin, error, mapPane, domtoimageOptions }) { + // Solutions: + // decrease size of map + // or decrease zoom level + // or remove elements with big distanses + // and after that return image in Promise - plugin._getPixelDataOfNormalMap + return plugin._getPixelDataOfNormalMap(domtoimageOptions); + } + }; + $scope.simpleMapScreenshoter = L.simpleMapScreenshoter(screenshotterOptions).addTo($scope.map); + $scope.map.simpleMapScreenshoter = $scope.simpleMapScreenshoter; + }; // end initialize map + $scope.$on("exportMap", function (event) { + // wait for print process to finish + let format = 'blob'; // 'image' - return base64, 'canvas' - return canvas + let overridedPluginOptions = { + mimeType: 'image/png' + }; + $scope.simpleMapScreenshoter.takeScreen(format, overridedPluginOptions); + $scope.simpleMapScreenshoter.takeScreen(format, overridedPluginOptions).then(blob => { + // FileSaver saveAs method + saveAs(blob, 'KomMonitor-Screenshot.png'); + }).catch(error => { + console.log("Error while exporting map view."); + console.error(error); + kommonitorDataExchangeService.displayMapApplicationError(error); + }); + }); + function isKomMonitorSpecificProperty(propertyKey) { + let isKomMonitorSpecificProperty = false; + if (propertyKey == "outlier") { + isKomMonitorSpecificProperty = true; + } + else if (propertyKey == __env.VALID_START_DATE_PROPERTY_NAME) { + isKomMonitorSpecificProperty = true; + } + else if (propertyKey == __env.VALID_END_DATE_PROPERTY_NAME) { + isKomMonitorSpecificProperty = true; + } + else if (propertyKey == "bbox") { + isKomMonitorSpecificProperty = true; + } + else if (propertyKey.includes(__env.indicatorDatePrefix)) { + isKomMonitorSpecificProperty = true; + } + return isKomMonitorSpecificProperty; + } + $scope.updateSearchControl = function () { + setTimeout(function () { + if ($scope.searchControl) { + try { + $scope.map.removeControl($scope.searchControl); + $scope.searchControl = undefined; + } + catch (error) { + kommonitorDataExchangeService.displayMapApplicationError(error); + } + } + // build L.layerGroup of available POI layers + var featureLayers = []; + for (var layerEntry of $scope.layerControl._layers) { + if (layerEntry) { + if (layerEntry.overlay) { + if ($scope.map.hasLayer(layerEntry.layer)) { + if (layerEntry.group.name === poiLayerGroupName || layerEntry.group.name === loiLayerGroupName || layerEntry.group.name === aoiLayerGroupName || layerEntry.group.name === indicatorLayerGroupName || layerEntry.group.name === wfsLayerGroupName || layerEntry.group.name === fileLayerGroupName) { + featureLayers.push(layerEntry.layer); + } + } + } + } + } + var layerGroup; + // if no relevant layers are currently displayed, then + if (featureLayers.length === 0) { + $scope.searchControl = new MultipleResultsLeafletSearch({}); + $scope.searchControl.addTo($scope.map); + } + else { + layerGroup = L.featureGroup(featureLayers); + $scope.searchControl = new MultipleResultsLeafletSearch({ + position: "topleft", + layer: layerGroup, + initial: false, + propertyName: __env.FEATURE_NAME_PROPERTY_NAME, + textPlaceholder: "Layer-Objekte nach Name und/oder ID filtern", + textCancel: "Abbrechen", + textErr: "Position nicht gefunden", + hideMarkerOnCollapse: true, + zoom: 15, + autoResize: true, + autoCollapse: false, + autoType: true, + formatData: function (json) { + var propName = this.options.propertyName, propLoc = this.options.propertyLoc, i, jsonret = {}; + if (L.Util.isArray(propLoc)) + for (i in json) { + if (!this._getPath(json[i], propName)) + continue; + jsonret[this._getPath(json[i], propName) + " (" + json[i][propLoc[0]] + "," + json[i][propLoc[1]] + ")"] = L.latLng(json[i][propLoc[0]], json[i][propLoc[1]]); + } + else + for (i in json) { + if (!this._getPath(json[i], propName)) + continue; + jsonret[this._getPath(json[i], propName) + " (" + json[i][propLoc][0] + "," + json[i][propLoc][1] + ")"] = L.latLng(this._getPath(json[i], propLoc)); + } + return jsonret; + }, + filterData: function (text, records) { + var I, icase, regSearch, frecords = {}; + text = text.replace(/[.*+?^${}()|[\]\\]/g, ''); //sanitize remove all special characters + if (text === '') + return []; + I = this.options.initial ? '^' : ''; //search only initial text + icase = !this.options.casesensitive ? 'i' : undefined; + regSearch = new RegExp(I + text, icase); + for (var key in records) { + // make a searchable string from all relevant feature properties + let recordString = ""; + let record = records[key]; + let recordProperties = record.layer.feature.properties; + for (const propertyKey in recordProperties) { + if (recordProperties[propertyKey] && !isKomMonitorSpecificProperty(propertyKey)) { + recordString += recordProperties[propertyKey]; + } + } + if (regSearch.test(recordString)) + frecords[key] = records[key]; + } + return frecords; + }, + buildTip: function (text, val) { + var emString = ""; + if (val.layer.metadataObject) { + if (val.layer.metadataObject.isPOI) { + emString += ''; + emString += ""; + emString += ''; + } + } + else { + emString += ""; + } + return '' + emString + '  ' + text + ''; + } + }); + $scope.searchControl.addTo($scope.map); + } + }, 200); + }; + $scope.$on("showLoadingIconOnMap", function (event) { + // console.log("Show loading icon on map"); + $scope.loadingData = true; + }); + $scope.$on("hideLoadingIconOnMap", function (event) { + // console.log("Hide loading icon on map"); + $timeout(function () { + $scope.loadingData = false; + }, 250); + }); + $(document).on('click', '#selectSpatialUnitViaInfoControl li p', function () { + var spatialUnitName = $(this).text(); + $('#selectSpatialUnitViaInfoControl_text').text(spatialUnitName); + $rootScope.$broadcast("changeSpatialUnitViaInfoControl", spatialUnitName); + }); + // $(document).on('change','#selectSimplifyGeometriesViaInfoControl',function(){ + // var selector = document.getElementById('selectSimplifyGeometriesViaInfoControl'); + // var simplifyGeometries = selector[selector.selectedIndex].value; + // + // kommonitorDataExchangeService.simplifyGeometries = simplifyGeometries; + // + // $rootScope.$broadcast("changeSpatialUnit"); + // }); + $scope.$on("changeSpatialUnitViaInfoControl", function (event, spatialUnitLevel) { + $rootScope.$broadcast("changeSpatialUnit"); + }); + $scope.appendSpatialUnitOptions = function () { + //
        + // + //
        + // var innerHTMLString = "
        "; + // innerHTMLString += ""; + // innerHTMLString += "
        "; + // // innerHTMLString += "
        "; + // + var innerHTMLString = '
        '; + innerHTMLString += "
        "; + innerHTMLString += "
        "; + innerHTMLString += "
        "; + return innerHTMLString; + }; + // $scope.appendSimplifyGeometriesOptions = function(){ + // + // //
        + // // + // //
        + // + // var innerHTMLString = "
        "; + // innerHTMLString += ""; + // innerHTMLString += "
        "; + // // innerHTMLString += "
        "; + // + // return innerHTMLString; + // }; + var toggleInfoControl = function () { + if ($scope.showInfoControl === true) { + /* use jquery to select your DOM elements that has the class 'legend' */ + $('.info').hide(); + $scope.showInfoControl = false; + $('#toggleInfoControlButton').show(); + } + else { + $('.info').show(); + $scope.showInfoControl = true; + // button is defined in kommonitor-user-interface component + $('#toggleInfoControlButton').hide(); + } + }; + var toggleLegendControl = function () { + if ($scope.showLegendControl === true) { + /* use jquery to select your DOM elements that has the class 'legend' */ + $('.legendMap').hide(); + $scope.showLegendControl = false; + $('#toggleLegendControlButton').show(); + } + else { + $('.legendMap').show(); + $scope.showLegendControl = true; + // button is defined in kommonitor-user-interface component + $('#toggleLegendControlButton').hide(); + } + }; + $scope.$on("toggleInfoControl", function (event) { + toggleInfoControl(); + }); + $scope.$on("toggleLegendControl", function (event) { + toggleLegendControl(); + }); + $scope.appendInfoCloseButton = function () { + return ''; + }; + $scope.appendLegendCloseButton = function () { + return ''; + }; + $scope.appendIndicatorInformation = function (isCustomComputation) { + var indicatorInfoHTML = '
        '; + var titel = $scope.indicatorName; + if (isCustomComputation) { + titel += " - individuelles Berechnungsergebnis"; + } + indicatorInfoHTML += '

        ' + titel + '


        '; + indicatorInfoHTML += 'Beschreibung: ' + $scope.indicatorDescription + '
        '; + indicatorInfoHTML += 'Datenquelle: ' + $scope.currentIndicatorMetadataAndGeoJSON.metadata.datasource + '
        '; + indicatorInfoHTML += $scope.appendSpatialUnitOptions(); + var transparencyDomString = ""; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += ''; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += ''; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += ''; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + indicatorInfoHTML += transparencyDomString; + var exportDomString = '
        '; + exportDomString += ""; + exportDomString += '
        '; + exportDomString += ''; + exportDomString += ''; + // temporarily disable WMS and WFS export + exportDomString += 'WMS'; + exportDomString += 'WFS'; + exportDomString += "
        "; + indicatorInfoHTML += exportDomString; + indicatorInfoHTML += "



        "; + // indicatorInfoHTML += $scope.appendSimplifyGeometriesOptions(); + return indicatorInfoHTML; + }; + $(document).on('click', '#controlIndicatorTransparency', function (e) { + var indicatorTransparencyCheckbox = document.getElementById('controlIndicatorTransparency'); + if (indicatorTransparencyCheckbox.checked) { + $scope.useTransparencyOnIndicator = true; + } + else { + $scope.useTransparencyOnIndicator = false; + } + $rootScope.$broadcast("restyleCurrentLayer", false); + // ensure that highlighted features remain highlighted + preserveHighlightedFeatures(); + }); + $(document).on('click', '#controlIndicatorOutlierDetection', function (e) { + var indicatorOutlierCheckbox = document.getElementById('controlIndicatorOutlierDetection'); + if (indicatorOutlierCheckbox.checked) { + kommonitorDataExchangeService.useOutlierDetectionOnIndicator = true; + } + else { + kommonitorDataExchangeService.useOutlierDetectionOnIndicator = false; + } + $rootScope.$broadcast("restyleCurrentLayer", false); + // ensure that highlighted features remain highlighted + preserveHighlightedFeatures(); + }); + $(document).on('click', '#controlIndicatorZeroClassifyOption', function (e) { + var zeroClassifyCheckbox = document.getElementById('controlIndicatorZeroClassifyOption'); + if (zeroClassifyCheckbox.checked) { + kommonitorDataExchangeService.classifyZeroSeparately = true; + } + else { + kommonitorDataExchangeService.classifyZeroSeparately = false; + } + $rootScope.$broadcast("restyleCurrentLayer", false); + // ensure that highlighted features remain highlighted + preserveHighlightedFeatures(); + }); + $scope.$on("changeClassifyMethod", function (event, method) { + kommonitorVisualStyleHelperService.classifyMethod = method; + $timeout(function () { + kommonitorVisualStyleHelperService.classifyMethod = method; + $rootScope.$apply(); + }, 350); + $rootScope.$broadcast("restyleCurrentLayer", false); + }); + $(document).on('click', '#controlNoDataDisplay', function (e) { + var controlNoDataDisplayCheckbox = document.getElementById('controlNoDataDisplay'); + if (controlNoDataDisplayCheckbox.checked) { + $scope.applyNoDataDisplay(); + } + else { + $scope.resetNoDataDisplay(); + } + $rootScope.$broadcast("restyleCurrentLayer", false); + // ensure that highlighted features remain highlighted + preserveHighlightedFeatures(); + }); + $scope.$on("applyNoDataDisplay", function () { + $scope.applyNoDataDisplay(); + }); + $scope.applyNoDataDisplay = function () { + kommonitorDataExchangeService.useNoDataToggle = true; + $scope.featuresWithValues = []; + for (var i = 0; i < $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { + if (!kommonitorDataExchangeService.indicatorValueIsNoData($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { + $scope.featuresWithValues.push($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i]); + } + else { + $scope.featuresWithoutValues.push($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i]); + } + } + // get feature names array + let featuresWithValuesNames = []; + for (var i = 0; i < $scope.featuresWithValues.length; i++) { + featuresWithValuesNames.push($scope.featuresWithValues[i].properties["name"]); + } + // store checkbox state + let completelyRemoveFilteredFeaturesFromDisplayChbState = kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay; + kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = true; // set checkbox true + // perform spatial filter + kommonitorFilterHelperService.applySpatialFilter_currentSpatialUnitFeatures(featuresWithValuesNames); + // set checkbox to previous state + kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = completelyRemoveFilteredFeaturesFromDisplayChbState; + }; + $scope.$on("resetNoDataDisplay", function () { + $scope.resetNoDataDisplay(); + }); + $scope.resetNoDataDisplay = function () { + kommonitorDataExchangeService.useNoDataToggle = false; + let visibleFeatures = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features; + let visibleAndNoDataFeatures = visibleFeatures.concat($scope.featuresWithoutValues); + // get feature names array + let visibleAndNoDataFeaturesNames = []; + for (var i = 0; i < visibleAndNoDataFeatures.length; i++) { + visibleAndNoDataFeaturesNames.push(visibleAndNoDataFeatures[i].properties["name"]); + } + // store checkbox state + let completelyRemoveFilteredFeaturesFromDisplayChbState = kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay; + kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = true; // set checkbox true + // perform spatial filter + kommonitorFilterHelperService.applySpatialFilter_currentSpatialUnitFeatures(visibleAndNoDataFeaturesNames); + // set checkbox to previous state + kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = completelyRemoveFilteredFeaturesFromDisplayChbState; + $scope.featuresWithoutValues = []; + }; + /** + * binds the popup of a clicked output + * to layer.feature.properties.popupContent + */ + function onEachFeatureSpatialUnit(feature, layer) { + // does this feature have a property named popupContent? + layer.on({ + click: function () { + // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + '' + feature.properties[p] + '
        '; + layer.bindPopup(popupContent); + // if (propertiesString) + // layer.bindPopup(propertiesString); + } + }); } - - // store checkbox state - let completelyRemoveFilteredFeaturesFromDisplayChbState = kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay; - kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = true; // set checkbox true - // perform spatial filter - kommonitorFilterHelperService.applySpatialFilter_currentSpatialUnitFeatures(visibleAndNoDataFeaturesNames); - // set checkbox to previous state - kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = completelyRemoveFilteredFeaturesFromDisplayChbState; - - $scope.featuresWithoutValues = []; - } - - - /** - * binds the popup of a clicked output - * to layer.feature.properties.popupContent - */ - function onEachFeatureSpatialUnit(feature, layer) { - // does this feature have a property named popupContent? - layer.on({ - click: function () { - - // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; - - var popupContent = '
        '; - for (var p in feature.properties) { - popupContent += ''; - } - popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; - - layer.bindPopup(popupContent); - - // if (propertiesString) - // layer.bindPopup(propertiesString); + /** + * binds the popup of a clicked output + * to layer.feature.properties.popupContent + */ + function onEachFeatureGeoresource(feature, layer) { + // does this feature have a property named popupContent? + layer.on({ + click: function () { + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + '' + feature.properties[p] + '
        '; + layer.bindPopup(popupContent); + // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + // if (propertiesString) + // layer.bindPopup(propertiesString); + } + }); } - }); - } - - /** - * binds the popup of a clicked output - * to layer.feature.properties.popupContent - */ - function onEachFeatureGeoresource(feature, layer) { - // does this feature have a property named popupContent? - layer.on({ - click: function () { - - var popupContent = '
        '; - for (var p in feature.properties) { - popupContent += ''; - } - popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; - - layer.bindPopup(popupContent); - - // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; - - // if (propertiesString) - // layer.bindPopup(propertiesString); + /** + * binds the popup of a clicked output + * to layer.feature.properties.popupContent + */ + function onEachFeatureIndicator(feature, layer) { + var indicatorValue = feature.properties[INDICATOR_DATE_PREFIX + $scope.date]; + var indicatorValueText; + if (kommonitorDataExchangeService.indicatorValueIsNoData(indicatorValue)) { + indicatorValueText = "NoData"; + } + else { + indicatorValueText = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(indicatorValue); + } + var tooltipHtml = "" + feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] + "
        " + indicatorValueText + " [" + kommonitorDataExchangeService.selectedIndicator.unit + "]"; + layer.bindTooltip(tooltipHtml, { + sticky: false // If true, the tooltip will follow the mouse instead of being fixed at the feature center. + }); + layer.on({ + mouseover: highlightFeature, + mouseout: resetHighlight, + click: function () { + switchHighlightFeature(layer); + } + }); } - }); - } - - /** - * binds the popup of a clicked output - * to layer.feature.properties.popupContent - */ - function onEachFeatureIndicator(feature, layer) { - var indicatorValue = feature.properties[INDICATOR_DATE_PREFIX + $scope.date]; - var indicatorValueText; - if (kommonitorDataExchangeService.indicatorValueIsNoData(indicatorValue)) { - indicatorValueText = "NoData"; - } - else { - indicatorValueText = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(indicatorValue); - } - var tooltipHtml = "" + feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] + "
        " + indicatorValueText + " [" + kommonitorDataExchangeService.selectedIndicator.unit + "]"; - layer.bindTooltip(tooltipHtml, { - sticky: false // If true, the tooltip will follow the mouse instead of being fixed at the feature center. - }); - layer.on({ - mouseover: highlightFeature, - mouseout: resetHighlight, - click: function () { - switchHighlightFeature(layer); + function switchHighlightFeature(layer) { + // add or remove feature within a list of "clicked features" + // those shall be treated specially, i.e. keep being highlighted + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + kommonitorFilterHelperService.addFeatureToSelection(layer.feature); + highlightClickedFeature(layer); + } + else { + //remove from array + kommonitorFilterHelperService.removeFeatureFromSelection(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME]); + resetHighlightClickedFeature(layer); + } } - }); - } - - - - function switchHighlightFeature(layer) { - // add or remove feature within a list of "clicked features" - // those shall be treated specially, i.e. keep being highlighted - if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - kommonitorFilterHelperService.addFeatureToSelection(layer.feature); - highlightClickedFeature(layer); - } - - else { - //remove from array - kommonitorFilterHelperService.removeFeatureFromSelection(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME]); - resetHighlightClickedFeature(layer); - } - } - - function onEachFeatureCustomIndicator(feature, layer) { - // does this feature have a property named popupContent? - layer.on({ - mouseover: highlightFeature, - mouseout: resetHighlightCustom, - click: function () { - - var popupContent = layer.feature.properties; - - if (popupContent) - layer.bindPopup("Indicator: " + JSON.stringify(popupContent)); + function onEachFeatureCustomIndicator(feature, layer) { + // does this feature have a property named popupContent? + layer.on({ + mouseover: highlightFeature, + mouseout: resetHighlightCustom, + click: function () { + var popupContent = layer.feature.properties; + if (popupContent) + layer.bindPopup("Indicator: " + JSON.stringify(popupContent)); + } + }); } - }); - } - - - $scope.$on("addSpatialUnitAsGeopackage", function (event) { - - console.log('addSpatialUnitAsGeopackage was called'); - - var layer = L.geoPackageFeatureLayer([], { - geoPackageUrl: './test1234.gpkg', - layerName: 'test1234', - style: function (feature) { - return { - color: "#F00", - weight: 1, - opacity: 1 - }; - }, - onEachFeature: onEachFeatureSpatialUnit - }); - - // layer.StyledLayerControl = { - // removable : true, - // visible : true - // }; - - $scope.layerControl.addOverlay(layer, "GeoPackage", { groupName: spatialUnitLayerGroupName }); - layer.addTo($scope.map); - $scope.updateSearchControl(); - - - }); - - $scope.$on("addSpatialUnitAsGeoJSON", function (event, spatialUnitMetadataAndGeoJSON, date) { - - console.log('addSpatialUnitAsGeoJSON was called'); - - // if ($scope.layers.overlays[spatialUnitMetadataAndGeoJSON.spatialUnitLevel]) { - // delete $scope.layers.overlays[spatialUnitMetadataAndGeoJSON.spatialUnitLevel]; - // - // console.log($scope.layers.overlays); - // } - - var layer = L.geoJSON(spatialUnitMetadataAndGeoJSON.geoJSON, { - style: function (feature) { - return { - color: "blue", - weight: 1, - opacity: 1 - }; - }, - onEachFeature: onEachFeatureSpatialUnit - }); - - // layer.StyledLayerControl = { - // removable : true, - // visible : true - // }; - - $scope.layerControl.addOverlay(layer, spatialUnitMetadataAndGeoJSON.spatialUnitLevel + "_" + date, spatialUnitLayerGroupName); - layer.addTo($scope.map); - $scope.updateSearchControl(); - - }); - - $scope.$on("addGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { - - var layer = L.geoJSON(georesourceMetadataAndGeoJSON.geoJSON, { - style: function (feature) { - return { - color: "red", - weight: 1, - opacity: 1 - }; - }, - onEachFeature: onEachFeatureGeoresource - }); - - // layer.StyledLayerControl = { - // removable : false, - // visible : true - // }; - - $scope.layerControl.addOverlay(layer, georesourceMetadataAndGeoJSON.datasetName + "_" + date, georesourceLayerGroupName); - layer.addTo($scope.map); - $scope.updateSearchControl(); - - $scope.map.invalidateSize(true); - }); - - $scope.$on("replaceIsochronesAsGeoJSON", function (event, geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour) { - - if ($scope.isochronesLayer) { - $scope.layerControl.removeLayer($scope.isochronesLayer); - $scope.map.removeLayer($scope.isochronesLayer); - } - - $scope.isochronesLayer = L.featureGroup(); - - $scope.isochroneReachMode = reachMode; - var cutOffUnitValue = "Meter"; - var reachModeValue = "Distanz"; - if (reachMode === "time") { - cutOffUnitValue = "Minuten"; - reachModeValue = "Zeit"; - } - - var transitModeValue = "Passant"; - switch (transitMode) { - case "buffer": - transitModeValue = "Puffer (Luftlinie)"; - break; - case "cycling-regular": - transitModeValue = "Fahrrad"; - break; - case "driving-car": - transitModeValue = "PKW"; - break; - case "wheelchair": - transitModeValue = "Barrierefrei"; - break; - default: - transitModeValue = "Passant"; - } - - kommonitorDataExchangeService.isochroneLegend = { - transitMode: transitModeValue, - reachMode: reachModeValue, - speedInKilometersPerHour: speedInKilometersPerHour, - colorValueEntries: [], - cutOffValues: cutOffValues, - cutOffUnit: cutOffUnitValue - }; - - if (cutOffValues.length === 0) { - return; - } - else if (cutOffValues.length === 1) { - kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ - color: "green", - value: cutOffValues[0] - }]; - } - else if (cutOffValues.length === 2) { - kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ - color: "yellow", - value: cutOffValues[1] - }, - { - color: "green", - value: cutOffValues[0] - }]; - } - else if (cutOffValues.length === 3) { - kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ - color: "red", - value: cutOffValues[2] - }, - { - color: "yellow", - value: cutOffValues[1] - }, - { - color: "green", - value: cutOffValues[0] - }]; - } - else if (cutOffValues.length === 4) { - kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ - color: "red", - value: cutOffValues[3] - }, - { - color: "orange", - value: cutOffValues[2] - }, - { - color: "yellow", - value: cutOffValues[1] - }, - { - color: "green", - value: cutOffValues[0] - }]; - } - else if (cutOffValues.length === 5) { - kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ - color: "brown", - value: cutOffValues[4] - }, { - color: "red", - value: cutOffValues[3] - }, - { - color: "orange", - value: cutOffValues[2] - }, - { - color: "yellow", - value: cutOffValues[1] - }, - { - color: "green", - value: cutOffValues[0] - }]; - } - else { - kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ - color: "brown", - value: cutOffValues[4] - }, { - color: "red", - value: cutOffValues[3] - }, - { - color: "orange", - value: cutOffValues[2] - }, - { - color: "yellow", - value: cutOffValues[1] - }, - { - color: "green", - value: cutOffValues[0] - }]; - } - - if (useMultipleStartPoints && dissolveIsochrones) { - // merge intersecting isochrones of same cutOffValue - - // execute it 3 times in order to dissolve multiple intersections - geoJSON = mergeIntersectingIsochrones(geoJSON); - geoJSON = mergeIntersectingIsochrones(geoJSON); - geoJSON = mergeIntersectingIsochrones(geoJSON); - } - - // sort features to ensure correct z-order of layers (begin with smallest isochrones) - geoJSON.features.sort((a, b) => a.properties.value - b.properties.value); - - for (var index = geoJSON.features.length - 1; index >= 0; index--) { - - var styleIndex = getStyleIndexForFeature(geoJSON.features[index], kommonitorDataExchangeService.isochroneLegend.colorValueEntries, reachMode); - - var style = { - color: kommonitorDataExchangeService.isochroneLegend.colorValueEntries[styleIndex].color, - weight: 1, - opacity: 0.4, - fillOpacity: 0.3 + $scope.$on("addSpatialUnitAsGeopackage", function (event) { + console.log('addSpatialUnitAsGeopackage was called'); + var layer = L.geoPackageFeatureLayer([], { + geoPackageUrl: './test1234.gpkg', + layerName: 'test1234', + style: function (feature) { + return { + color: "#F00", + weight: 1, + opacity: 1 + }; + }, + onEachFeature: onEachFeatureSpatialUnit + }); + // layer.StyledLayerControl = { + // removable : true, + // visible : true + // }; + $scope.layerControl.addOverlay(layer, "GeoPackage", { groupName: spatialUnitLayerGroupName }); + layer.addTo($scope.map); + $scope.updateSearchControl(); + }); + $scope.$on("addSpatialUnitAsGeoJSON", function (event, spatialUnitMetadataAndGeoJSON, date) { + console.log('addSpatialUnitAsGeoJSON was called'); + // if ($scope.layers.overlays[spatialUnitMetadataAndGeoJSON.spatialUnitLevel]) { + // delete $scope.layers.overlays[spatialUnitMetadataAndGeoJSON.spatialUnitLevel]; + // + // console.log($scope.layers.overlays); + // } + var layer = L.geoJSON(spatialUnitMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + return { + color: "blue", + weight: 1, + opacity: 1 + }; + }, + onEachFeature: onEachFeatureSpatialUnit + }); + // layer.StyledLayerControl = { + // removable : true, + // visible : true + // }; + $scope.layerControl.addOverlay(layer, spatialUnitMetadataAndGeoJSON.spatialUnitLevel + "_" + date, spatialUnitLayerGroupName); + layer.addTo($scope.map); + $scope.updateSearchControl(); + }); + $scope.$on("addGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { + var layer = L.geoJSON(georesourceMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + return { + color: "red", + weight: 1, + opacity: 1 + }; + }, + onEachFeature: onEachFeatureGeoresource + }); + // layer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + $scope.layerControl.addOverlay(layer, georesourceMetadataAndGeoJSON.datasetName + "_" + date, georesourceLayerGroupName); + layer.addTo($scope.map); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); + }); + $scope.$on("replaceIsochronesAsGeoJSON", function (event, geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour) { + if ($scope.isochronesLayer) { + $scope.layerControl.removeLayer($scope.isochronesLayer); + $scope.map.removeLayer($scope.isochronesLayer); + } + $scope.isochronesLayer = L.featureGroup(); + $scope.isochroneReachMode = reachMode; + var cutOffUnitValue = "Meter"; + var reachModeValue = "Distanz"; + if (reachMode === "time") { + cutOffUnitValue = "Minuten"; + reachModeValue = "Zeit"; + } + var transitModeValue = "Passant"; + switch (transitMode) { + case "buffer": + transitModeValue = "Puffer (Luftlinie)"; + break; + case "cycling-regular": + transitModeValue = "Fahrrad"; + break; + case "driving-car": + transitModeValue = "PKW"; + break; + case "wheelchair": + transitModeValue = "Barrierefrei"; + break; + default: + transitModeValue = "Passant"; + } + kommonitorDataExchangeService.isochroneLegend = { + transitMode: transitModeValue, + reachMode: reachModeValue, + speedInKilometersPerHour: speedInKilometersPerHour, + colorValueEntries: [], + cutOffValues: cutOffValues, + cutOffUnit: cutOffUnitValue + }; + if (cutOffValues.length === 0) { + return; + } + else if (cutOffValues.length === 1) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "green", + value: cutOffValues[0] + }]; + } + else if (cutOffValues.length === 2) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + else if (cutOffValues.length === 3) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "red", + value: cutOffValues[2] + }, + { + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + else if (cutOffValues.length === 4) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "red", + value: cutOffValues[3] + }, + { + color: "orange", + value: cutOffValues[2] + }, + { + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + else if (cutOffValues.length === 5) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "brown", + value: cutOffValues[4] + }, { + color: "red", + value: cutOffValues[3] + }, + { + color: "orange", + value: cutOffValues[2] + }, + { + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + else { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "brown", + value: cutOffValues[4] + }, { + color: "red", + value: cutOffValues[3] + }, + { + color: "orange", + value: cutOffValues[2] + }, + { + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + if (useMultipleStartPoints && dissolveIsochrones) { + // merge intersecting isochrones of same cutOffValue + // execute it 3 times in order to dissolve multiple intersections + geoJSON = mergeIntersectingIsochrones(geoJSON); + geoJSON = mergeIntersectingIsochrones(geoJSON); + geoJSON = mergeIntersectingIsochrones(geoJSON); + } + // sort features to ensure correct z-order of layers (begin with smallest isochrones) + geoJSON.features.sort((a, b) => a.properties.value - b.properties.value); + for (var index = geoJSON.features.length - 1; index >= 0; index--) { + var styleIndex = getStyleIndexForFeature(geoJSON.features[index], kommonitorDataExchangeService.isochroneLegend.colorValueEntries, reachMode); + var style = { + color: kommonitorDataExchangeService.isochroneLegend.colorValueEntries[styleIndex].color, + weight: 1, + opacity: 0.4, + fillOpacity: 0.3 + }; + L.geoJSON(geoJSON.features[index], { + style: style, + onEachFeature: function (feature, layer) { + layer.on({ + click: function () { + var isochroneValue = layer.feature.properties.value; + if ($scope.isochroneReachMode === "time") { + //transform seconds to minutes + isochroneValue = isochroneValue / 60; + } + var popupContent = "" + isochroneValue + " " + cutOffUnitValue; + // var popupContent = "TestValue"; + if (popupContent) + layer.bindPopup("Isochrone: " + JSON.stringify(popupContent)); + } + }); + } + }).addTo($scope.isochronesLayer); + } + // $scope.isochronesLayer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + $scope.layerControl.addOverlay($scope.isochronesLayer, "Erreichbarkeits-Isochronen_" + transitModeValue, reachabilityLayerGroupName); + $scope.isochronesLayer.addTo($scope.map); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); + }); + $scope.$on("replaceRouteAsGeoJSON", function (event, geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, routeDistance_km, routeDuration_minutes) { + if ($scope.routingLayer) { + $scope.layerControl.removeLayer($scope.routingLayer); + $scope.map.removeLayer($scope.routingLayer); + } + var preferenceValue = "Schnellste"; + if (preference === "recommended") { + preferenceValue = "Empfohlen"; + } + else if (preference === "shortest") { + preferenceValue = "Kürzeste"; + } + var transitModeValue = "Passant"; + switch (transitMode) { + case "cycling-regular": + transitModeValue = "Fahrrad"; + break; + case "driving-car": + transitModeValue = "PKW"; + break; + case "wheelchair": + transitModeValue = "Barrierefrei"; + break; + default: + transitModeValue = "Passant"; + } + /* + routeDistance_km, routeDuration_minutes, routeAvgSpeed_kmh, + routeTotalAscent, routeTotalDescent + */ + kommonitorDataExchangeService.routingLegend = { + transitMode: transitModeValue, + preference: preferenceValue, + routingStartPoint: routingStartPoint, + routingEndPoint: routingEndPoint, + routeDistance_km: routeDistance_km, + routeDuration_minutes: routeDuration_minutes + }; + var style = { + color: "#ed561a", + weight: 5, + opacity: 0.7 + }; + $scope.routingLayer = L.featureGroup(); + // start and end point + var customStartMarker = L.AwesomeMarkers.icon({ + icon: "home", + iconColor: "white", + markerColor: "green" + }); + var customEndMarker = L.AwesomeMarkers.icon({ + icon: "screenshot", + iconColor: "white", + markerColor: "red" + }); + var numPoints = geoJSON.features[0].geometry.coordinates.length; + var startPoint = geoJSON.features[0].geometry.coordinates[0]; + var endPoint = geoJSON.features[0].geometry.coordinates[numPoints - 1]; + L.marker([startPoint[1], startPoint[0]], { icon: customStartMarker }).bindPopup(routingStartPoint.label).addTo($scope.routingLayer); + L.marker([endPoint[1], endPoint[0]], { icon: customEndMarker }).bindPopup(routingEndPoint.label).addTo($scope.routingLayer); + L.geoJSON(geoJSON, { + style: style, + onEachFeature: function (feature, layer) { + layer.on({ + click: function () { + var popupContent = "Routing Ergebnis - " + transitModeValue + " - " + preferenceValue; + // var popupContent = "TestValue"; + if (popupContent) + layer.bindPopup(JSON.stringify(popupContent)); + } + }); + } + }).addTo($scope.routingLayer); + // $scope.isochronesLayer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + $scope.layerControl.addOverlay($scope.routingLayer, "Routing-Ergebnis_" + transitModeValue + "_" + preferenceValue, reachabilityLayerGroupName); + $scope.routingLayer.addTo($scope.map); + $scope.map.fitBounds($scope.routingLayer.getBounds()); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); + }); + var getStyleIndexForFeature = function (feature, colorValueEntries, reachMode) { + var index = 0; + var featureCutOffValue = feature.properties.value; + if (reachMode === "time") { + // answe has time in seconds - we expect minutes! + featureCutOffValue = featureCutOffValue / 60; + } + for (var i = 0; i < colorValueEntries.length; i++) { + if (featureCutOffValue === colorValueEntries[i].value) { + index = i; + break; + } + } + return index; }; - - L.geoJSON(geoJSON.features[index], { - style: style, - onEachFeature: function (feature, layer) { - layer.on({ - click: function () { - - var isochroneValue = layer.feature.properties.value; - - if ($scope.isochroneReachMode === "time") { - //transform seconds to minutes - isochroneValue = isochroneValue / 60; - } - var popupContent = "" + isochroneValue + " " + cutOffUnitValue; - // var popupContent = "TestValue"; - - if (popupContent) - layer.bindPopup("Isochrone: " + JSON.stringify(popupContent)); - } + var mergeIntersectingIsochrones = function (geoJSON) { + // use turf to dissolve any overlapping/intersecting isochrones that have the same cutOffValue! + try { + var dissolved = turf.dissolve(geoJSON, { propertyName: 'value' }); + return dissolved; + } + catch (e) { + console.error("Dissolving Isochrones failed with error: " + e); + console.error("Will return undissolved isochrones"); + return geoJSON; + } + finally { + } + }; + $scope.$on("replaceIsochroneMarker", function (event, lonLatArray) { + if ($scope.isochroneMarkerLayer) { + $scope.layerControl.removeLayer($scope.isochroneMarkerLayer); + $scope.map.removeLayer($scope.isochroneMarkerLayer); + } + $scope.isochroneMarkerLayer = L.featureGroup(); + lonLatArray.forEach(function (lonLat) { + var layer = L.marker([lonLat[1], lonLat[0]]); + layer.bindPopup("Startpunkt der Isochronenberechnung"); + layer.addTo($scope.isochroneMarkerLayer); + }); + $scope.layerControl.addOverlay($scope.isochroneMarkerLayer, "Startpunkte für Isochronenberechnung", reachabilityLayerGroupName); + $scope.isochroneMarkerLayer.addTo($scope.map); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); + }); + var createCustomMarkersFromWfsPoints = function (wfsLayer, poiMarkerLayer, dataset) { + for (var layerPropName in wfsLayer._layers) { + var geoJSONFeature = wfsLayer._layers[layerPropName].feature; + var latlng = wfsLayer._layers[layerPropName]._latlng; + geoJSONFeature.geometry = { + type: "Point", + coordinates: [latlng.lng, latlng.lat] + }; + var customMarker = createCustomMarker(geoJSONFeature, dataset.poiSymbolColor, dataset.poiMarkerColor, dataset.poiSymbolBootstrap3Name, dataset); + poiMarkerLayer = addPoiMarker(poiMarkerLayer, customMarker); + } + return poiMarkerLayer; + }; + var createCustomMarker = function (poiFeature, poiSymbolColor, poiMarkerColor, poiSymbolBootstrap3Name, metadataObject) { + var customMarker; + try { + customMarker = L.AwesomeMarkers.icon({ + icon: poiSymbolBootstrap3Name, + iconColor: poiSymbolColor, + markerColor: poiMarkerColor + }); + } + catch (err) { + customMarker = L.AwesomeMarkers.icon({ + icon: 'home', + iconColor: poiSymbolColor, + markerColor: poiMarkerColor + }); + } + var newMarker; + if (poiFeature.geometry.type === "Point") { + // LAT LON order + newMarker = L.marker([Number(poiFeature.geometry.coordinates[1]), Number(poiFeature.geometry.coordinates[0])], { icon: customMarker }); + //populate the original geoJSOn feature to the marker layer! + newMarker.feature = poiFeature; + newMarker.metadataObject = metadataObject; + } + else if (poiFeature.geometry.type === "MultiPoint") { + // simply take the first point as feature reference POI + // LAT LON order + newMarker = L.marker([Number(poiFeature.geometry.coordinates[0][1]), Number(poiFeature.geometry.coordinates[0][0])], { icon: customMarker }); + //populate the original geoJSOn feature to the marker layer! + newMarker.feature = poiFeature; + newMarker.metadataObject = metadataObject; + } + else { + console.error("NO POI object: instead got feature of type " + poiFeature.geometry.type); + } + return newMarker; + }; + $scope.$on("addPoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date, useCluster) { + // use leaflet.markercluster to cluster markers! + var markers; + if (useCluster) { + markers = L.markerClusterGroup({ + iconCreateFunction: function (cluster) { + var childCount = cluster.getChildCount(); + var c = 'cluster-'; + if (childCount < 10) { + c += 'small'; + } + else if (childCount < 30) { + c += 'medium'; + } + else { + c += 'large'; + } + var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + georesourceMetadataAndGeoJSON.poiMarkerColor; + //'marker-cluster' + c + ' ' + + return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); + } + }); + } + else { + markers = L.layerGroup(); + } + georesourceMetadataAndGeoJSON.geoJSON.features.forEach(function (poiFeature) { + // index 0 should be longitude and index 1 should be latitude + //.bindPopup( poiFeature.properties.name ) + var newMarker = createCustomMarker(poiFeature, georesourceMetadataAndGeoJSON.poiSymbolColor, georesourceMetadataAndGeoJSON.poiMarkerColor, georesourceMetadataAndGeoJSON.poiSymbolBootstrap3Name, georesourceMetadataAndGeoJSON); + markers = addPoiMarker(markers, newMarker); + }); + // markers.StyledLayerControl = { + // removable : false, + // visible : true + // }; + $scope.layerControl.addOverlay(markers, georesourceMetadataAndGeoJSON.datasetName + "_" + date, poiLayerGroupName); + markers.addTo($scope.map); + $scope.updateSearchControl(); + // $scope.map.addLayer( markers ); + $scope.map.invalidateSize(true); + }); + $scope.$on("addPoiGeoresourceAsGeoJSON_reachabilityAnalysis", function (event, georesourceMetadataAndGeoJSON, date, useCluster) { + // use leaflet.markercluster to cluster markers! + var markers; + if (useCluster) { + markers = L.markerClusterGroup({ + iconCreateFunction: function (cluster) { + var childCount = cluster.getChildCount(); + var c = 'cluster-'; + if (childCount < 10) { + c += 'small'; + } + else if (childCount < 30) { + c += 'medium'; + } + else { + c += 'large'; + } + var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + georesourceMetadataAndGeoJSON.poiMarkerColor; + //'marker-cluster' + c + ' ' + + return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); + } + }); + } + else { + markers = L.layerGroup(); + } + georesourceMetadataAndGeoJSON.geoJSON.features.forEach(function (poiFeature) { + // index 0 should be longitude and index 1 should be latitude + //.bindPopup( poiFeature.properties.name ) + var newMarker = createCustomMarker(poiFeature, georesourceMetadataAndGeoJSON.poiSymbolColor, georesourceMetadataAndGeoJSON.poiMarkerColor, georesourceMetadataAndGeoJSON.poiSymbolBootstrap3Name, georesourceMetadataAndGeoJSON); + markers = addPoiMarker(markers, newMarker); + }); + // markers.StyledLayerControl = { + // removable : false, + // visible : true + // }; + $scope.layerControl.addOverlay(markers, georesourceMetadataAndGeoJSON.datasetName + "_" + date + "_inEinzugsgebiet", reachabilityLayerGroupName); + markers.addTo($scope.map); + $scope.updateSearchControl(); + // $scope.map.addLayer( markers ); + $scope.map.invalidateSize(true); + }); + var addPoiMarker = function (markers, poiMarker) { + // var propertiesString = "
        " + JSON.stringify(poiMarker.feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + var popupContent = '
        '; + for (var p in poiMarker.feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + '' + poiMarker.feature.properties[p] + '
        '; + if (poiMarker.feature.properties.name) { + poiMarker.bindPopup(poiMarker.feature.properties.name + "\n\n" + popupContent); + } + else if (poiMarker.feature.properties.NAME) { + poiMarker.bindPopup(poiMarker.feature.properties.NAME + "\n\n" + popupContent); + } + else if (poiMarker.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME]) { + poiMarker.bindPopup(poiMarker.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] + "\n\n" + popupContent); + } + else { + // poiMarker.bindPopup(propertiesString); + poiMarker.bindPopup(popupContent); + } + markers.addLayer(poiMarker); + return markers; + }; + $scope.$on("removePoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { + var layerName = georesourceMetadataAndGeoJSON.datasetName; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === poiLayerGroupName && layer.name.includes(layerName + "_")) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + $scope.updateSearchControl(); + } + }); + }); + $scope.$on("removePoiGeoresource_reachabilityAnalysis", function (event, georesourceMetadataAndGeoJSON) { + var layerName = georesourceMetadataAndGeoJSON.datasetName; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerName + "_")) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + $scope.updateSearchControl(); + } + }); + }); + $scope.$on("addAoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { + var color = georesourceMetadataAndGeoJSON.aoiColor; + var layer = L.geoJSON(georesourceMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + return { + fillColor: color, + color: "black", + weight: 1, + opacity: 1, + fillOpacity: 0.7 + }; + }, + onEachFeature: onEachFeatureGeoresource + }); + // layer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + $scope.layerControl.addOverlay(layer, georesourceMetadataAndGeoJSON.datasetName + "_" + date, aoiLayerGroupName); + layer.addTo($scope.map); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); + }); + $scope.$on("removeAoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { + var layerName = georesourceMetadataAndGeoJSON.datasetName; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === aoiLayerGroupName && layer.name.includes(layerName + "_")) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + $scope.updateSearchControl(); + } + }); + }); + $scope.$on("addLoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { + var color = georesourceMetadataAndGeoJSON.aoiColor; + var featureGroup = L.featureGroup(); + var style = { + color: georesourceMetadataAndGeoJSON.loiColor, + dashArray: georesourceMetadataAndGeoJSON.loiDashArrayString, + weight: georesourceMetadataAndGeoJSON.loiWidth || 3, + opacity: 1 + }; + georesourceMetadataAndGeoJSON.geoJSON.features.forEach((item, i) => { + var type = item.geometry.type; + if (type === "Polygon" || type === "MultiPolygon") { + var lines = turf.polygonToLine(item); + L.geoJSON(lines, { + style: style, + onEachFeature: onEachFeatureGeoresource + }).addTo(featureGroup); + } + else { + L.geoJSON(item, { + style: style, + onEachFeature: onEachFeatureGeoresource + }).addTo(featureGroup); + } + }); + // georesourceMetadataAndGeoJSON.geoJSON.features.forEach((loiFeature, i) => { + // var latLngs = + // var polyline = L.polyline(loiFeature.geometry.coordinates); + // + // var geoJSON = polyline.toGeoJSON(); + // + // var geoJSON_line = L.geoJSON(geoJSON, { + // style: style, + // onEachFeature: onEachFeatureGeoresource + // }) + // + // geoJSON_line.addTo(featureGroup); + // }); + // layer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + $scope.layerControl.addOverlay(featureGroup, georesourceMetadataAndGeoJSON.datasetName + "_" + date, loiLayerGroupName); + featureGroup.addTo($scope.map); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); + }); + $scope.$on("removeLoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { + var layerName = georesourceMetadataAndGeoJSON.datasetName; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === loiLayerGroupName && layer.name.includes(layerName + "_")) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + $scope.updateSearchControl(); + } + }); + }); + $scope.$on("adjustOpacityForIndicatorLayer", function (event, indicatorMetadata, opacity) { + // var layerName = indicatorMetadataAndGeoJSON.indicatorName; + // + // $scope.layerControl._layers.forEach(function(layer){ + // if(layer.group.name === indicatorLayerGroupName && layer.name.includes(layerName)){ + // layer.layer.setOpacity(opacity); + // layer.layer.setStyle({ + // opacity: opacity + // }); + // } + // }); + opacity = opacity.toFixed(numberOfDecimals); + kommonitorVisualStyleHelperService.setOpacity(opacity); + $rootScope.$broadcast("restyleCurrentLayer", true); + }); + $scope.$on("addWmsLayerToMap", function (event, dataset, opacity) { + var wmsLayer = L.tileLayer.betterWms(dataset.url, { + layers: dataset.layerName, + transparent: true, + format: 'image/png', + minZoom: __env.minZoomLevel, + maxZoom: __env.maxZoomLevel, + opacity: opacity + }); + $scope.layerControl.addOverlay(wmsLayer, dataset.title, wmsLayerGroupName); + wmsLayer.addTo($scope.map); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); + }); + $scope.$on("adjustOpacityForWmsLayer", function (event, dataset, opacity) { + var layerName = dataset.title; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wmsLayerGroupName && layer.name.includes(layerName)) { + layer.layer.setOpacity(opacity); + } + }); + }); + $scope.$on("adjustOpacityForAoiLayer", function (event, dataset, opacity) { + var layerName = dataset.datasetName; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === aoiLayerGroupName && layer.name.includes(layerName)) { + layer.layer.setStyle({ + fillOpacity: opacity, + opacity: opacity + }); + } + }); + }); + $scope.$on("adjustOpacityForLoiLayer", function (event, dataset, opacity) { + var layerName = dataset.datasetName; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === loiLayerGroupName && layer.name.includes(layerName)) { + layer.layer.setStyle({ + fillOpacity: opacity, + opacity: opacity + }); + } + }); + }); + $scope.$on("adjustOpacityForPoiLayer", function (event, dataset, opacity) { + var layerName = dataset.datasetName; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === poiLayerGroupName && layer.name.includes(layerName)) { + if (layer.layer._layers) { + for (var layerId in layer.layer._layers) { + layer.layer._layers[layerId].setOpacity(opacity); + } + } + else if (layer.layer._featureGroup) { + for (var layerId in layer.layer._featureGroup._layers) { + layer.layer._featureGroup._layers[layerId].setOpacity(opacity); + } + } + else { + layer.layer.setOpacity(opacity); + } + } + }); + }); + $scope.$on("removeWmsLayerFromMap", function (event, dataset) { + var layerName = dataset.title; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wmsLayerGroupName && layer.name.includes(layerName)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } + }); + }); + var getWfsStyle = function (dataset, opacity) { + if (dataset.geometryType === "POI") { + return { + weight: 1, + opacity: opacity, + color: dataset.poiMarkerColor, + dashArray: '', + fillOpacity: opacity, + fillColor: dataset.poiMarkerColor + }; + } + else if (dataset.geometryType === "LOI") { + return { + weight: dataset.loiWidth, + opacity: opacity, + color: dataset.loiColor, + dashArray: dataset.loiDashArrayString, + fillOpacity: opacity, + fillColor: dataset.loiColor + }; + } + else { + return { + weight: 1, + opacity: opacity, + color: dataset.aoiColor, + dashArray: '', + fillOpacity: opacity, + fillColor: dataset.aoiColor + }; + } + }; + $scope.getFilterEncoding = function (dataset) { + var filterExpressions = []; + if (dataset.filterEncoding.PropertyIsEqualTo && dataset.filterEncoding.PropertyIsEqualTo.propertyName && dataset.filterEncoding.PropertyIsEqualTo.propertyValue) { + filterExpressions.push(new L.Filter.EQ(dataset.filterEncoding.PropertyIsEqualTo.propertyName, dataset.filterEncoding.PropertyIsEqualTo.propertyValue)); + } + if (dataset.filterFeaturesToMapBBOX) { + filterExpressions.push(new L.Filter.BBox(dataset.featureTypeGeometryName, $scope.map.getBounds(), L.CRS.EPSG3857)); + } + if (filterExpressions.length == 0) { + return undefined; + } + if (filterExpressions.length < 2) { + return filterExpressions; + } + else { + // var stringifiedFilterExpressions = []; + // for (const filterExpr of filterExpressions) { + // stringifiedFilterExpressions.push(L.XmlUtil.serializeXmlDocumentString(filterExpr.toGml())); + // } + // return new L.Filter.And(...stringifiedFilterExpressions); + return new L.Filter.And(...filterExpressions); + } + }; + $scope.$on("addWfsLayerToMap", function (event, dataset, opacity, useCluster) { + var wfsLayerOptions = { + url: dataset.url, + typeNS: dataset.featureTypeNamespace, + namespaceUri: "http://mapserver.gis.umn.edu/mapserver", + typeName: dataset.featureTypeName, + geometryField: dataset.featureTypeGeometryName, + // maxFeatures: null, + style: getWfsStyle(dataset, opacity) + }; + var filterEncoding = $scope.getFilterEncoding(dataset); + if (filterEncoding) { + wfsLayerOptions.filter = filterEncoding; + } + var wfsLayer; + var poiMarkerLayer; + if (dataset.geometryType === "POI") { + if (useCluster) { + poiMarkerLayer = L.markerClusterGroup({ + iconCreateFunction: function (cluster) { + var childCount = cluster.getChildCount(); + var c = 'cluster-'; + if (childCount < 10) { + c += 'small'; + } + else if (childCount < 30) { + c += 'medium'; + } + else { + c += 'large'; + } + var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + dataset.poiMarkerColor; + //'marker-cluster' + c + ' ' + + return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); + } + }); + } + else { + poiMarkerLayer = L.layerGroup(); + } + wfsLayer = new L.WFS(wfsLayerOptions); + } + else { + wfsLayer = new L.WFS(wfsLayerOptions); + } + try { + wfsLayer.once('load', function () { + if (dataset.geometryType === "POI") { + poiMarkerLayer = createCustomMarkersFromWfsPoints(wfsLayer, poiMarkerLayer, dataset); + } + console.log("Try to fit bounds on wfsLayer"); + $scope.map.fitBounds(wfsLayer.getBounds()); + console.log("Tried fit bounds on wfsLayer"); + $scope.map.invalidateSize(true); + // $scope.loadingData = false; + }); + wfsLayer.on('click', function (event) { + // var propertiesString = "
        " + JSON.stringify(event.layer.feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + var popupContent = '
        '; + for (var p in event.layer.feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + '' + event.layer.feature.properties[p] + '
        '; + var popup = L.popup(); + popup + .setLatLng(event.latlng) + .setContent(popupContent) + .openOn($scope.map); + }); + if (poiMarkerLayer) { + $scope.layerControl.addOverlay(poiMarkerLayer, dataset.title, wfsLayerGroupName); + poiMarkerLayer.addTo($scope.map); + } + else { + $scope.layerControl.addOverlay(wfsLayer, dataset.title, wfsLayerGroupName); + wfsLayer.addTo($scope.map); + } + $scope.updateSearchControl(); + } + catch (error) { + $scope.loadingData = false; + kommonitorDataExchangeService.displayMapApplicationError(error); + } + }); + $scope.$on("adjustOpacityForWfsLayer", function (event, dataset, opacity) { + var layerName = dataset.title; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { + // layer.layer.setOpacity(opacity); + var newStyle = getWfsStyle(dataset, opacity); + // layer.layer.options.style = newStyle; + if (layer.layer._layers) { + for (var layerId in layer.layer._layers) { + if (dataset.geometryType === "POI") { + layer.layer._layers[layerId].setOpacity(opacity); + } + else { + layer.layer._layers[layerId].setStyle(newStyle); + } + } + } + else { + if (dataset.geometryType === "POI") { + layer.layer.setOpacity(opacity); + } + else { + layer.layer.setStyle(newStyle); + } + } + } }); - } - }).addTo($scope.isochronesLayer); - } - - // $scope.isochronesLayer.StyledLayerControl = { - // removable : false, - // visible : true - // }; - - $scope.layerControl.addOverlay($scope.isochronesLayer, "Erreichbarkeits-Isochronen_" + transitModeValue, reachabilityLayerGroupName); - $scope.isochronesLayer.addTo($scope.map); - $scope.updateSearchControl(); - - $scope.map.invalidateSize(true); - }); - - $scope.$on("replaceRouteAsGeoJSON", function (event, geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, - routeDistance_km, routeDuration_minutes) { - - if ($scope.routingLayer) { - $scope.layerControl.removeLayer($scope.routingLayer); - $scope.map.removeLayer($scope.routingLayer); - } - - var preferenceValue = "Schnellste"; - if (preference === "recommended") { - preferenceValue = "Empfohlen"; - } - else if (preference === "shortest") { - preferenceValue = "Kürzeste"; - } - - var transitModeValue = "Passant"; - switch (transitMode) { - case "cycling-regular": - transitModeValue = "Fahrrad"; - break; - case "driving-car": - transitModeValue = "PKW"; - break; - case "wheelchair": - transitModeValue = "Barrierefrei"; - break; - default: - transitModeValue = "Passant"; - } - - /* - routeDistance_km, routeDuration_minutes, routeAvgSpeed_kmh, - routeTotalAscent, routeTotalDescent - */ - - kommonitorDataExchangeService.routingLegend = { - transitMode: transitModeValue, - preference: preferenceValue, - routingStartPoint: routingStartPoint, - routingEndPoint: routingEndPoint, - routeDistance_km: routeDistance_km, - routeDuration_minutes: routeDuration_minutes - }; - - var style = { - color: "#ed561a", - weight: 5, - opacity: 0.7 - }; - - $scope.routingLayer = L.featureGroup(); - - // start and end point - var customStartMarker = L.AwesomeMarkers.icon({ - icon: "home", - iconColor: "white", - markerColor: "green" - }); - - var customEndMarker = L.AwesomeMarkers.icon({ - icon: "screenshot", - iconColor: "white", - markerColor: "red" - }); - - var numPoints = geoJSON.features[0].geometry.coordinates.length; - var startPoint = geoJSON.features[0].geometry.coordinates[0]; - var endPoint = geoJSON.features[0].geometry.coordinates[numPoints - 1]; - - L.marker([startPoint[1], startPoint[0]], { icon: customStartMarker }).bindPopup(routingStartPoint.label).addTo($scope.routingLayer); - L.marker([endPoint[1], endPoint[0]], { icon: customEndMarker }).bindPopup(routingEndPoint.label).addTo($scope.routingLayer); - - L.geoJSON(geoJSON, { - style: style, - onEachFeature: function (feature, layer) { - layer.on({ - click: function () { - var popupContent = "Routing Ergebnis - " + transitModeValue + " - " + preferenceValue; - // var popupContent = "TestValue"; - - if (popupContent) - layer.bindPopup(JSON.stringify(popupContent)); - } - }); - } - }).addTo($scope.routingLayer); - - // $scope.isochronesLayer.StyledLayerControl = { - // removable : false, - // visible : true - // }; - - $scope.layerControl.addOverlay($scope.routingLayer, "Routing-Ergebnis_" + transitModeValue + "_" + preferenceValue, reachabilityLayerGroupName); - $scope.routingLayer.addTo($scope.map); - $scope.map.fitBounds($scope.routingLayer.getBounds()); - $scope.updateSearchControl(); - - $scope.map.invalidateSize(true); - }); - - var getStyleIndexForFeature = function (feature, colorValueEntries, reachMode) { - var index = 0; - var featureCutOffValue = feature.properties.value; - - if (reachMode === "time") { - // answe has time in seconds - we expect minutes! - featureCutOffValue = featureCutOffValue / 60; - } - - for (var i = 0; i < colorValueEntries.length; i++) { - if (featureCutOffValue === colorValueEntries[i].value) { - index = i; - break; - } - } - - return index; - }; - - var mergeIntersectingIsochrones = function (geoJSON) { - // use turf to dissolve any overlapping/intersecting isochrones that have the same cutOffValue! - - try { - var dissolved = turf.dissolve(geoJSON, { propertyName: 'value' }); - - return dissolved; - } catch (e) { - console.error("Dissolving Isochrones failed with error: " + e); - console.error("Will return undissolved isochrones"); - return geoJSON; - } finally { - - } - - }; - - $scope.$on("replaceIsochroneMarker", function (event, lonLatArray) { - - if ($scope.isochroneMarkerLayer) { - $scope.layerControl.removeLayer($scope.isochroneMarkerLayer); - $scope.map.removeLayer($scope.isochroneMarkerLayer); - } - - $scope.isochroneMarkerLayer = L.featureGroup(); - - lonLatArray.forEach(function (lonLat) { - var layer = L.marker([lonLat[1], lonLat[0]]); - layer.bindPopup("Startpunkt der Isochronenberechnung"); - layer.addTo($scope.isochroneMarkerLayer); - }); - - $scope.layerControl.addOverlay($scope.isochroneMarkerLayer, "Startpunkte für Isochronenberechnung", reachabilityLayerGroupName); - $scope.isochroneMarkerLayer.addTo($scope.map); - $scope.updateSearchControl(); - - $scope.map.invalidateSize(true); - }); - - var createCustomMarkersFromWfsPoints = function(wfsLayer, poiMarkerLayer, dataset){ - for (var layerPropName in wfsLayer._layers){ - var geoJSONFeature = wfsLayer._layers[layerPropName].feature; - var latlng = wfsLayer._layers[layerPropName]._latlng; - - geoJSONFeature.geometry = { - type: "Point", - coordinates: [latlng.lng, latlng.lat] - }; - - var customMarker = createCustomMarker(geoJSONFeature, dataset.poiSymbolColor, dataset.poiMarkerColor, dataset.poiSymbolBootstrap3Name, dataset); - poiMarkerLayer = addPoiMarker(poiMarkerLayer, customMarker); - } - - return poiMarkerLayer; - }; - - var createCustomMarker = function(poiFeature, poiSymbolColor, poiMarkerColor, poiSymbolBootstrap3Name, metadataObject){ - var customMarker; - try { - customMarker = L.AwesomeMarkers.icon({ - icon: poiSymbolBootstrap3Name, - iconColor: poiSymbolColor, - markerColor: poiMarkerColor }); - } catch (err) { - customMarker = L.AwesomeMarkers.icon({ - icon: 'home', // default back to home - iconColor: poiSymbolColor, - markerColor: poiMarkerColor + $scope.$on("adjustColorForWfsLayer", function (event, dataset, opacity) { + var layerName = dataset.title; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { + var newStyle = getWfsStyle(dataset, opacity); + layer.layer.setStyle(newStyle); + } + }); }); - } - - var newMarker; - - if(poiFeature.geometry.type === "Point"){ - // LAT LON order - newMarker = L.marker([Number(poiFeature.geometry.coordinates[1]), Number(poiFeature.geometry.coordinates[0])], { icon: customMarker }); - - //populate the original geoJSOn feature to the marker layer! - newMarker.feature = poiFeature; - newMarker.metadataObject = metadataObject; - } - else if (poiFeature.geometry.type === "MultiPoint"){ - - // simply take the first point as feature reference POI - // LAT LON order - newMarker = L.marker([Number(poiFeature.geometry.coordinates[0][1]), Number(poiFeature.geometry.coordinates[0][0])], { icon: customMarker }); - - //populate the original geoJSOn feature to the marker layer! - newMarker.feature = poiFeature; - newMarker.metadataObject = metadataObject; - } - else{ - console.error("NO POI object: instead got feature of type " + poiFeature.geometry.type); - } - - return newMarker; - - }; - - $scope.$on("addPoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date, useCluster) { - - // use leaflet.markercluster to cluster markers! - var markers; - if (useCluster) { - markers = L.markerClusterGroup({ - iconCreateFunction: function (cluster) { - var childCount = cluster.getChildCount(); - - var c = 'cluster-'; - if (childCount < 10) { - c += 'small'; - } else if (childCount < 30) { - c += 'medium'; - } else { - c += 'large'; - } - - var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + georesourceMetadataAndGeoJSON.poiMarkerColor; - - //'marker-cluster' + c + ' ' + - return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); - } + $scope.$on("removeWfsLayerFromMap", function (event, dataset) { + var layerName = dataset.title; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } + }); }); - } - else { - markers = L.layerGroup(); - } - - georesourceMetadataAndGeoJSON.geoJSON.features.forEach(function (poiFeature) { - // index 0 should be longitude and index 1 should be latitude - //.bindPopup( poiFeature.properties.name ) - var newMarker = createCustomMarker(poiFeature, georesourceMetadataAndGeoJSON.poiSymbolColor, georesourceMetadataAndGeoJSON.poiMarkerColor, georesourceMetadataAndGeoJSON.poiSymbolBootstrap3Name, georesourceMetadataAndGeoJSON); - - markers = addPoiMarker(markers, newMarker); - }); - - // markers.StyledLayerControl = { - // removable : false, - // visible : true - // }; - - $scope.layerControl.addOverlay(markers, georesourceMetadataAndGeoJSON.datasetName + "_" + date, poiLayerGroupName); - markers.addTo($scope.map); - $scope.updateSearchControl(); - // $scope.map.addLayer( markers ); - $scope.map.invalidateSize(true); - }); - - $scope.$on("addPoiGeoresourceAsGeoJSON_reachabilityAnalysis", function (event, georesourceMetadataAndGeoJSON, date, useCluster) { - - // use leaflet.markercluster to cluster markers! - var markers; - if (useCluster) { - markers = L.markerClusterGroup({ - iconCreateFunction: function (cluster) { - var childCount = cluster.getChildCount(); - - var c = 'cluster-'; - if (childCount < 10) { - c += 'small'; - } else if (childCount < 30) { - c += 'medium'; - } else { - c += 'large'; - } - - var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + georesourceMetadataAndGeoJSON.poiMarkerColor; - - //'marker-cluster' + c + ' ' + - return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); - } + $scope.$on("addFileLayerToMap", function (event, dataset, opacity) { + var fileLayer; + var style = { + weight: 1, + opacity: opacity, + color: defaultBorderColor, + dashArray: '', + fillOpacity: 1, + fillColor: dataset.displayColor + }; + var fileType = dataset.type; + if (fileType.toUpperCase() === "geojson".toUpperCase()) { + var geoJSON = dataset.content; + if (isLinearGeoJSON(geoJSON)) { + // when is line dataset then set the border color + style.color = dataset.displayColor; + } + fileLayer = L.geoJSON(geoJSON, { + style: style, + onEachFeature: function (feature, layer) { + layer.on({ + click: function () { + // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + '' + feature.properties[p] + '
        '; + if (popupContent) + layer.bindPopup(popupContent); + } + }); + } + }); + $scope.showFileLayer(fileLayer, dataset); + } + else if (fileType.toUpperCase() === "shp".toUpperCase()) { + // transform shape ZIP arrayBuffer to GeoJSON + // var geoJSON = await shp(dataset.content).then( + // var zip = shp.parseZip(dataset.content); + shp(dataset.content).then(function (geojson) { + console.log("Shapefile parsed successfully"); + if (isLinearGeoJSON(geojson)) { + // when is line dataset then set the border color + style.color = dataset.displayColor; + } + fileLayer = L.geoJSON(geojson, { + style: style, + onEachFeature: function (feature, layer) { + layer.on({ + click: function () { + // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + '' + feature.properties[p] + '
        '; + if (popupContent) + layer.bindPopup(popupContent); + } + }); + } + }); + $scope.showFileLayer(fileLayer, dataset); + }, function (reason) { + console.error("Error while parsing Shapefile"); + console.error(reason); + $rootScope.$broadcast("FileLayerError", reason, dataset); + throw reason; + }); + } }); - } - else { - markers = L.layerGroup(); - } - - georesourceMetadataAndGeoJSON.geoJSON.features.forEach(function (poiFeature) { - // index 0 should be longitude and index 1 should be latitude - //.bindPopup( poiFeature.properties.name ) - var newMarker = createCustomMarker(poiFeature, georesourceMetadataAndGeoJSON.poiSymbolColor, georesourceMetadataAndGeoJSON.poiMarkerColor, georesourceMetadataAndGeoJSON.poiSymbolBootstrap3Name, georesourceMetadataAndGeoJSON); - - markers = addPoiMarker(markers, newMarker); - }); - - // markers.StyledLayerControl = { - // removable : false, - // visible : true - // }; - - $scope.layerControl.addOverlay(markers, georesourceMetadataAndGeoJSON.datasetName + "_" + date + "_inEinzugsgebiet", reachabilityLayerGroupName); - markers.addTo($scope.map); - $scope.updateSearchControl(); - // $scope.map.addLayer( markers ); - $scope.map.invalidateSize(true); - }); - - var addPoiMarker = function(markers, poiMarker){ - - // var propertiesString = "
        " + JSON.stringify(poiMarker.feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; - - var popupContent = '
        '; - for (var p in poiMarker.feature.properties) { - popupContent += ''; - } - popupContent += '
        ' + p + ''+ poiMarker.feature.properties[p] + '
        '; - - if (poiMarker.feature.properties.name) { - poiMarker.bindPopup(poiMarker.feature.properties.name + "\n\n" + popupContent); - } - else if (poiMarker.feature.properties.NAME) { - poiMarker.bindPopup(poiMarker.feature.properties.NAME + "\n\n" + popupContent); - } - else if (poiMarker.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME]) { - poiMarker.bindPopup(poiMarker.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] + "\n\n" + popupContent); - } - else { - // poiMarker.bindPopup(propertiesString); - poiMarker.bindPopup(popupContent); - } - markers.addLayer(poiMarker); - - return markers; - }; - - $scope.$on("removePoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { - - var layerName = georesourceMetadataAndGeoJSON.datasetName; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === poiLayerGroupName && layer.name.includes(layerName + "_")) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - $scope.updateSearchControl(); - } - }); - }); - - $scope.$on("removePoiGeoresource_reachabilityAnalysis", function (event, georesourceMetadataAndGeoJSON) { - - var layerName = georesourceMetadataAndGeoJSON.datasetName; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerName + "_")) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - $scope.updateSearchControl(); - } - }); - }); - - $scope.$on("addAoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { - - var color = georesourceMetadataAndGeoJSON.aoiColor; - - var layer = L.geoJSON(georesourceMetadataAndGeoJSON.geoJSON, { - style: function (feature) { - return { - fillColor: color, - color: "black", - weight: 1, - opacity: 1, - fillOpacity: 0.7 - }; - }, - onEachFeature: onEachFeatureGeoresource - }); - - // layer.StyledLayerControl = { - // removable : false, - // visible : true - // }; - - $scope.layerControl.addOverlay(layer, georesourceMetadataAndGeoJSON.datasetName + "_" + date, aoiLayerGroupName); - layer.addTo($scope.map); - $scope.updateSearchControl(); - - $scope.map.invalidateSize(true); - }); - - $scope.$on("removeAoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { - - var layerName = georesourceMetadataAndGeoJSON.datasetName; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === aoiLayerGroupName && layer.name.includes(layerName + "_")) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - $scope.updateSearchControl(); - } - }); - }); - - $scope.$on("addLoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { - - var color = georesourceMetadataAndGeoJSON.aoiColor; - - var featureGroup = L.featureGroup(); - - var style = { - color: georesourceMetadataAndGeoJSON.loiColor, - dashArray: georesourceMetadataAndGeoJSON.loiDashArrayString, - weight: georesourceMetadataAndGeoJSON.loiWidth || 3, - opacity: 1 - }; - - - - georesourceMetadataAndGeoJSON.geoJSON.features.forEach((item, i) => { - var type = item.geometry.type; - - if (type === "Polygon" || type === "MultiPolygon"){ - var lines = turf.polygonToLine(item); - - L.geoJSON(lines, { - style: style, - onEachFeature: onEachFeatureGeoresource - }).addTo(featureGroup); - } - else{ - L.geoJSON(item, { - style: style, - onEachFeature: onEachFeatureGeoresource - }).addTo(featureGroup); - } - }); - - // georesourceMetadataAndGeoJSON.geoJSON.features.forEach((loiFeature, i) => { - // var latLngs = - // var polyline = L.polyline(loiFeature.geometry.coordinates); - // - // var geoJSON = polyline.toGeoJSON(); - // - // var geoJSON_line = L.geoJSON(geoJSON, { - // style: style, - // onEachFeature: onEachFeatureGeoresource - // }) - // - // geoJSON_line.addTo(featureGroup); - // }); - - // layer.StyledLayerControl = { - // removable : false, - // visible : true - // }; - - $scope.layerControl.addOverlay(featureGroup, georesourceMetadataAndGeoJSON.datasetName + "_" + date, loiLayerGroupName); - featureGroup.addTo($scope.map); - $scope.updateSearchControl(); - - $scope.map.invalidateSize(true); - }); - - $scope.$on("removeLoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { - - var layerName = georesourceMetadataAndGeoJSON.datasetName; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === loiLayerGroupName && layer.name.includes(layerName + "_")) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - $scope.updateSearchControl(); - } - }); - }); - - $scope.$on("adjustOpacityForIndicatorLayer", function (event, indicatorMetadata, opacity) { - // var layerName = indicatorMetadataAndGeoJSON.indicatorName; - // - // $scope.layerControl._layers.forEach(function(layer){ - // if(layer.group.name === indicatorLayerGroupName && layer.name.includes(layerName)){ - // layer.layer.setOpacity(opacity); - // layer.layer.setStyle({ - // opacity: opacity - // }); - // } - // }); - - opacity = opacity.toFixed(numberOfDecimals); - - kommonitorVisualStyleHelperService.setOpacity(opacity); - $rootScope.$broadcast("restyleCurrentLayer", true); - }); - - $scope.$on("addWmsLayerToMap", function (event, dataset, opacity) { - var wmsLayer = L.tileLayer.betterWms(dataset.url, { - layers: dataset.layerName, - transparent: true, - format: 'image/png', - minZoom: __env.minZoomLevel, - maxZoom: __env.maxZoomLevel, - opacity: opacity - }); - - $scope.layerControl.addOverlay(wmsLayer, dataset.title, wmsLayerGroupName); - wmsLayer.addTo($scope.map); - $scope.updateSearchControl(); - $scope.map.invalidateSize(true); - }); - - $scope.$on("adjustOpacityForWmsLayer", function (event, dataset, opacity) { - var layerName = dataset.title; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === wmsLayerGroupName && layer.name.includes(layerName)) { - layer.layer.setOpacity(opacity); - } - }); - }); - - $scope.$on("adjustOpacityForAoiLayer", function (event, dataset, opacity) { - var layerName = dataset.datasetName; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === aoiLayerGroupName && layer.name.includes(layerName)) { - layer.layer.setStyle({ - fillOpacity:opacity, - opacity:opacity - }); - } - }); - }); - - $scope.$on("adjustOpacityForLoiLayer", function (event, dataset, opacity) { - var layerName = dataset.datasetName; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === loiLayerGroupName && layer.name.includes(layerName)) { - layer.layer.setStyle({ - fillOpacity:opacity, - opacity:opacity - }); - } - }); - }); - - $scope.$on("adjustOpacityForPoiLayer", function (event, dataset, opacity) { - var layerName = dataset.datasetName; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === poiLayerGroupName && layer.name.includes(layerName)) { - - if(layer.layer._layers){ - for(var layerId in layer.layer._layers){ - layer.layer._layers[layerId].setOpacity(opacity); - } - } - else if(layer.layer._featureGroup){ - for(var layerId in layer.layer._featureGroup._layers){ - layer.layer._featureGroup._layers[layerId].setOpacity(opacity); - } - } - else{ - layer.layer.setOpacity(opacity); - } - } - }); - }); - - $scope.$on("removeWmsLayerFromMap", function (event, dataset) { - - var layerName = dataset.title; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === wmsLayerGroupName && layer.name.includes(layerName)) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - } - }); - }); - - var getWfsStyle = function(dataset, opacity){ - - if(dataset.geometryType === "POI"){ - return { - weight: 1, - opacity: opacity, - color: dataset.poiMarkerColor, - dashArray: '', - fillOpacity: opacity, - fillColor: dataset.poiMarkerColor - }; - } - - else if (dataset.geometryType === "LOI"){ - return { - weight: dataset.loiWidth, - opacity: opacity, - color: dataset.loiColor, - dashArray: dataset.loiDashArrayString, - fillOpacity: opacity, - fillColor: dataset.loiColor + var isLinearGeoJSON = function (geoJSON) { + if (geoJSON.features) { + // featureCollection + if (geoJSON.features[0].geometry) { + if (geoJSON.features[0].geometry.type === "LineString" || geoJSON.features[0].geometry.type === "MultiLineString") { + return true; + } + } + } + else if (geoJSON.geometry) { + // single object + if (geoJSON.geometry.type === "LineString" || geoJSON.geometry.type === "MultiLineString") { + return true; + } + } + else if (geoJSON.geometries) { + // geometryCollection + if (geoJSON.geometries[0].type === "LineString" || geoJSON.geometries[0].type === "MultiLineString") { + return true; + } + } + return false; }; - } - - else{ - return { - weight: 1, - opacity: opacity, - color: dataset.aoiColor, - dashArray: '', - fillOpacity: opacity, - fillColor: dataset.aoiColor + $scope.showFileLayer = function (fileLayer, dataset) { + $scope.layerControl.addOverlay(fileLayer, dataset.title, fileLayerGroupName); + fileLayer.addTo($scope.map); + console.log("Try to fit bounds on fileLayer"); + $scope.map.fitBounds(fileLayer.getBounds()); + console.log("Tried fit bounds on fileLayer"); + $rootScope.$broadcast("FileLayerSuccess", dataset); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); }; - } - - }; - - $scope.getFilterEncoding = function(dataset){ - - var filterExpressions = []; - - if(dataset.filterEncoding.PropertyIsEqualTo && dataset.filterEncoding.PropertyIsEqualTo.propertyName && dataset.filterEncoding.PropertyIsEqualTo.propertyValue){ - filterExpressions.push(new L.Filter.EQ(dataset.filterEncoding.PropertyIsEqualTo.propertyName, dataset.filterEncoding.PropertyIsEqualTo.propertyValue)); - } - - if (dataset.filterFeaturesToMapBBOX) { - filterExpressions.push(new L.Filter.BBox(dataset.featureTypeGeometryName, $scope.map.getBounds(), L.CRS.EPSG3857)); - } - - if (filterExpressions.length == 0){ - return undefined; - } - - if (filterExpressions.length < 2){ - return filterExpressions; - } - else{ - // var stringifiedFilterExpressions = []; - - // for (const filterExpr of filterExpressions) { - // stringifiedFilterExpressions.push(L.XmlUtil.serializeXmlDocumentString(filterExpr.toGml())); - // } - - // return new L.Filter.And(...stringifiedFilterExpressions); - return new L.Filter.And(...filterExpressions); - } - - }; - - $scope.$on("addWfsLayerToMap", function (event, dataset, opacity, useCluster) { - var wfsLayerOptions = { - url: dataset.url, - typeNS: dataset.featureTypeNamespace, - namespaceUri: "http://mapserver.gis.umn.edu/mapserver", - typeName: dataset.featureTypeName, - geometryField: dataset.featureTypeGeometryName, - // maxFeatures: null, - style: getWfsStyle(dataset, opacity) - }; - - var filterEncoding = $scope.getFilterEncoding(dataset); - if (filterEncoding){ - wfsLayerOptions.filter = filterEncoding; - } - - - var wfsLayer; - var poiMarkerLayer; - - if(dataset.geometryType === "POI"){ - - if (useCluster) { - poiMarkerLayer = L.markerClusterGroup({ - iconCreateFunction: function (cluster) { - var childCount = cluster.getChildCount(); - - var c = 'cluster-'; - if (childCount < 10) { - c += 'small'; - } else if (childCount < 30) { - c += 'medium'; - } else { - c += 'large'; - } - - var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + dataset.poiMarkerColor; - - //'marker-cluster' + c + ' ' + - return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); - } - }); - } - else { - poiMarkerLayer = L.layerGroup(); - } - - wfsLayer = new L.WFS(wfsLayerOptions); - } - else{ - wfsLayer = new L.WFS(wfsLayerOptions); - } - - try { - wfsLayer.once('load', function () { - - if(dataset.geometryType === "POI"){ - poiMarkerLayer = createCustomMarkersFromWfsPoints(wfsLayer, poiMarkerLayer, dataset); - } - - console.log("Try to fit bounds on wfsLayer"); - $scope.map.fitBounds(wfsLayer.getBounds()); - - console.log("Tried fit bounds on wfsLayer"); - - $scope.map.invalidateSize(true); - // $scope.loadingData = false; + $scope.$on("adjustOpacityForFileLayer", function (event, dataset, opacity) { + var layerName = dataset.title; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { + var newStyle = { + weight: 1, + opacity: opacity, + color: defaultBorderColor, + dashArray: '', + fillOpacity: opacity, + fillColor: dataset.displayColor + }; + // layer.layer.options.style = newStyle; + layer.layer.setStyle(newStyle); + } + }); }); - - wfsLayer.on('click', function (event) { - // var propertiesString = "
        " + JSON.stringify(event.layer.feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; - - var popupContent = '
        '; - for (var p in event.layer.feature.properties) { - popupContent += ''; - } - popupContent += '
        ' + p + ''+ event.layer.feature.properties[p] + '
        '; - - var popup = L.popup(); - popup - .setLatLng(event.latlng) - .setContent(popupContent) - .openOn($scope.map); + $scope.$on("adjustColorForFileLayer", function (event, dataset) { + var layerName = dataset.title; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { + var newStyle = { + weight: 1, + color: defaultBorderColor, + dashArray: '', + fillColor: dataset.displayColor + }; + //var geoJSON = layer.layertoGeoJSON(); + var firstLayersPropertyName = Object.keys(layer.layer._layers)[0]; + if (firstLayersPropertyName) { + var geoJSON_exmaple = layer.layer._layers[firstLayersPropertyName].toGeoJSON(); + if (isLinearGeoJSON(geoJSON_exmaple)) { + newStyle.color = dataset.displayColor; + } + } + layer.layer.setStyle(newStyle); + } + }); }); - if(poiMarkerLayer){ - $scope.layerControl.addOverlay(poiMarkerLayer, dataset.title, wfsLayerGroupName); - poiMarkerLayer.addTo($scope.map); - } - else{ - $scope.layerControl.addOverlay(wfsLayer, dataset.title, wfsLayerGroupName); - wfsLayer.addTo($scope.map); - } - $scope.updateSearchControl(); - - } - catch (error) { - $scope.loadingData = false; - kommonitorDataExchangeService.displayMapApplicationError(error); - } - - }); - - $scope.$on("adjustOpacityForWfsLayer", function (event, dataset, opacity) { - var layerName = dataset.title; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { - // layer.layer.setOpacity(opacity); - var newStyle = getWfsStyle(dataset, opacity); - // layer.layer.options.style = newStyle; - if(layer.layer._layers){ - for(var layerId in layer.layer._layers){ - - - if(dataset.geometryType === "POI"){ - layer.layer._layers[layerId].setOpacity(opacity); - } - else{ - layer.layer._layers[layerId].setStyle(newStyle); - } - } - } - else{ - - if(dataset.geometryType === "POI"){ - layer.layer.setOpacity(opacity); - } - else{ - layer.layer.setStyle(newStyle); - } - } - - } - }); - }); - - $scope.$on("adjustColorForWfsLayer", function (event, dataset, opacity) { - var layerName = dataset.title; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { - var newStyle = getWfsStyle(dataset, opacity); - - layer.layer.setStyle(newStyle); - } - }); - }); - - $scope.$on("removeWfsLayerFromMap", function (event, dataset) { - - var layerName = dataset.title; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - } - }); - }); - - $scope.$on("addFileLayerToMap", function (event, dataset, opacity) { - var fileLayer; - - var style = { - weight: 1, - opacity: opacity, - color: defaultBorderColor, - dashArray: '', - fillOpacity: 1, - fillColor: dataset.displayColor - }; - - var fileType = dataset.type; - if (fileType.toUpperCase() === "geojson".toUpperCase()) { - var geoJSON = dataset.content; - - if (isLinearGeoJSON(geoJSON)) { - // when is line dataset then set the border color - style.color = dataset.displayColor; - } - - fileLayer = L.geoJSON(geoJSON, { - style: style, - onEachFeature: function (feature, layer) { - layer.on({ - click: function () { - - // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; - - var popupContent = '
        '; - for (var p in feature.properties) { - popupContent += ''; - } - popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; - - if (popupContent) - layer.bindPopup(popupContent); - } + $scope.$on("removeFileLayerFromMap", function (event, dataset) { + var layerName = dataset.title; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } }); - } }); - $scope.showFileLayer(fileLayer, dataset); - } - else if (fileType.toUpperCase() === "shp".toUpperCase()) { - // transform shape ZIP arrayBuffer to GeoJSON - // var geoJSON = await shp(dataset.content).then( - // var zip = shp.parseZip(dataset.content); - shp(dataset.content).then( - function (geojson) { - console.log("Shapefile parsed successfully"); - - if (isLinearGeoJSON(geojson)) { - // when is line dataset then set the border color - style.color = dataset.displayColor; - } - - fileLayer = L.geoJSON(geojson, { - style: style, - onEachFeature: function (feature, layer) { - layer.on({ - click: function () { - - // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; - - var popupContent = '
        '; - for (var p in feature.properties) { - popupContent += ''; - } - popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; - - if (popupContent) - layer.bindPopup(popupContent); - } - }); - } + $scope.$on("removeReachabilityLayers", function (event) { + var layerNamePartly = "Isochrone"; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerNamePartly)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } }); - - - $scope.showFileLayer(fileLayer, dataset); - }, - function (reason) { - console.error("Error while parsing Shapefile"); - console.error(reason); - $rootScope.$broadcast("FileLayerError", reason, dataset); - throw reason; - } - ); - } - - }); - - var isLinearGeoJSON = function (geoJSON) { - if (geoJSON.features) { - // featureCollection - if (geoJSON.features[0].geometry) { - if (geoJSON.features[0].geometry.type === "LineString" || geoJSON.features[0].geometry.type === "MultiLineString") { - return true; - } - } - } - else if (geoJSON.geometry) { - // single object - if (geoJSON.geometry.type === "LineString" || geoJSON.geometry.type === "MultiLineString") { - return true; - } - } - else if (geoJSON.geometries) { - // geometryCollection - if (geoJSON.geometries[0].type === "LineString" || geoJSON.geometries[0].type === "MultiLineString") { - return true; - } - } - - return false; - }; - - $scope.showFileLayer = function (fileLayer, dataset) { - $scope.layerControl.addOverlay(fileLayer, dataset.title, fileLayerGroupName); - fileLayer.addTo($scope.map); - - console.log("Try to fit bounds on fileLayer"); - $scope.map.fitBounds(fileLayer.getBounds()); - - console.log("Tried fit bounds on fileLayer"); - - $rootScope.$broadcast("FileLayerSuccess", dataset); - - $scope.updateSearchControl(); - - $scope.map.invalidateSize(true); - }; - - $scope.$on("adjustOpacityForFileLayer", function (event, dataset, opacity) { - var layerName = dataset.title; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { - var newStyle = { - weight: 1, - opacity: opacity, - color: defaultBorderColor, - dashArray: '', - fillOpacity: opacity, - fillColor: dataset.displayColor - }; - - // layer.layer.options.style = newStyle; - layer.layer.setStyle(newStyle); - } - }); - }); - - $scope.$on("adjustColorForFileLayer", function (event, dataset) { - var layerName = dataset.title; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { - var newStyle = { - weight: 1, - color: defaultBorderColor, - dashArray: '', - fillColor: dataset.displayColor - }; - - //var geoJSON = layer.layertoGeoJSON(); - var firstLayersPropertyName = Object.keys(layer.layer._layers)[0]; - if (firstLayersPropertyName) { - var geoJSON_exmaple = layer.layer._layers[firstLayersPropertyName].toGeoJSON(); - if (isLinearGeoJSON(geoJSON_exmaple)) { - newStyle.color = dataset.displayColor; - } - } - - layer.layer.setStyle(newStyle); - } - }); - }); - - $scope.$on("removeFileLayerFromMap", function (event, dataset) { - - var layerName = dataset.title; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - } - }); - }); - - $scope.$on("removeReachabilityLayers", function (event) { - - var layerNamePartly = "Isochrone"; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerNamePartly)) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - } - }); - }); - - $scope.$on("removeRoutingLayers", function (event) { - - var layerNamePartly = "Routing"; - - $scope.layerControl._layers.forEach(function (layer) { - if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerNamePartly)) { - $scope.layerControl.removeLayer(layer.layer); - $scope.map.removeLayer(layer.layer); - } - }); - }); - - function highlightFeature(e) { - var layer = e.target; - - highlightFeatureForLayer(layer); - } - - function highlightFeatureForLayer(layer) { - - setTemporarilyHighlightedStyle(layer); - - // update diagrams for hovered feature - $rootScope.$broadcast("updateDiagramsForHoveredFeature", layer.feature.properties); - - } - - function highlightClickedFeature(layer) { - - setPermanentlyHighlightedStyle(layer); - - // update diagrams for hovered feature - $rootScope.$broadcast("updateDiagramsForHoveredFeature", layer.feature.properties); - } - - function setPermanentlyHighlightedStyle(layer) { - var fillOpacity = 1; - if ($scope.useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacityForHighlightedFeatures; - } - - layer.setStyle({ - weight: 3, - color: defaultColorForClickedFeatures, - dashArray: '', - fillOpacity: fillOpacity - }); - - if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { - layer.bringToFront(); - // also bring possible isochrone layer to front - // so it will not disapper behing indicator layer - if ($scope.isochronesLayer) { - $scope.isochronesLayer.bringToFront(); + }); + $scope.$on("removeRoutingLayers", function (event) { + var layerNamePartly = "Routing"; + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerNamePartly)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } + }); + }); + function highlightFeature(e) { + var layer = e.target; + highlightFeatureForLayer(layer); } - } - } - - function setTemporarilyHighlightedStyle(layer) { - var fillOpacity = 1; - if ($scope.useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacity; - } - - layer.setStyle({ - weight: 3, - color: defaultColorForHoveredFeatures, - dashArray: '', - fillOpacity: fillOpacity - }); - - if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { - layer.bringToFront(); - // also bring possible isochrone layer to front - // so it will not disapper behing indicator layer - if ($scope.isochronesLayer) { - $scope.isochronesLayer.bringToFront(); + function highlightFeatureForLayer(layer) { + setTemporarilyHighlightedStyle(layer); + // update diagrams for hovered feature + $rootScope.$broadcast("updateDiagramsForHoveredFeature", layer.feature.properties); } - } - } - - function preserveHighlightedFeatures() { - $scope.map.eachLayer(function (layer) { - if (layer.feature) { - if (kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + function highlightClickedFeature(layer) { setPermanentlyHighlightedStyle(layer); + // update diagrams for hovered feature $rootScope.$broadcast("updateDiagramsForHoveredFeature", layer.feature.properties); - } - } - }); - } - - $scope.$on("preserveHighlightedFeatures", function (event) { - preserveHighlightedFeatures(); - }); - - function resetHighlight(e) { - var layer = e.target; - resetHighlightForLayer(layer); - - if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - layer.bringToBack(); - } - //layer.bringToBack(); - } - - function resetHighlightForLayer(layer) { - - var style; - - // only restyle feature when not in list of clicked features - if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - layer.setStyle($scope.filteredStyle); - } - else if (!kommonitorDataExchangeService.isMeasureOfValueChecked) { - //$scope.currentIndicatorLayer.resetStyle(layer); - if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { - style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); - - layer.setStyle(style); - } - else { - style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); - layer.setStyle(style); - } - } - else { - style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); - layer.setStyle(style); - } - } - else { - setPermanentlyHighlightedStyle(layer); - } - - //update diagrams for unhoveredFeature - $rootScope.$broadcast("updateDiagramsForUnhoveredFeature", layer.feature.properties); - } - - function resetHighlightClickedFeature(layer) { - var style; - //$scope.currentIndicatorLayer.resetStyle(layer); - if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - layer.setStyle($scope.filteredStyle); - } - else if (!kommonitorDataExchangeService.isMeasureOfValueChecked) { - //$scope.currentIndicatorLayer.resetStyle(layer); - if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { - style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); - - layer.setStyle(style); - } - else { - style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); - - layer.setStyle(style); } - } - else { - style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); - - layer.setStyle(style); - } - } - - function resetHighlightCustom(e) { - $scope.currentCustomIndicatorLayer.resetStyle(e.target); - if (!kommonitorFilterHelperService.featureIsCurrentlySelected(e.target.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - e.target.bringToBack(); - } - } - - var wait = ms => new Promise((r, j) => setTimeout(r, ms)) - - $scope.recenterMap = function () { - $scope.map.invalidateSize(true); - - fitBounds(); - - }; - - $scope.$on("recenterMapContent", function (event) { - $scope.recenterMap(); - }); - - $scope.$on("invalidateMapSize", function (event) { - $timeout(function(){ - $scope.map.invalidateSize(true); - }, 500); - }); - - $scope.$on("recenterMapOnHideSideBar", async function (event) { - //wait due to animation of the sidebar - - // make animation in 30 steps - // var waitForInMs = 30; - // for(var i=0; i<=300; i++){ - // - // i += waitForInMs; - // - // await wait(waitForInMs); - // - // $scope.map.invalidateSize(true); - // - // panToCenterOnInActiveMenue(500); - // // $scope.recenterMap(); - // } - - var waitForInMs = 100; - await wait(waitForInMs); - panToCenterOnInActiveMenue(500); - }); - - $scope.$on("recenterMapOnShowSideBar", async function (event) { - //wait due to animation of the sidebar - - // make animation in 30 steps - // var waitForInMs = 30; - // for(var i=0; i<=300; i++){ - // - // i += waitForInMs; - // - // await wait(waitForInMs); - // - // $scope.map.invalidateSize(true); - // - // panToCenterOnActiveMenue(500); - // // $scope.recenterMap(); - // } - - var waitForInMs = 100; - await wait(waitForInMs); - panToCenterOnActiveMenue(500); - - }); - - function panToCenterOnActiveMenue(numPixels) { - if ($scope.map) { - $scope.map.invalidateSize(true); - $scope.map.panBy(L.point(numPixels, 0)); - - $scope.map.invalidateSize(true); - } - }; - - function panToCenterOnInActiveMenue(numPixels) { - if ($scope.map) { - $scope.map.invalidateSize(true); - $scope.map.panBy(L.point(-numPixels, 0)); - - $scope.map.invalidateSize(true); - } - }; - - - function fitBounds() { - if ($scope.map && $scope.currentIndicatorLayer) { - - $scope.map.invalidateSize(true); - // $scope.map.setView(L.latLng($scope.latCenter, $scope.lonCenter), $scope.zoomLevel); - $scope.map.fitBounds($scope.currentIndicatorLayer.getBounds()); - } - - } - - function zoomToFeature(e) { - map.fitBounds(e.target.getBounds()); - } - - function markOutliers(indicatorMetadataAndGeoJSON, indicatorPropertyName) { - // identify possible data outliers - // mark them using a dedicated property - - $scope.outliers_high = []; - $scope.outliers_low = []; - - var valueArray = new Array(); - - indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { - if (!kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[indicatorPropertyName])) { - if (!valueArray.includes(feature.properties[indicatorPropertyName])) { - valueArray.push(feature.properties[indicatorPropertyName]); - } + function setPermanentlyHighlightedStyle(layer) { + var fillOpacity = 1; + if ($scope.useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacityForHighlightedFeatures; + } + layer.setStyle({ + weight: 3, + color: defaultColorForClickedFeatures, + dashArray: '', + fillOpacity: fillOpacity + }); + if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { + layer.bringToFront(); + // also bring possible isochrone layer to front + // so it will not disapper behing indicator layer + if ($scope.isochronesLayer) { + $scope.isochronesLayer.bringToFront(); + } + } } - }); - - // https://jstat.github.io/all.html#quartiles - var quartiles = jStat.quartiles(valueArray); - var quartile_25 = quartiles[0]; - var quartile_75 = quartiles[2]; - - var diff = quartile_75 - quartile_25; - var whiskerRange_outliers_soft = diff * 1.5; - var whiskerRange_outliers_extreme = diff * 3; - - var whisker_low_soft = quartile_25 - whiskerRange_outliers_soft; - var whisker_high_soft = quartile_75 + whiskerRange_outliers_soft; - - var whisker_low_extreme = quartile_25 - whiskerRange_outliers_extreme; - var whisker_high_extreme = quartile_75 + whiskerRange_outliers_extreme; - - // for now only mark extreme outliers! - - indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { - // compare feature value to whiskers and set property - if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[indicatorPropertyName])) { - feature.properties[outlierPropertyName] = outlierPropertyValue_no; + function setTemporarilyHighlightedStyle(layer) { + var fillOpacity = 1; + if ($scope.useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacity; + } + layer.setStyle({ + weight: 3, + color: defaultColorForHoveredFeatures, + dashArray: '', + fillOpacity: fillOpacity + }); + if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { + layer.bringToFront(); + // also bring possible isochrone layer to front + // so it will not disapper behing indicator layer + if ($scope.isochronesLayer) { + $scope.isochronesLayer.bringToFront(); + } + } } - else if (feature.properties[indicatorPropertyName] < whisker_low_extreme) { - feature.properties[outlierPropertyName] = outlierPropertyValue_low_extreme; - $scope.containsOutliers_low = true; - $scope.outliers_low.push(feature.properties[indicatorPropertyName]); + function preserveHighlightedFeatures() { + $scope.map.eachLayer(function (layer) { + if (layer.feature) { + if (kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + setPermanentlyHighlightedStyle(layer); + $rootScope.$broadcast("updateDiagramsForHoveredFeature", layer.feature.properties); + } + } + }); } - // else if (feature.properties[indicatorPropertyName] < whisker_low_soft){ - // feature.properties[outlierPropertyName] = outlierPropertyValue_low_soft; - // $scope.containsOutliers_low = true; - // $scope.outliers_low.push(feature.properties[indicatorPropertyName]); - // } - else if (feature.properties[indicatorPropertyName] > whisker_high_extreme) { - feature.properties[outlierPropertyName] = outlierPropertyValue_high_extreme; - $scope.containsOutliers_high = true; - $scope.outliers_high.push(feature.properties[indicatorPropertyName]); + $scope.$on("preserveHighlightedFeatures", function (event) { + preserveHighlightedFeatures(); + }); + function resetHighlight(e) { + var layer = e.target; + resetHighlightForLayer(layer); + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.bringToBack(); + } + //layer.bringToBack(); + } + function resetHighlightForLayer(layer) { + var style; + // only restyle feature when not in list of clicked features + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else if (!kommonitorDataExchangeService.isMeasureOfValueChecked) { + //$scope.currentIndicatorLayer.resetStyle(layer); + if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { + style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + layer.setStyle(style); + } + else { + style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); + layer.setStyle(style); + } + } + else { + style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + layer.setStyle(style); + } + } + else { + setPermanentlyHighlightedStyle(layer); + } + //update diagrams for unhoveredFeature + $rootScope.$broadcast("updateDiagramsForUnhoveredFeature", layer.feature.properties); } - // else if (feature.properties[indicatorPropertyName] > whisker_high_soft){ - // feature.properties[outlierPropertyName] = outlierPropertyValue_high_soft; - // $scope.containsOutliers_high = true; - // $scope.outliers_high.push(feature.properties[indicatorPropertyName]); - // } - else { - feature.properties[outlierPropertyName] = outlierPropertyValue_no; + function resetHighlightClickedFeature(layer) { + var style; + //$scope.currentIndicatorLayer.resetStyle(layer); + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else if (!kommonitorDataExchangeService.isMeasureOfValueChecked) { + //$scope.currentIndicatorLayer.resetStyle(layer); + if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { + style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + layer.setStyle(style); + } + else { + style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); + layer.setStyle(style); + } + } + else { + style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + layer.setStyle(style); + } } - }); - - // sort outliers arrays - $scope.outliers_high.sort(function (a, b) { - return a - b; - }); - $scope.outliers_low.sort(function (a, b) { - return a - b; - }); - - return indicatorMetadataAndGeoJSON; - } - - $scope.setNoDataValuesAsNull = function (indicatorMetadataAndGeoJSON) { - indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { - if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[$scope.indicatorPropertyName])) { - feature.properties[$scope.indicatorPropertyName] = null; + function resetHighlightCustom(e) { + $scope.currentCustomIndicatorLayer.resetStyle(e.target); + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(e.target.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + e.target.bringToBack(); + } } - }); - - return indicatorMetadataAndGeoJSON; - } - - $scope.$on("replaceIndicatorAsGeoJSON", function (event, indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation) { - - console.log('replaceIndicatorAsGeoJSON was called'); - - kommonitorVisualStyleHelperService.isCustomComputation = false; - if (isCustomComputation){ - kommonitorVisualStyleHelperService.isCustomComputation = true; - } - - //reset opacity - kommonitorVisualStyleHelperService.setOpacity(__env.defaultFillOpacity); - - refreshFilteredStyle(); - refreshOutliersStyle(); - refreshNoDataStyle(); - - $scope.defaultBrew = new classyBrew(); - $scope.gtMeasureOfValueBrew = new classyBrew(); - $scope.ltMeasureOfValueBrew = new classyBrew(); - - $scope.currentIndicatorMetadataAndGeoJSON = indicatorMetadataAndGeoJSON; - - if (!justRestyling) { - // empty layer of possibly selected features - // kommonitorFilterHelperService.clearSelectedFeatures(); - // kommonitorFilterHelperService.clearFilteredFeatures(); - - $rootScope.$broadcast("checkBalanceMenueAndButton"); - } - - console.log("Remove old indicatorLayer if exists"); - if ($scope.currentIndicatorLayer) { - $scope.layerControl.removeLayer($scope.currentIndicatorLayer); - $scope.map.removeLayer($scope.currentIndicatorLayer); - } - - $scope.currentIndicatorContainsZeroValues = false; - - $scope.date = date; - - $scope.indicatorPropertyName = INDICATOR_DATE_PREFIX + date; - $scope.indicatorName = indicatorMetadataAndGeoJSON.indicatorName; - $scope.indicatorDescription = indicatorMetadataAndGeoJSON.metadata.description; - $scope.indicatorUnit = indicatorMetadataAndGeoJSON.unit; - - $scope.currentIndicatorMetadataAndGeoJSON = $scope.setNoDataValuesAsNull($scope.currentIndicatorMetadataAndGeoJSON); - - // identify and mark outliers prior to setting up of styling - // in styling methods, outliers should be removed from classification! - $scope.currentIndicatorMetadataAndGeoJSON = markOutliers($scope.currentIndicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); - - kommonitorDataExchangeService.setAllFeaturesProperty(indicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); - kommonitorDataExchangeService.setSelectedFeatureProperty(kommonitorFilterHelperService.selectedIndicatorFeatureIds, $scope.indicatorPropertyName); - - $scope.currentGeoJSONOfCurrentLayer = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON; - - for (var i = 0; i < indicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { - var containsZero = false; - var containsNoData = false; - if (indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === 0 || indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === "0") { - $scope.currentIndicatorContainsZeroValues = true; - containsZero = true; + var wait = ms => new Promise((r, j) => setTimeout(r, ms)); + $scope.recenterMap = function () { + $scope.map.invalidateSize(true); + fitBounds(); }; - - if (kommonitorDataExchangeService.indicatorValueIsNoData(indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { - $scope.currentIndicatorContainsNoDataValues = true; - containsNoData = true; - }; - - if (containsZero && containsNoData) { - break; - } - } - - /* ///////////////////////////////// RASTER SPECIAL TREATMENT - // improve Raster display by eliminiating NoData cells and - // omitting display border in style - */ - - if(kommonitorDataExchangeService.selectedSpatialUnitIsRaster()){ - indicatorMetadataAndGeoJSON.geoJSON.features = indicatorMetadataAndGeoJSON.geoJSON.features.filter(feature => { - if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[$scope.indicatorPropertyName])) { - return false; - } - return true; + $scope.$on("recenterMapContent", function (event) { + $scope.recenterMap(); }); - } - - var layer; - - $scope.indicatorTypeOfCurrentLayer = indicatorMetadataAndGeoJSON.indicatorType; - - if (kommonitorDataExchangeService.isMeasureOfValueChecked) { - var measureOfValueBrewArray = kommonitorVisualStyleHelperService.setupMeasureOfValueBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, defaultColorBrewerPaletteForGtMovValues, defaultColorBrewerPaletteForLtMovValues, kommonitorVisualStyleHelperService.classifyMethod, kommonitorDataExchangeService.measureOfValue); - $scope.gtMeasureOfValueBrew = measureOfValueBrewArray[0]; - $scope.ltMeasureOfValueBrew = measureOfValueBrewArray[1]; - - $scope.propertyName = INDICATOR_DATE_PREFIX + date; - - layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { - style: function (feature) { - if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - return $scope.filteredStyle; - } - return kommonitorVisualStyleHelperService.styleMeasureOfValue(feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); - }, - onEachFeature: onEachFeatureIndicator + $scope.$on("invalidateMapSize", function (event) { + $timeout(function () { + $scope.map.invalidateSize(true); + }, 500); }); - - // $scope.makeMeasureOfValueLegend(isCustomComputation); - - } - else { - - if (indicatorMetadataAndGeoJSON.indicatorType.includes("STATUS")) { - $scope.datasetContainsNegativeValues = $scope.containsNegativeValues(indicatorMetadataAndGeoJSON.geoJSON); - if ($scope.datasetContainsNegativeValues) { - var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); - $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; - $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; - - } - else { - $scope.defaultBrew = kommonitorVisualStyleHelperService.setupDefaultBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, indicatorMetadataAndGeoJSON.defaultClassificationMapping.items.length, indicatorMetadataAndGeoJSON.defaultClassificationMapping.colorBrewerSchemeName, kommonitorVisualStyleHelperService.classifyMethod); - } - $scope.propertyName = INDICATOR_DATE_PREFIX + date; - - layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { - style: function (feature) { - if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - return $scope.filteredStyle; - } - return kommonitorVisualStyleHelperService.styleDefault(feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); - }, - onEachFeature: onEachFeatureIndicator - }); - // $scope.makeDefaultLegend(indicatorMetadataAndGeoJSON.defaultClassificationMapping, $scope.datasetContainsNegativeValues, isCustomComputation); + $scope.$on("recenterMapOnHideSideBar", async function (event) { + //wait due to animation of the sidebar + // make animation in 30 steps + // var waitForInMs = 30; + // for(var i=0; i<=300; i++){ + // + // i += waitForInMs; + // + // await wait(waitForInMs); + // + // $scope.map.invalidateSize(true); + // + // panToCenterOnInActiveMenue(500); + // // $scope.recenterMap(); + // } + var waitForInMs = 100; + await wait(waitForInMs); + panToCenterOnInActiveMenue(500); + }); + $scope.$on("recenterMapOnShowSideBar", async function (event) { + //wait due to animation of the sidebar + // make animation in 30 steps + // var waitForInMs = 30; + // for(var i=0; i<=300; i++){ + // + // i += waitForInMs; + // + // await wait(waitForInMs); + // + // $scope.map.invalidateSize(true); + // + // panToCenterOnActiveMenue(500); + // // $scope.recenterMap(); + // } + var waitForInMs = 100; + await wait(waitForInMs); + panToCenterOnActiveMenue(500); + }); + function panToCenterOnActiveMenue(numPixels) { + if ($scope.map) { + $scope.map.invalidateSize(true); + $scope.map.panBy(L.point(numPixels, 0)); + $scope.map.invalidateSize(true); + } } - else if (indicatorMetadataAndGeoJSON.indicatorType.includes("DYNAMIC")) { - var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); - $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; - $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; - - $scope.propertyName = INDICATOR_DATE_PREFIX + date; - - layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { - style: function(feature){ - if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - return $scope.filteredStyle; - } - return kommonitorVisualStyleHelperService.styleDynamicIndicator(feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); - }, - onEachFeature: onEachFeatureIndicator - }); - // $scope.makeDynamicIndicatorLegend(isCustomComputation); + ; + function panToCenterOnInActiveMenue(numPixels) { + if ($scope.map) { + $scope.map.invalidateSize(true); + $scope.map.panBy(L.point(-numPixels, 0)); + $scope.map.invalidateSize(true); + } } - - - } - - $scope.currentIndicatorLayer = layer; - - $rootScope.$broadcast("updateLegendDisplay", $scope.currentIndicatorContainsZeroValues, $scope.datasetContainsNegativeValues, $scope.currentIndicatorContainsNoDataValues, $scope.containsOutliers_high, $scope.containsOutliers_low, $scope.outliers_low, $scope.outliers_high, kommonitorDataExchangeService.selectedDate); - - // if(spatialUnitName.includes("raster") || spatialUnitName.includes("Raster") || spatialUnitName.includes("grid") || spatialUnitName.includes("Grid")){ - // layer.style.color = undefined; - // } - - - - // layer.StyledLayerControl = { - // removable : false, - // visible : true - // }; - - var layerName = indicatorMetadataAndGeoJSON.indicatorName + "_" + spatialUnitName + "_" + date; - - if (isCustomComputation) { - layerName += " - individuelles Berechnungsergebnis"; - } - $scope.layerControl.addOverlay(layer, layerName, indicatorLayerGroupName); - layer.addTo($scope.map); - $scope.updateSearchControl(); - - // var justRestyling = false; - - // fitBounds(); - - if ($scope.containsOutliers_low || $scope.containsOutliers_high) { - $scope.showOutlierInfoAlert = true; - } - - $rootScope.$broadcast("updateDiagrams", $scope.currentIndicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitId, date, $scope.defaultBrew, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, kommonitorDataExchangeService.isMeasureOfValueChecked, kommonitorDataExchangeService.measureOfValue, justRestyling); - $rootScope.$broadcast("indicatortMapDisplayFinished"); - - $scope.map.invalidateSize(true); - }); - - $scope.containsNegativeValues = function (geoJSON) { - - var containsNegativeValues = false; - $scope.datasetContainsNegativeValues = false; - for (var i = 0; i < geoJSON.features.length; i++) { - if (geoJSON.features[i].properties[$scope.indicatorPropertyName] < 0) { - containsNegativeValues = true; - break; + ; + function fitBounds() { + if ($scope.map && $scope.currentIndicatorLayer) { + $scope.map.invalidateSize(true); + // $scope.map.setView(L.latLng($scope.latCenter, $scope.lonCenter), $scope.zoomLevel); + $scope.map.fitBounds($scope.currentIndicatorLayer.getBounds()); + } } - } - - return containsNegativeValues; - }; - - $scope.$on("restyleCurrentLayer", function (event, skipDiagramRefresh) { - - // var transparency = document.getElementById("indicatorTransparencyInput").value; - // var opacity = 1 - transparency; - // - // kommonitorVisualStyleHelperService.setOpacity(opacity); - - refreshFilteredStyle(); - refreshOutliersStyle(); - refreshNoDataStyle(); - - $scope.defaultBrew = new classyBrew(); - $scope.gtMeasureOfValueBrew = new classyBrew(); - $scope.ltMeasureOfValueBrew = new classyBrew(); - - var style; - if ($scope.currentIndicatorLayer) { - - $scope.currentIndicatorMetadataAndGeoJSON = markOutliers($scope.currentIndicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); - $scope.currentGeoJSONOfCurrentLayer = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON; - - $scope.currentIndicatorContainsZeroValues = false; - - for (var i = 0; i < $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { - var containsZero = false; - var containsNoData = false; - if ($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === 0 || $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === "0") { - $scope.currentIndicatorContainsZeroValues = true; - containsZero = true; - }; - - if (kommonitorDataExchangeService.indicatorValueIsNoData($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { - $scope.currentIndicatorContainsNoDataValues = true; - containsNoData = true; - }; - - if (containsZero && containsNoData) { - break; - } + function zoomToFeature(e) { + map.fitBounds(e.target.getBounds()); + } + function markOutliers(indicatorMetadataAndGeoJSON, indicatorPropertyName) { + // identify possible data outliers + // mark them using a dedicated property + $scope.outliers_high = []; + $scope.outliers_low = []; + var valueArray = new Array(); + indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { + if (!kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[indicatorPropertyName])) { + if (!valueArray.includes(feature.properties[indicatorPropertyName])) { + valueArray.push(feature.properties[indicatorPropertyName]); + } + } + }); + // https://jstat.github.io/all.html#quartiles + var quartiles = jStat.quartiles(valueArray); + var quartile_25 = quartiles[0]; + var quartile_75 = quartiles[2]; + var diff = quartile_75 - quartile_25; + var whiskerRange_outliers_soft = diff * 1.5; + var whiskerRange_outliers_extreme = diff * 3; + var whisker_low_soft = quartile_25 - whiskerRange_outliers_soft; + var whisker_high_soft = quartile_75 + whiskerRange_outliers_soft; + var whisker_low_extreme = quartile_25 - whiskerRange_outliers_extreme; + var whisker_high_extreme = quartile_75 + whiskerRange_outliers_extreme; + // for now only mark extreme outliers! + indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { + // compare feature value to whiskers and set property + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[indicatorPropertyName])) { + feature.properties[outlierPropertyName] = outlierPropertyValue_no; + } + else if (feature.properties[indicatorPropertyName] < whisker_low_extreme) { + feature.properties[outlierPropertyName] = outlierPropertyValue_low_extreme; + $scope.containsOutliers_low = true; + $scope.outliers_low.push(feature.properties[indicatorPropertyName]); + } + // else if (feature.properties[indicatorPropertyName] < whisker_low_soft){ + // feature.properties[outlierPropertyName] = outlierPropertyValue_low_soft; + // $scope.containsOutliers_low = true; + // $scope.outliers_low.push(feature.properties[indicatorPropertyName]); + // } + else if (feature.properties[indicatorPropertyName] > whisker_high_extreme) { + feature.properties[outlierPropertyName] = outlierPropertyValue_high_extreme; + $scope.containsOutliers_high = true; + $scope.outliers_high.push(feature.properties[indicatorPropertyName]); + } + // else if (feature.properties[indicatorPropertyName] > whisker_high_soft){ + // feature.properties[outlierPropertyName] = outlierPropertyValue_high_soft; + // $scope.containsOutliers_high = true; + // $scope.outliers_high.push(feature.properties[indicatorPropertyName]); + // } + else { + feature.properties[outlierPropertyName] = outlierPropertyValue_no; + } + }); + // sort outliers arrays + $scope.outliers_high.sort(function (a, b) { + return a - b; + }); + $scope.outliers_low.sort(function (a, b) { + return a - b; + }); + return indicatorMetadataAndGeoJSON; } - - if (kommonitorDataExchangeService.isMeasureOfValueChecked) { - var measureOfValueBrewArray = kommonitorVisualStyleHelperService.setupMeasureOfValueBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, defaultColorBrewerPaletteForGtMovValues, defaultColorBrewerPaletteForLtMovValues, kommonitorVisualStyleHelperService.classifyMethod, kommonitorDataExchangeService.measureOfValue); - $scope.gtMeasureOfValueBrew = measureOfValueBrewArray[0]; - $scope.ltMeasureOfValueBrew = measureOfValueBrewArray[1]; - - $scope.currentIndicatorLayer.eachLayer(function (layer) { - if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - layer.setStyle($scope.filteredStyle); + $scope.setNoDataValuesAsNull = function (indicatorMetadataAndGeoJSON) { + indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[$scope.indicatorPropertyName])) { + feature.properties[$scope.indicatorPropertyName] = null; + } + }); + return indicatorMetadataAndGeoJSON; + }; + $scope.$on("replaceIndicatorAsGeoJSON", function (event, indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation) { + console.log('replaceIndicatorAsGeoJSON was called'); + kommonitorVisualStyleHelperService.isCustomComputation = false; + if (isCustomComputation) { + kommonitorVisualStyleHelperService.isCustomComputation = true; + } + //reset opacity + kommonitorVisualStyleHelperService.setOpacity(__env.defaultFillOpacity); + refreshFilteredStyle(); + refreshOutliersStyle(); + refreshNoDataStyle(); + $scope.defaultBrew = new classyBrew(); + $scope.gtMeasureOfValueBrew = new classyBrew(); + $scope.ltMeasureOfValueBrew = new classyBrew(); + $scope.currentIndicatorMetadataAndGeoJSON = indicatorMetadataAndGeoJSON; + if (!justRestyling) { + // empty layer of possibly selected features + // kommonitorFilterHelperService.clearSelectedFeatures(); + // kommonitorFilterHelperService.clearFilteredFeatures(); + $rootScope.$broadcast("checkBalanceMenueAndButton"); + } + console.log("Remove old indicatorLayer if exists"); + if ($scope.currentIndicatorLayer) { + $scope.layerControl.removeLayer($scope.currentIndicatorLayer); + $scope.map.removeLayer($scope.currentIndicatorLayer); + } + $scope.currentIndicatorContainsZeroValues = false; + $scope.date = date; + $scope.indicatorPropertyName = INDICATOR_DATE_PREFIX + date; + $scope.indicatorName = indicatorMetadataAndGeoJSON.indicatorName; + $scope.indicatorDescription = indicatorMetadataAndGeoJSON.metadata.description; + $scope.indicatorUnit = indicatorMetadataAndGeoJSON.unit; + $scope.currentIndicatorMetadataAndGeoJSON = $scope.setNoDataValuesAsNull($scope.currentIndicatorMetadataAndGeoJSON); + // identify and mark outliers prior to setting up of styling + // in styling methods, outliers should be removed from classification! + $scope.currentIndicatorMetadataAndGeoJSON = markOutliers($scope.currentIndicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); + kommonitorDataExchangeService.setAllFeaturesProperty(indicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); + kommonitorDataExchangeService.setSelectedFeatureProperty(kommonitorFilterHelperService.selectedIndicatorFeatureIds, $scope.indicatorPropertyName); + $scope.currentGeoJSONOfCurrentLayer = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON; + for (var i = 0; i < indicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { + var containsZero = false; + var containsNoData = false; + if (indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === 0 || indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === "0") { + $scope.currentIndicatorContainsZeroValues = true; + containsZero = true; + } + ; + if (kommonitorDataExchangeService.indicatorValueIsNoData(indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { + $scope.currentIndicatorContainsNoDataValues = true; + containsNoData = true; + } + ; + if (containsZero && containsNoData) { + break; + } + } + /* ///////////////////////////////// RASTER SPECIAL TREATMENT + // improve Raster display by eliminiating NoData cells and + // omitting display border in style + */ + if (kommonitorDataExchangeService.selectedSpatialUnitIsRaster()) { + indicatorMetadataAndGeoJSON.geoJSON.features = indicatorMetadataAndGeoJSON.geoJSON.features.filter(feature => { + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[$scope.indicatorPropertyName])) { + return false; + } + return true; + }); + } + var layer; + $scope.indicatorTypeOfCurrentLayer = indicatorMetadataAndGeoJSON.indicatorType; + if (kommonitorDataExchangeService.isMeasureOfValueChecked) { + var measureOfValueBrewArray = kommonitorVisualStyleHelperService.setupMeasureOfValueBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, defaultColorBrewerPaletteForGtMovValues, defaultColorBrewerPaletteForLtMovValues, kommonitorVisualStyleHelperService.classifyMethod, kommonitorDataExchangeService.measureOfValue); + $scope.gtMeasureOfValueBrew = measureOfValueBrewArray[0]; + $scope.ltMeasureOfValueBrew = measureOfValueBrewArray[1]; + $scope.propertyName = INDICATOR_DATE_PREFIX + date; + layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + return $scope.filteredStyle; + } + return kommonitorVisualStyleHelperService.styleMeasureOfValue(feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + }, + onEachFeature: onEachFeatureIndicator + }); + // $scope.makeMeasureOfValueLegend(isCustomComputation); } else { - style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); - - layer.setStyle(style); - } - - }); - - // $scope.makeMeasureOfValueLegend(); - } - else { - - if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { - var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew($scope.currentIndicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); - $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; - $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; - - $scope.currentIndicatorLayer.eachLayer(function (layer) { - if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - layer.setStyle($scope.filteredStyle); - } - else { - style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); - - layer.setStyle(style); - } - + if (indicatorMetadataAndGeoJSON.indicatorType.includes("STATUS")) { + $scope.datasetContainsNegativeValues = $scope.containsNegativeValues(indicatorMetadataAndGeoJSON.geoJSON); + if ($scope.datasetContainsNegativeValues) { + var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); + $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; + $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + } + else { + $scope.defaultBrew = kommonitorVisualStyleHelperService.setupDefaultBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, indicatorMetadataAndGeoJSON.defaultClassificationMapping.items.length, indicatorMetadataAndGeoJSON.defaultClassificationMapping.colorBrewerSchemeName, kommonitorVisualStyleHelperService.classifyMethod); + } + $scope.propertyName = INDICATOR_DATE_PREFIX + date; + layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + return $scope.filteredStyle; + } + return kommonitorVisualStyleHelperService.styleDefault(feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); + }, + onEachFeature: onEachFeatureIndicator + }); + // $scope.makeDefaultLegend(indicatorMetadataAndGeoJSON.defaultClassificationMapping, $scope.datasetContainsNegativeValues, isCustomComputation); + } + else if (indicatorMetadataAndGeoJSON.indicatorType.includes("DYNAMIC")) { + var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); + $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; + $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + $scope.propertyName = INDICATOR_DATE_PREFIX + date; + layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + return $scope.filteredStyle; + } + return kommonitorVisualStyleHelperService.styleDynamicIndicator(feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + }, + onEachFeature: onEachFeatureIndicator + }); + // $scope.makeDynamicIndicatorLegend(isCustomComputation); + } + } + $scope.currentIndicatorLayer = layer; + $rootScope.$broadcast("updateLegendDisplay", $scope.currentIndicatorContainsZeroValues, $scope.datasetContainsNegativeValues, $scope.currentIndicatorContainsNoDataValues, $scope.containsOutliers_high, $scope.containsOutliers_low, $scope.outliers_low, $scope.outliers_high, kommonitorDataExchangeService.selectedDate); + // if(spatialUnitName.includes("raster") || spatialUnitName.includes("Raster") || spatialUnitName.includes("grid") || spatialUnitName.includes("Grid")){ + // layer.style.color = undefined; + // } + // layer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + var layerName = indicatorMetadataAndGeoJSON.indicatorName + "_" + spatialUnitName + "_" + date; + if (isCustomComputation) { + layerName += " - individuelles Berechnungsergebnis"; + } + $scope.layerControl.addOverlay(layer, layerName, indicatorLayerGroupName); + layer.addTo($scope.map); + $scope.updateSearchControl(); + // var justRestyling = false; + // fitBounds(); + if ($scope.containsOutliers_low || $scope.containsOutliers_high) { + $scope.showOutlierInfoAlert = true; + } + $rootScope.$broadcast("updateDiagrams", $scope.currentIndicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitId, date, $scope.defaultBrew, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, kommonitorDataExchangeService.isMeasureOfValueChecked, kommonitorDataExchangeService.measureOfValue, justRestyling); + $rootScope.$broadcast("indicatortMapDisplayFinished"); + $scope.map.invalidateSize(true); + }); + $scope.containsNegativeValues = function (geoJSON) { + var containsNegativeValues = false; + $scope.datasetContainsNegativeValues = false; + for (var i = 0; i < geoJSON.features.length; i++) { + if (geoJSON.features[i].properties[$scope.indicatorPropertyName] < 0) { + containsNegativeValues = true; + break; + } + } + return containsNegativeValues; + }; + $scope.$on("restyleCurrentLayer", function (event, skipDiagramRefresh) { + // var transparency = document.getElementById("indicatorTransparencyInput").value; + // var opacity = 1 - transparency; + // + // kommonitorVisualStyleHelperService.setOpacity(opacity); + refreshFilteredStyle(); + refreshOutliersStyle(); + refreshNoDataStyle(); + $scope.defaultBrew = new classyBrew(); + $scope.gtMeasureOfValueBrew = new classyBrew(); + $scope.ltMeasureOfValueBrew = new classyBrew(); + var style; + if ($scope.currentIndicatorLayer) { + $scope.currentIndicatorMetadataAndGeoJSON = markOutliers($scope.currentIndicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); + $scope.currentGeoJSONOfCurrentLayer = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON; + $scope.currentIndicatorContainsZeroValues = false; + for (var i = 0; i < $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { + var containsZero = false; + var containsNoData = false; + if ($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === 0 || $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === "0") { + $scope.currentIndicatorContainsZeroValues = true; + containsZero = true; + } + ; + if (kommonitorDataExchangeService.indicatorValueIsNoData($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { + $scope.currentIndicatorContainsNoDataValues = true; + containsNoData = true; + } + ; + if (containsZero && containsNoData) { + break; + } + } + if (kommonitorDataExchangeService.isMeasureOfValueChecked) { + var measureOfValueBrewArray = kommonitorVisualStyleHelperService.setupMeasureOfValueBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, defaultColorBrewerPaletteForGtMovValues, defaultColorBrewerPaletteForLtMovValues, kommonitorVisualStyleHelperService.classifyMethod, kommonitorDataExchangeService.measureOfValue); + $scope.gtMeasureOfValueBrew = measureOfValueBrewArray[0]; + $scope.ltMeasureOfValueBrew = measureOfValueBrewArray[1]; + $scope.currentIndicatorLayer.eachLayer(function (layer) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else { + style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + layer.setStyle(style); + } + }); + // $scope.makeMeasureOfValueLegend(); + } + else { + if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { + var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew($scope.currentIndicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); + $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; + $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + $scope.currentIndicatorLayer.eachLayer(function (layer) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else { + style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + layer.setStyle(style); + } + }); + // $scope.makeDynamicIndicatorLegend(); + } + else { + $scope.datasetContainsNegativeValues = $scope.containsNegativeValues($scope.currentGeoJSONOfCurrentLayer); + if ($scope.datasetContainsNegativeValues) { + var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew($scope.currentIndicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); + $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; + $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + } + else { + $scope.defaultBrew = kommonitorVisualStyleHelperService.setupDefaultBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, $scope.currentIndicatorMetadataAndGeoJSON.defaultClassificationMapping.items.length, $scope.currentIndicatorMetadataAndGeoJSON.defaultClassificationMapping.colorBrewerSchemeName, kommonitorVisualStyleHelperService.classifyMethod); + } + $scope.currentIndicatorLayer.eachLayer(function (layer) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else { + style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); + layer.setStyle(style); + } + }); + // $scope.makeDefaultLegend(kommonitorDataExchangeService.selectedIndicator.defaultClassificationMapping, $scope.datasetContainsNegativeValues); + } + } + $rootScope.$broadcast("updateLegendDisplay", $scope.currentIndicatorContainsZeroValues, $scope.datasetContainsNegativeValues, $scope.currentIndicatorContainsNoDataValues, $scope.containsOutliers_high, $scope.containsOutliers_low, $scope.outliers_low, $scope.outliers_high, kommonitorDataExchangeService.selectedDate); + if (!skipDiagramRefresh) { + var justRestyling = true; + $rootScope.$broadcast("updateDiagrams", $scope.currentIndicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitId, $scope.date, $scope.defaultBrew, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, kommonitorDataExchangeService.isMeasureOfValueChecked, kommonitorDataExchangeService.measureOfValue, justRestyling); + } + //ensure that highlighted feature remain highlighted + preserveHighlightedFeatures(); + } + $scope.map.invalidateSize(true); + }); + $scope.$on("highlightFeatureOnMap", function (event, spatialFeatureName) { + // console.log("highlight feature on map for featureName " + spatialFeatureName); + if (!spatialFeatureName) { + return; + } + var done = false; + $scope.map.eachLayer(function (layer) { + if (!done && layer.feature) { + if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { + highlightFeatureForLayer(layer); + done = true; + } + } }); - // $scope.makeDynamicIndicatorLegend(); - } - else { - $scope.datasetContainsNegativeValues = $scope.containsNegativeValues($scope.currentGeoJSONOfCurrentLayer); - if ($scope.datasetContainsNegativeValues) { - var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew($scope.currentIndicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); - $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; - $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + }); + $scope.$on("unhighlightFeatureOnMap", function (event, spatialFeatureName) { + if (!spatialFeatureName) { + return; } - else { - $scope.defaultBrew = kommonitorVisualStyleHelperService.setupDefaultBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, $scope.currentIndicatorMetadataAndGeoJSON.defaultClassificationMapping.items.length, $scope.currentIndicatorMetadataAndGeoJSON.defaultClassificationMapping.colorBrewerSchemeName, kommonitorVisualStyleHelperService.classifyMethod); + // console.log("unhighlight feature on map for featureName " + spatialFeatureName); + var done = false; + $scope.map.eachLayer(function (layer) { + if (!done && layer.feature) { + if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { + resetHighlightForLayer(layer); + done = true; + } + } + }); + }); + $scope.$on("switchHighlightFeatureOnMap", function (event, spatialFeatureName) { + if (!spatialFeatureName) { + return; } - - $scope.currentIndicatorLayer.eachLayer(function (layer) { - if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { - layer.setStyle($scope.filteredStyle); - } - else { - style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); - layer.setStyle(style); - } + // console.log("switch highlight feature on map for featureName " + spatialFeatureName); + var done = false; + $scope.map.eachLayer(function (layer) { + if (!done && layer.feature) { + if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { + switchHighlightFeature(layer); + done = true; + } + } }); - // $scope.makeDefaultLegend(kommonitorDataExchangeService.selectedIndicator.defaultClassificationMapping, $scope.datasetContainsNegativeValues); - } - - } - - $rootScope.$broadcast("updateLegendDisplay", $scope.currentIndicatorContainsZeroValues, $scope.datasetContainsNegativeValues, $scope.currentIndicatorContainsNoDataValues, $scope.containsOutliers_high, $scope.containsOutliers_low, $scope.outliers_low, $scope.outliers_high, kommonitorDataExchangeService.selectedDate); - - if (!skipDiagramRefresh) { - var justRestyling = true; - - $rootScope.$broadcast("updateDiagrams", $scope.currentIndicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitId, $scope.date, $scope.defaultBrew, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, kommonitorDataExchangeService.isMeasureOfValueChecked, kommonitorDataExchangeService.measureOfValue, justRestyling); - } - - //ensure that highlighted feature remain highlighted - preserveHighlightedFeatures(); - } - - $scope.map.invalidateSize(true); - - }); - - $scope.$on("highlightFeatureOnMap", function (event, spatialFeatureName) { - - // console.log("highlight feature on map for featureName " + spatialFeatureName); - - if(!spatialFeatureName){ - return; - } - var done = false; - - $scope.map.eachLayer(function (layer) { - if (!done && layer.feature) { - if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { - highlightFeatureForLayer(layer); - done = true; - } - } - - }); - - }); - - $scope.$on("unhighlightFeatureOnMap", function (event, spatialFeatureName) { - if(!spatialFeatureName){ - return; - } - - // console.log("unhighlight feature on map for featureName " + spatialFeatureName); - - var done = false; - - $scope.map.eachLayer(function (layer) { - if (!done && layer.feature) { - if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { - resetHighlightForLayer(layer); - done = true; - } - } - - }); - - }); - - $scope.$on("switchHighlightFeatureOnMap", function (event, spatialFeatureName) { - if(!spatialFeatureName){ - return; - } - - // console.log("switch highlight feature on map for featureName " + spatialFeatureName); - - var done = false; - - $scope.map.eachLayer(function (layer) { - if (!done && layer.feature) { - if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { - switchHighlightFeature(layer); - done = true; - } - } - - }); - - }); - - $scope.$on("unselectAllFeatures", function (event) { - - kommonitorFilterHelperService.clearSelectedFeatures(); - $rootScope.$broadcast("restyleCurrentLayer", false); - }); - - $scope.$on("removeAllDrawnPoints", function (event) { - - if ($scope.drawnPointFeatures) { - $scope.drawnPointFeatures.clearLayers(); - $rootScope.$broadcast("onUpdateDrawnPointFeatures"); - } - }); - - $scope.$on("enablePointDrawTool", function (event) { - - // FeatureGroup is to store editable layers - if (!$scope.drawnPointFeatures) { - $scope.drawnPointFeatures = new L.FeatureGroup(); - } - - L.drawLocal = { - edit: { - toolbar: { - actions: { - save: { - title: "Bearbeitung speichern.", - text: "Speichern", - }, - cancel: { - title: "Bearbeitung verwerfen.", - text: "Abbrechen", - }, - clearAll: { - title: "Alle Features entfernen.", - text: "Alle Features entfernen", - }, - }, - buttons: { - edit: "Layer editieren.", - editDisabled: "Keine Layer zum editieren vorhanden.", - remove: "Layer entfernen.", - removeDisabled: "Keine Layer zum entfernen vorhanden.", - }, - }, - handlers: { - edit: { - tooltip: { - text: "Bearbeitungspunkte oder Punktmarker ziehen, um Feature zu editieren.", - subtext: "Abbrechen klicken, um Bearbeitung zu verwefen.", - }, - }, - remove: { - tooltip: { - text: "Feature anklicken, um es zu entfernen", - }, - }, - } - }, - draw: { - toolbar: { - actions: { - title: "Zeichnen abbrechen", - text: "Abbrechen", - }, - finish: { - title: "Zeichnen beenden", - text: "Beenden", - }, - undo: { - title: "Zuletzt gezeichneten Punkt entfernen", - text: "Letzten Punkt entfernen", - }, - buttons: { - polyline: "Polylinie zeichnen", - polygon: "Polygon zeichnen", - rectangle: "Rechteck zeichnen", - circle: "Kreis zeichnen", - marker: "Punkt zeichnen", - circlemarker: "Kreispunkt zeichnen", - }, - }, - handlers: { - circle: { - tooltip: { - start: "Klicken und halten, um Kreis zu zeichnen.", - }, - radius: "Radius", - }, - circlemarker: { - tooltip: { - start: "Klicken, um einen Punkt zu markieren.", - }, - }, - marker: { - tooltip: { - start: "Klicken, um einen Punkt zu markieren.", - }, - }, - polygon: { - tooltip: { - start: "Klicken, um ein Polygon zu beginnen.", - cont: "Klicken, um das Polygon weiter zu zeichnen.", - end: "Ersten Punkt anklicken, um Polygon zu beenden.", - }, - }, - polyline: { - error: "Fehler: Selbstueberschneidung!", - tooltip: { - start: "Klicken, um eine Polylinie zu beginnen.", - cont: "Klicken, um die Polylinie weiter zu zeichnen.", - end: "Letzten Punkt erneut anklicken, um Polylinie zu beenden.", - }, - }, - rectangle: { - tooltip: { - start: "Klicken und halten, um Rechteck zu zeichnen.", - }, - }, - simpleshape: { - tooltip: { - end: "Maus loslassen, um Zeichnung zu beenden.", - }, - }, - } - } - - }; - - $scope.map.addLayer($scope.drawnPointFeatures); - $scope.drawPointControl = new L.Control.Draw({ - edit: { - featureGroup: $scope.drawnPointFeatures - }, - draw: { - polyline: false, - polygon: false, - rectangle: false, - circle: false, - circlemarker: false - }, - position: 'bottomleft' - - }); - - $scope.map.addControl($scope.drawPointControl); - - $scope.map.on(L.Draw.Event.CREATED, function (event) { - var layer = event.layer; - - $scope.drawnPointFeatures.addLayer(layer); - - $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); - }); - - $scope.map.on(L.Draw.Event.EDITED, function (event) { - - $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); - }); - - $scope.map.on(L.Draw.Event.DELETED, function (event) { - - $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); - }); - - }); - - $scope.$on("disablePointDrawTool", function (event) { - - try { - $scope.drawPointControl = undefined; - $scope.map.removeLayer($scope.drawnPointFeatures); - $scope.map.removeControl($scope.drawPointControl); - } - catch (error) { - // kommonitorDataExchangeService.displayMapApplicationError(error); - } - - }); - - $scope.$on("zoomToGeoresourceLayer", async function (event, georesourceMetadata) { - - let layerName = georesourceMetadata.datasetName; - - let layerGroupName = undefined; - - if (georesourceMetadata.isPOI){ - layerGroupName = poiLayerGroupName; - } - else if(georesourceMetadata.isLOI){ - layerGroupName = loiLayerGroupName; - } - else if(georesourceMetadata.isAOI){ - layerGroupName = aoiLayerGroupName; - } - - $scope.layerControl._layers.forEach(function (layer) { - if (layerGroupName && layer.group.name === layerGroupName && layer.name.includes(layerName + "_")) { - $scope.map.fitBounds(layer.layer.getBounds()); - } - else if (layer.name.includes(layerName + "_")){ - $scope.map.fitBounds(layer.layer.getBounds()); - } - }); - }); - - } + }); + $scope.$on("unselectAllFeatures", function (event) { + kommonitorFilterHelperService.clearSelectedFeatures(); + $rootScope.$broadcast("restyleCurrentLayer", false); + }); + $scope.$on("removeAllDrawnPoints", function (event) { + if ($scope.drawnPointFeatures) { + $scope.drawnPointFeatures.clearLayers(); + $rootScope.$broadcast("onUpdateDrawnPointFeatures"); + } + }); + $scope.$on("enablePointDrawTool", function (event) { + // FeatureGroup is to store editable layers + if (!$scope.drawnPointFeatures) { + $scope.drawnPointFeatures = new L.FeatureGroup(); + } + L.drawLocal = { + edit: { + toolbar: { + actions: { + save: { + title: "Bearbeitung speichern.", + text: "Speichern", + }, + cancel: { + title: "Bearbeitung verwerfen.", + text: "Abbrechen", + }, + clearAll: { + title: "Alle Features entfernen.", + text: "Alle Features entfernen", + }, + }, + buttons: { + edit: "Layer editieren.", + editDisabled: "Keine Layer zum editieren vorhanden.", + remove: "Layer entfernen.", + removeDisabled: "Keine Layer zum entfernen vorhanden.", + }, + }, + handlers: { + edit: { + tooltip: { + text: "Bearbeitungspunkte oder Punktmarker ziehen, um Feature zu editieren.", + subtext: "Abbrechen klicken, um Bearbeitung zu verwefen.", + }, + }, + remove: { + tooltip: { + text: "Feature anklicken, um es zu entfernen", + }, + }, + } + }, + draw: { + toolbar: { + actions: { + title: "Zeichnen abbrechen", + text: "Abbrechen", + }, + finish: { + title: "Zeichnen beenden", + text: "Beenden", + }, + undo: { + title: "Zuletzt gezeichneten Punkt entfernen", + text: "Letzten Punkt entfernen", + }, + buttons: { + polyline: "Polylinie zeichnen", + polygon: "Polygon zeichnen", + rectangle: "Rechteck zeichnen", + circle: "Kreis zeichnen", + marker: "Punkt zeichnen", + circlemarker: "Kreispunkt zeichnen", + }, + }, + handlers: { + circle: { + tooltip: { + start: "Klicken und halten, um Kreis zu zeichnen.", + }, + radius: "Radius", + }, + circlemarker: { + tooltip: { + start: "Klicken, um einen Punkt zu markieren.", + }, + }, + marker: { + tooltip: { + start: "Klicken, um einen Punkt zu markieren.", + }, + }, + polygon: { + tooltip: { + start: "Klicken, um ein Polygon zu beginnen.", + cont: "Klicken, um das Polygon weiter zu zeichnen.", + end: "Ersten Punkt anklicken, um Polygon zu beenden.", + }, + }, + polyline: { + error: "Fehler: Selbstueberschneidung!", + tooltip: { + start: "Klicken, um eine Polylinie zu beginnen.", + cont: "Klicken, um die Polylinie weiter zu zeichnen.", + end: "Letzten Punkt erneut anklicken, um Polylinie zu beenden.", + }, + }, + rectangle: { + tooltip: { + start: "Klicken und halten, um Rechteck zu zeichnen.", + }, + }, + simpleshape: { + tooltip: { + end: "Maus loslassen, um Zeichnung zu beenden.", + }, + }, + } + } + }; + $scope.map.addLayer($scope.drawnPointFeatures); + $scope.drawPointControl = new L.Control.Draw({ + edit: { + featureGroup: $scope.drawnPointFeatures + }, + draw: { + polyline: false, + polygon: false, + rectangle: false, + circle: false, + circlemarker: false + }, + position: 'bottomleft' + }); + $scope.map.addControl($scope.drawPointControl); + $scope.map.on(L.Draw.Event.CREATED, function (event) { + var layer = event.layer; + $scope.drawnPointFeatures.addLayer(layer); + $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); + }); + $scope.map.on(L.Draw.Event.EDITED, function (event) { + $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); + }); + $scope.map.on(L.Draw.Event.DELETED, function (event) { + $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); + }); + }); + $scope.$on("disablePointDrawTool", function (event) { + try { + $scope.drawPointControl = undefined; + $scope.map.removeLayer($scope.drawnPointFeatures); + $scope.map.removeControl($scope.drawPointControl); + } + catch (error) { + // kommonitorDataExchangeService.displayMapApplicationError(error); + } + }); + $scope.$on("zoomToGeoresourceLayer", async function (event, georesourceMetadata) { + let layerName = georesourceMetadata.datasetName; + let layerGroupName = undefined; + if (georesourceMetadata.isPOI) { + layerGroupName = poiLayerGroupName; + } + else if (georesourceMetadata.isLOI) { + layerGroupName = loiLayerGroupName; + } + else if (georesourceMetadata.isAOI) { + layerGroupName = aoiLayerGroupName; + } + $scope.layerControl._layers.forEach(function (layer) { + if (layerGroupName && layer.group.name === layerGroupName && layer.name.includes(layerName + "_")) { + $scope.map.fitBounds(layer.layer.getBounds()); + } + else if (layer.name.includes(layerName + "_")) { + $scope.map.fitBounds(layer.layer.getBounds()); + } + }); + }); + } ] - }); +}); +//# sourceMappingURL=kommonitor-map.component.js.map \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.js.map b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.js.map new file mode 100644 index 000000000..4306fbc6f --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-map.component.js","sourceRoot":"","sources":["kommonitor-map.component.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.ts b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.ts new file mode 100644 index 000000000..518355fc5 --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.component.ts @@ -0,0 +1,3484 @@ +angular.module('kommonitorMap').component( + 'kommonitorMap', + { + templateUrl: "components/kommonitorUserInterface/kommonitorMap/kommonitor-map.template.html", + controller: [ + '$rootScope', + '$http', + '$scope', + '$timeout', + 'kommonitorMapService', + 'kommonitorDataExchangeService', + 'kommonitorVisualStyleHelperService', + 'kommonitorInfoLegendHelperService', + 'kommonitorFilterHelperService', + '__env', + function MapController($rootScope, $http, $scope, $timeout, kommonitorMapService, kommonitorDataExchangeService, kommonitorVisualStyleHelperService, + kommonitorInfoLegendHelperService, kommonitorFilterHelperService, __env) { + + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + + const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; + const numberOfDecimals = __env.numberOfDecimals; + var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; + var defaultBorderColorForFilteredValues = __env.defaultBorderColorForFilteredValues; + var defaultBorderColor = __env.defaultBorderColor; + var defaultFillOpacity = __env.defaultFillOpacity; + var defaultFillOpacityForFilteredFeatures = __env.defaultFillOpacityForFilteredFeatures; + var defaultFillOpacityForHighlightedFeatures = __env.defaultFillOpacityForHighlightedFeatures; + var defaultFillOpacityForZeroFeatures = __env.defaultFillOpacityForZeroFeatures; + var defaultColorBrewerPaletteForBalanceIncreasingValues = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; + var defaultColorBrewerPaletteForBalanceDecreasingValues = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; + var defaultColorBrewerPaletteForGtMovValues = __env.defaultColorBrewerPaletteForGtMovValues; + var defaultColorBrewerPaletteForLtMovValues = __env.defaultColorBrewerPaletteForLtMovValues; + var defaultColorForHoveredFeatures = __env.defaultColorForHoveredFeatures; + var defaultColorForClickedFeatures = __env.defaultColorForClickedFeatures; + var defaultBorderColorForNoDataValues = __env.defaultBorderColorForNoDataValues; + var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; + var defaultFillOpacityForNoDataValues = __env.defaultFillOpacityForNoDataValues; + + + var defaultColorForOutliers_high = __env.defaultColorForOutliers_high; + var defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; + var defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; + var defaultColorForOutliers_low = __env.defaultColorForOutliers_low; + var defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; + var defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; + var useOutlierDetectionOnIndicator = __env.useOutlierDetectionOnIndicator; + + const outlierPropertyName = "outlier"; + const outlierPropertyValue_high_soft = "high-soft"; + const outlierPropertyValue_low_soft = "low-soft"; + const outlierPropertyValue_high_extreme = "high-extreme"; + const outlierPropertyValue_low_extreme = "low-extreme"; + const outlierPropertyValue_no = "no"; + + $scope.containsOutliers_high = false; + $scope.containsOutliers_low = false; + $scope.outliers_high = undefined; + $scope.outliers_low = undefined; + kommonitorDataExchangeService.useOutlierDetectionOnIndicator = useOutlierDetectionOnIndicator; + + $scope.svgString_outlierLow = 'Sorry, your browser does not support inline SVG.'; + $scope.svgString_outlierHigh = 'Sorry, your browser does not support inline SVG.'; + + $scope.showOutlierInfoAlert = false; + + + + $scope.drawnPointFeatures = undefined; + $scope.drawPointControl = undefined; + + $scope.featuresWithValues = []; + $scope.featuresWithoutValues = []; + + + const MultipleResultsLeafletSearch = L.Control.Search.extend({ + + _makeUniqueKey: function (featureName, featureId) { + return featureName + " (Name) - " + featureId + " (ID)"; + }, + + _searchInLayer: function (layer, retRecords, propName) { + var self = this, loc; + var key_withUniqueID; + + if (layer instanceof L.Control.Search.Marker) return; + + if (layer instanceof L.Marker || layer instanceof L.CircleMarker) { + if (self._getPath(layer.options, propName)) { + loc = layer.getLatLng(); + loc.layer = layer; + retRecords[self._getPath(layer.options, propName)] = loc; + } + else if (self._getPath(layer.feature.properties, propName)) { + loc = layer.getLatLng(); + loc.layer = layer; + key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); + retRecords[key_withUniqueID] = loc; + } + else { + //throw new Error("propertyName '"+propName+"' not found in marker"); + console.warn("propertyName '" + propName + "' not found in marker"); + } + } + else if (layer instanceof L.Path || layer instanceof L.Polyline || layer instanceof L.Polygon) { + if (self._getPath(layer.options, propName)) { + loc = layer.getBounds().getCenter(); + loc.layer = layer; + retRecords[self._getPath(layer.options, propName)] = loc; + } + else if (self._getPath(layer.feature.properties, propName)) { + loc = layer.getBounds().getCenter(); + loc.layer = layer; + key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); + retRecords[key_withUniqueID] = loc; + } + else { + //throw new Error("propertyName '"+propName+"' not found in shape"); + console.warn("propertyName '" + propName + "' not found in shape"); + } + } + else if (layer.hasOwnProperty('feature'))//GeoJSON + { + if (layer.feature.properties.hasOwnProperty(propName)) { + + key_withUniqueID = this._makeUniqueKey(self._getPath(layer.feature.properties, propName), layer.feature.properties.ID); + if (layer.getLatLng && typeof layer.getLatLng === 'function') { + loc = layer.getLatLng(); + loc.layer = layer; + retRecords[key_withUniqueID] = loc; + } else if (layer.getBounds && typeof layer.getBounds === 'function') { + loc = layer.getBounds().getCenter(); + loc.layer = layer; + retRecords[key_withUniqueID] = loc; + } else { + console.warn("Unknown type of Layer"); + } + } + else { + //throw new Error("propertyName '"+propName+"' not found in feature"); + console.warn("propertyName '" + propName + "' not found in feature"); + } + } + else if (layer instanceof L.LayerGroup) { + layer.eachLayer(function (layer) { + self._searchInLayer(layer, retRecords, propName); + }); + } + }, + _defaultMoveToLocation: function (latlng, title, map) { + if (this.options.zoom) + this._map.setView(latlng, this.options.zoom); + else + this._map.panTo(latlng); + + // add collapse after click on item + this.collapse(); + }, + _handleAutoresize: function () { + var maxWidth; + + if (!this._map) { + this._map = $scope.map; + } + + if (this._input.style.maxWidth !== this._map._container.offsetWidth) { + maxWidth = this._map._container.clientWidth; + + // other side margin + padding + width border + width search-button + width search-cancel + maxWidth -= 10 + 20 + 1 + 30 + 22; + + this._input.style.maxWidth = maxWidth.toString() + 'px'; + } + + if (this.options.autoResize && (this._container.offsetWidth + 20 < this._map._container.offsetWidth)) { + this._input.size = this._input.value.length < this._inputMinSize ? this._inputMinSize : this._input.value.length; + } + } + }); + + $scope.onCloseOutlierAlert = function () { + // $("#outlierInfo").hide(); + $scope.showOutlierInfoAlert = false; + }; + + + var refreshNoDataStyle = function () { + + $scope.currentIndicatorContainsNoDataValues = false; + $scope.svgString_noData = '' + + '' + + '' + + '' + + '' + + 'Sorry, your browser does not support inline SVG.'; + + $scope.noDataStyle = kommonitorVisualStyleHelperService.noDataStyle; + }; + + var refreshOutliersStyle = function () { + + $scope.containsOutliers_high = false; + $scope.containsOutliers_low = false; + $scope.outlierMinValue = undefined; + $scope.outlierMaxValue = undefined; + $scope.showOutlierInfoAlert = false; + + $scope.svgString_outlierLow = 'Sorry, your browser does not support inline SVG.'; + $scope.svgString_outlierHigh = 'Sorry, your browser does not support inline SVG.'; + + // if ($scope.useTransparencyOnIndicator) { + // fillOpacity_high = defaultFillOpacityForOutliers_high; + // fillOpacity_low = defaultFillOpacityForOutliers_low; + // } + + $scope.outlierStyle_high = kommonitorVisualStyleHelperService.outlierStyle_high; + + $scope.outlierStyle_low = kommonitorVisualStyleHelperService.outlierStyle_low; + }; + + $scope.useTransparencyOnIndicator = __env.useTransparencyOnIndicator; + + $scope.filteredStyle = kommonitorVisualStyleHelperService.filteredStyle; + + var refreshFilteredStyle = function () { + + $scope.filteredStyle = kommonitorVisualStyleHelperService.filteredStyle; + }; + + this.kommonitorMapServiceInstance = kommonitorMapService; + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + $scope.inputLayerCounter = 0; + + $scope.latCenter = __env.initialLatitude; + $scope.lonCenter = __env.initialLongitude; + $scope.zoomLevel = __env.initialZoomLevel; + + $scope.loadingData = true; + + $scope.drawnItems = new L.FeatureGroup(); + $scope.drawControl = undefined; + + $scope.allDrawingToolsEnabled = false; + $scope.date = undefined; + + // central map object + $scope.map = undefined; + $scope.scaleBar = undefined; + $scope.layerControl = undefined; + $scope.showInfoControl = true; + $scope.showLegendControl = true; + $scope.showLegend = true; + $scope.overlays = new Array(); + $scope.baseMaps = new Array(); + const spatialUnitLayerGroupName = "Raumeinheiten"; + const georesourceLayerGroupName = "Georessourcen"; + const poiLayerGroupName = "Points of Interest"; + const loiLayerGroupName = "Lines of Interest"; + const aoiLayerGroupName = "Areas of Interest"; + const indicatorLayerGroupName = "Indikatoren"; + const reachabilityLayerGroupName = "Erreichbarkeiten"; + const wmsLayerGroupName = "Web Map Services (WMS)"; + const wfsLayerGroupName = "Web Feature Services (WFS)"; + const fileLayerGroupName = "Dateilayer"; + + // create classyBrew object + $scope.defaultBrew = new classyBrew(); + $scope.gtMeasureOfValueBrew = new classyBrew(); + $scope.ltMeasureOfValueBrew = new classyBrew(); + + $scope.currentIndicatorMetadataAndGeoJSON; + $scope.currentGeoJSONOfCurrentLayer; + $scope.currentIndicatorContainsZeroValues = false; + $scope.currentIndicatorContainsNoDataValues = false; + $scope.indicatorTypeOfCurrentLayer; + $scope.defaultColorForZeroValues = __env.defaultColorForZeroValues; + + $scope.customIndicatorPropertyName; + $scope.customIndicatorName; + $scope.customIndicatorUnit; + + $scope.currentCustomIndicatorLayerOfCurrentLayer; + $scope.customPropertyName; + + $scope.currentCustomIndicatorLayer; + $scope.isochronesLayer = undefined; + $scope.isochroneMarkerLayer = undefined; + + /* + * L.TileLayer.Grayscale is a regular tilelayer with grayscale makeover. + */ + + L.TileLayer.Grayscale = L.TileLayer.extend({ + options: { + quotaRed: 21, + quotaGreen: 71, + quotaBlue: 8, + quotaDividerTune: 0, + quotaDivider: function () { + return this.quotaRed + this.quotaGreen + this.quotaBlue + this.quotaDividerTune; + } + }, + + initialize: function (url, options) { + options = options || {}; + options.crossOrigin = true; + L.TileLayer.prototype.initialize.call(this, url, options); + + this.on('tileload', function (e) { + this._makeGrayscale(e.tile); + }); + }, + + _createTile: function () { + var tile = L.TileLayer.prototype._createTile.call(this); + tile.crossOrigin = "Anonymous"; + return tile; + }, + + _makeGrayscale: function (img) { + if (img.getAttribute('data-grayscaled')) + return; + + img.crossOrigin = ''; + var canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + + var imgd = ctx.getImageData(0, 0, canvas.width, canvas.height); + var pix = imgd.data; + for (var i = 0, n = pix.length; i < n; i += 4) { + pix[i] = pix[i + 1] = pix[i + 2] = (this.options.quotaRed * pix[i] + this.options.quotaGreen * pix[i + 1] + this.options.quotaBlue * pix[i + 2]) / this.options.quotaDivider(); + } + ctx.putImageData(imgd, 0, 0); + img.setAttribute('data-grayscaled', true); + img.src = canvas.toDataURL(); + } + }); + + L.tileLayer.grayscale = function (url, options) { + return new L.TileLayer.Grayscale(url, options); + }; + + this.initializeMap = function () { + + $scope.loadingData = true; + + // initialize map referring to div element with id="map" + + var baseLayerDefinitionsMap = new Map(); + + for (const baseMapEntry of __env.baseLayers) { + + if (baseMapEntry.layerType === "TILE_LAYER_GRAYSCALE"){ + var grayscaleLayer = new L.tileLayer.grayscale(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html }); + baseLayerDefinitionsMap.set(baseMapEntry.name, grayscaleLayer); + } + else if (baseMapEntry.layerType === "TILE_LAYER"){ + var tileLayer = new L.tileLayer(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html }); + baseLayerDefinitionsMap.set(baseMapEntry.name, tileLayer); + } + else if (baseMapEntry.layerType === "WMS"){ + var wmsLayer = new L.tileLayer.wms(baseMapEntry.url, { minZoom: baseMapEntry.minZoomLevel, maxZoom: baseMapEntry.maxZoomLevel, attribution: baseMapEntry.attribution_html, layers: baseMapEntry.layerName_WMS, format: 'image/png' }); + baseLayerDefinitionsMap.set(baseMapEntry.name, wmsLayer); + } + } + + $scope.map = L.map('map', { + center: [$scope.latCenter, $scope.lonCenter], + zoom: $scope.zoomLevel, + zoomDelta: 0.5, + zoomSnap: 0.5, + layers: [baseLayerDefinitionsMap.get(__env.baseLayers[0].name)] + }); + + // execute update search control on layer add and remove + $scope.map.on('overlayadd', function (eo) { + $scope.updateSearchControl(); + }); + $scope.map.on('overlayremove', function (eo) { + $scope.updateSearchControl(); + }); + + // update zoom and extent + $scope.map.on('zoomend', function (eo) { + let latLng = $scope.map.getCenter(); + __env.currentLatitude = latLng.lat; + __env.currentLongitude = latLng.lng; + __env.currentZoomLevel = $scope.map.getZoom(); + }); + $scope.map.on('moveend', function (eo) { + let latLng = $scope.map.getCenter(); + __env.currentLatitude = latLng.lat; + __env.currentLongitude = latLng.lng; + __env.currentZoomLevel = $scope.map.getZoom(); + }); + + $scope.baseMaps = { + }; + + baseLayerDefinitionsMap.forEach(function(value, key, map){ + $scope.baseMaps[key] = value; + }); + + $scope.groupedOverlays = { + indicatorLayerGroupName: { + + }, + poiLayerGroupName: { + + }, + loiLayerGroupName: { + + }, + aoiLayerGroupName: { + + }, + wmsLayerGroupName: { + + }, + wfsLayerGroupName: { + + }, + fileLayerGroupName: { + + }, + reachabilityLayerGroupName: { + + } + }; + + $scope.layerControl = L.control.groupedLayers($scope.baseMaps, $scope.groupedOverlays, { position: 'topleft' }); + $scope.map.addControl($scope.layerControl); + + // Disable dragging when user's cursor enters the element + $scope.layerControl.getContainer().addEventListener('mouseover', function () { + $scope.map.dragging.disable(); + $scope.map.touchZoom.disable(); + $scope.map.doubleClickZoom.disable(); + $scope.map.scrollWheelZoom.disable(); + }); + + // Re-enable dragging when user's cursor leaves the element + $scope.layerControl.getContainer().addEventListener('mouseout', function () { + $scope.map.dragging.enable(); + $scope.map.touchZoom.enable(); + $scope.map.doubleClickZoom.enable(); + $scope.map.scrollWheelZoom.enable(); + }); + + $scope.scaleBar = L.control.scale(); + $scope.scaleBar.addTo($scope.map); + + + + // hatch patterns + // var diagonalPattern = new L.PatternPath({ d: "M-1,1 l2,-2 M0,4 l4,-4 M3,5 l2,-2" , fill: true }); + + // $scope.outlierFillPattern_high = new L.Pattern(); + // $scope.outlierFillPattern_high.addShape(diagonalPattern); + // $scope.outlierFillPattern_high.addTo($scope.map); + + $scope.outlierFillPattern_low = kommonitorVisualStyleHelperService.outlierFillPattern_low; + $scope.outlierFillPattern_low.addTo($scope.map); + + $scope.outlierFillPattern_high = kommonitorVisualStyleHelperService.outlierFillPattern_high; + $scope.outlierFillPattern_high.addTo($scope.map); + + $scope.noDataFillPattern = kommonitorVisualStyleHelperService.noDataFillPattern; + $scope.noDataFillPattern.addTo($scope.map); + + // $scope.loadingData = false; + + ///////////////////////////////////////////////////// + ///// LEAFLET GEOSEARCH SETUP + ///////////////////////////////////////////////////// + var GeoSearchControl = window.GeoSearch.GeoSearchControl; + var OpenStreetMapProvider = window.GeoSearch.OpenStreetMapProvider; + + // remaining is the same as in the docs, accept for the var instead of const declarations + var provider = new OpenStreetMapProvider( + { + params: { + 'accept-language': 'de', // render results in Dutch + countrycodes: 'de', // limit search results to the Netherlands + addressdetails: 1, // include additional address detail parts + viewbox: "" + (Number(__env.initialLongitude) - 0.001) + "," + (Number(__env.initialLatitude) - 0.001) + "," + (Number(__env.initialLongitude) + 0.001) + "," + (Number(__env.initialLatitude) + 0.001) + }, + searchUrl: __env.targetUrlToGeocoderService + '/search', + reverseUrl: __env.targetUrlToGeocoderService + '/reverse' + } + ); + + $scope.geosearchControl = new GeoSearchControl({ + position: "topleft", + provider: provider, + style: 'button', + autoComplete: true, + autoCompleteDelay: 250, + showMarker: true, // optional: true|false - default true + showPopup: false, // optional: true|false - default false + marker: { // optional: L.Marker - default L.Icon.Default + icon: new L.Icon.Default(), + draggable: false, + }, + popupFormat: ({ query, result }) => result.label, // optional: function - default returns result label + maxMarkers: 1, // optional: number - default 1 + retainZoomLevel: false, // optional: true|false - default false + animateZoom: true, // optional: true|false - default true + autoClose: false, // optional: true|false - default false + searchLabel: 'Suche nach Adressen ...', // optional: string - default 'Enter address' + keepResult: false // optional: true|false - default false + }); + + $scope.map.addControl($scope.geosearchControl); + + + ///////////////////////////////////////////////////// + ///// LEAFLET SEARCH SETUP + ///////////////////////////////////////////////////// + // will be updated once example indicator layer is loaded + $scope.searchControl = new MultipleResultsLeafletSearch({ + }); + $scope.searchControl.addTo($scope.map); + + + ///////////////////////////////////////////////////// + ///// LEAFLET MEASURE SETUP + ///////////////////////////////////////////////////// + var measureOptions = { + position: 'topleft', + primaryLengthUnit: 'meters', + secondaryLengthUnit: 'kilometers', + primaryAreaUnit: 'sqmeters', + activeColor: "#d15c54", + completedColor: "#d15c54", + decPoint: ',', + thousandsSep: '.' + }; + + $scope.measureControl = new L.Control.Measure(measureOptions); + $scope.measureControl.addTo($scope.map); + + ///////////////////////////////////////////////////// + ///// LEAFLET SCREENSHOTER SETUP + ///////////////////////////////////////////////////// + + // from the docs, most of it is probably not needed + let screenshotterOptions = { + cropImageByInnerWH: true, // crop blank opacity from image borders + hidden: true, // hide screen icon + preventDownload: false, // prevent download on button click + domtoimageOptions: {}, // see options for dom-to-image + position: 'topleft', // position of take screen icon + screenName: 'screen', // string or function + hideElementsWithSelectors: ['.leaflet-control-container'], // by default hide map controls All els must be child of _map._container + mimeType: 'image/png', // used if format == image, + caption: null, // string or function, added caption to bottom of screen + captionFontSize: 15, + captionFont: 'Arial', + captionColor: 'black', + captionBgColor: 'white', + captionOffset: 5, + // callback for manually edit map if have warn: "May be map size very big on that zoom level, we have error" + // and screenshot not created + onPixelDataFail: async function({ node, plugin, error, mapPane, domtoimageOptions }) { + // Solutions: + // decrease size of map + // or decrease zoom level + // or remove elements with big distanses + // and after that return image in Promise - plugin._getPixelDataOfNormalMap + return plugin._getPixelDataOfNormalMap(domtoimageOptions) + } + } + + $scope.simpleMapScreenshoter = L.simpleMapScreenshoter(screenshotterOptions).addTo($scope.map); + $scope.map.simpleMapScreenshoter = $scope.simpleMapScreenshoter; + + }; // end initialize map + + + $scope.$on("exportMap", function (event) { + + // wait for print process to finish + let format = 'blob'; // 'image' - return base64, 'canvas' - return canvas + let overridedPluginOptions = { + mimeType: 'image/png' + }; + $scope.simpleMapScreenshoter.takeScreen(format, overridedPluginOptions); + $scope.simpleMapScreenshoter.takeScreen(format, overridedPluginOptions).then(blob => { + // FileSaver saveAs method + saveAs(blob, 'KomMonitor-Screenshot.png'); + }).catch(error => { + console.log("Error while exporting map view."); + console.error(error); + + kommonitorDataExchangeService.displayMapApplicationError(error); + }); + + }); + + function isKomMonitorSpecificProperty(propertyKey){ + let isKomMonitorSpecificProperty = false; + + if(propertyKey == "outlier"){ + isKomMonitorSpecificProperty = true; + } + else if(propertyKey == __env.VALID_START_DATE_PROPERTY_NAME){ + isKomMonitorSpecificProperty = true; + } + else if(propertyKey == __env.VALID_END_DATE_PROPERTY_NAME){ + isKomMonitorSpecificProperty = true; + } + else if(propertyKey == "bbox"){ + isKomMonitorSpecificProperty = true; + } + else if(propertyKey.includes(__env.indicatorDatePrefix)){ + isKomMonitorSpecificProperty = true; + } + + return isKomMonitorSpecificProperty; + } + + $scope.updateSearchControl = function () { + + setTimeout(function () { + if ($scope.searchControl) { + try { + $scope.map.removeControl($scope.searchControl); + $scope.searchControl = undefined; + } + catch (error) { + kommonitorDataExchangeService.displayMapApplicationError(error); + } + } + + // build L.layerGroup of available POI layers + var featureLayers = []; + + for (var layerEntry of $scope.layerControl._layers) { + if (layerEntry) { + if (layerEntry.overlay) { + if ($scope.map.hasLayer(layerEntry.layer)) { + if (layerEntry.group.name === poiLayerGroupName || layerEntry.group.name === loiLayerGroupName || layerEntry.group.name === aoiLayerGroupName || layerEntry.group.name === indicatorLayerGroupName || layerEntry.group.name === wfsLayerGroupName || layerEntry.group.name === fileLayerGroupName) { + featureLayers.push(layerEntry.layer); + } + } + + } + } + } + + var layerGroup; + // if no relevant layers are currently displayed, then + if (featureLayers.length === 0) { + $scope.searchControl = new MultipleResultsLeafletSearch({ + }); + $scope.searchControl.addTo($scope.map); + } + else { + layerGroup = L.featureGroup(featureLayers); + + $scope.searchControl = new MultipleResultsLeafletSearch({ + position: "topleft", + layer: layerGroup, + initial: false, + propertyName: __env.FEATURE_NAME_PROPERTY_NAME, + textPlaceholder: "Layer-Objekte nach Name und/oder ID filtern", + textCancel: "Abbrechen", + textErr: "Position nicht gefunden", + hideMarkerOnCollapse: true, + zoom: 15, + autoResize: true, + autoCollapse: false, + autoType: true, + formatData: function (json) { //adds coordinates to name. + var propName = this.options.propertyName, + propLoc = this.options.propertyLoc, + i, jsonret = {}; + if (L.Util.isArray(propLoc)) + for (i in json) { + if (!this._getPath(json[i], propName)) continue; + jsonret[this._getPath(json[i], propName) + " (" + json[i][propLoc[0]] + "," + json[i][propLoc[1]] + ")"] = L.latLng(json[i][propLoc[0]], json[i][propLoc[1]]); + } + else + for (i in json) { + if (!this._getPath(json[i], propName)) continue; + jsonret[this._getPath(json[i], propName) + " (" + json[i][propLoc][0] + "," + json[i][propLoc][1] + ")"] = L.latLng(this._getPath(json[i], propLoc)); + } + return jsonret; + }, + filterData: function (text, records) { + var I, icase, regSearch, frecords = {}; + + text = text.replace(/[.*+?^${}()|[\]\\]/g, ''); //sanitize remove all special characters + if (text === '') + return []; + + I = this.options.initial ? '^' : ''; //search only initial text + icase = !this.options.casesensitive ? 'i' : undefined; + + regSearch = new RegExp(I + text, icase); + + for (var key in records) { + + // make a searchable string from all relevant feature properties + let recordString = ""; + let record = records[key]; + let recordProperties = record.layer.feature.properties; + + for (const propertyKey in recordProperties) { + if(recordProperties[propertyKey] && !isKomMonitorSpecificProperty(propertyKey)){ + recordString += recordProperties[propertyKey]; + } + } + + if (regSearch.test(recordString)) + frecords[key] = records[key]; + } + + return frecords; + }, + buildTip: function (text, val) { + var emString = ""; + + if (val.layer.metadataObject) { + if (val.layer.metadataObject.isPOI) { + emString += ''; + emString += ""; + emString += ''; + } + } + else { + emString += ""; + } + return '' + emString + '  ' + text + ''; + } + }); + + $scope.searchControl.addTo($scope.map); + } + }, 200); + }; + + $scope.$on("showLoadingIconOnMap", function (event) { + // console.log("Show loading icon on map"); + $scope.loadingData = true; + }); + + $scope.$on("hideLoadingIconOnMap", function (event) { + // console.log("Hide loading icon on map"); + $timeout(function(){ + $scope.loadingData = false; + }, 250); + + }); + + $(document).on('click', '#selectSpatialUnitViaInfoControl li p', function () { + var spatialUnitName = $(this).text(); + $('#selectSpatialUnitViaInfoControl_text').text(spatialUnitName); + + $rootScope.$broadcast("changeSpatialUnitViaInfoControl", spatialUnitName); + }); + + // $(document).on('change','#selectSimplifyGeometriesViaInfoControl',function(){ + // var selector = document.getElementById('selectSimplifyGeometriesViaInfoControl'); + // var simplifyGeometries = selector[selector.selectedIndex].value; + // + // kommonitorDataExchangeService.simplifyGeometries = simplifyGeometries; + // + // $rootScope.$broadcast("changeSpatialUnit"); + // }); + + $scope.$on("changeSpatialUnitViaInfoControl", function (event, spatialUnitLevel) { + + $rootScope.$broadcast("changeSpatialUnit"); + + }); + + + $scope.appendSpatialUnitOptions = function () { + + //
        + // + //
        + + // var innerHTMLString = "
        "; + // innerHTMLString += ""; + // innerHTMLString += "
        "; + // // innerHTMLString += "
        "; + + // + + var innerHTMLString = '
        '; + innerHTMLString += "
        "; + innerHTMLString += "
        "; + innerHTMLString += "
        "; + + return innerHTMLString; + }; + + // $scope.appendSimplifyGeometriesOptions = function(){ + // + // //
        + // // + // //
        + // + // var innerHTMLString = "
        "; + // innerHTMLString += ""; + // innerHTMLString += "
        "; + // // innerHTMLString += "
        "; + // + // return innerHTMLString; + // }; + + var toggleInfoControl = function () { + if ($scope.showInfoControl === true) { + /* use jquery to select your DOM elements that has the class 'legend' */ + $('.info').hide(); + $scope.showInfoControl = false; + + $('#toggleInfoControlButton').show(); + } else { + $('.info').show(); + $scope.showInfoControl = true; + + // button is defined in kommonitor-user-interface component + $('#toggleInfoControlButton').hide(); + } + }; + + var toggleLegendControl = function () { + if ($scope.showLegendControl === true) { + /* use jquery to select your DOM elements that has the class 'legend' */ + $('.legendMap').hide(); + $scope.showLegendControl = false; + + $('#toggleLegendControlButton').show(); + } else { + $('.legendMap').show(); + $scope.showLegendControl = true; + + // button is defined in kommonitor-user-interface component + $('#toggleLegendControlButton').hide(); + } + }; + + $scope.$on("toggleInfoControl", function (event) { + toggleInfoControl(); + }); + + $scope.$on("toggleLegendControl", function (event) { + toggleLegendControl(); + }); + + $scope.appendInfoCloseButton = function () { + return ''; + }; + + $scope.appendLegendCloseButton = function () { + return ''; + }; + + $scope.appendIndicatorInformation = function(isCustomComputation){ + var indicatorInfoHTML = '
        '; + var titel = $scope.indicatorName; + + if (isCustomComputation) { + titel += " - individuelles Berechnungsergebnis"; + } + + indicatorInfoHTML += '

        ' + titel + '


        '; + indicatorInfoHTML += 'Beschreibung: ' + $scope.indicatorDescription + '
        '; + indicatorInfoHTML += 'Datenquelle: ' + $scope.currentIndicatorMetadataAndGeoJSON.metadata.datasource + '
        '; + indicatorInfoHTML += $scope.appendSpatialUnitOptions(); + + var transparencyDomString = ""; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += ''; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += ''; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += ''; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + transparencyDomString += '
        '; + + indicatorInfoHTML += transparencyDomString; + + var exportDomString = '
        '; + exportDomString += ""; + exportDomString += '
        '; + exportDomString += ''; + exportDomString += ''; + // temporarily disable WMS and WFS export + exportDomString += 'WMS'; + exportDomString += 'WFS'; + exportDomString += "
        "; + + indicatorInfoHTML += exportDomString; + + indicatorInfoHTML += "



        "; + + // indicatorInfoHTML += $scope.appendSimplifyGeometriesOptions(); + return indicatorInfoHTML; + }; + + + $(document).on('click', '#controlIndicatorTransparency', function (e) { + var indicatorTransparencyCheckbox = document.getElementById('controlIndicatorTransparency'); + if (indicatorTransparencyCheckbox.checked) { + $scope.useTransparencyOnIndicator = true; + } + else { + $scope.useTransparencyOnIndicator = false; + } + $rootScope.$broadcast("restyleCurrentLayer", false); + + // ensure that highlighted features remain highlighted + preserveHighlightedFeatures(); + }); + + $(document).on('click', '#controlIndicatorOutlierDetection', function (e) { + var indicatorOutlierCheckbox = document.getElementById('controlIndicatorOutlierDetection'); + if (indicatorOutlierCheckbox.checked) { + kommonitorDataExchangeService.useOutlierDetectionOnIndicator = true; + } + else { + kommonitorDataExchangeService.useOutlierDetectionOnIndicator = false; + } + $rootScope.$broadcast("restyleCurrentLayer", false); + + // ensure that highlighted features remain highlighted + preserveHighlightedFeatures(); + }); + + $(document).on('click', '#controlIndicatorZeroClassifyOption', function (e) { + var zeroClassifyCheckbox = document.getElementById('controlIndicatorZeroClassifyOption'); + if (zeroClassifyCheckbox.checked) { + kommonitorDataExchangeService.classifyZeroSeparately = true; + } + else { + kommonitorDataExchangeService.classifyZeroSeparately = false; + } + $rootScope.$broadcast("restyleCurrentLayer", false); + + // ensure that highlighted features remain highlighted + preserveHighlightedFeatures(); + }); + + $scope.$on("changeClassifyMethod", function (event, method) { + kommonitorVisualStyleHelperService.classifyMethod = method; + + $timeout(function(){ + kommonitorVisualStyleHelperService.classifyMethod = method; + $rootScope.$apply(); + }, 350); + + $rootScope.$broadcast("restyleCurrentLayer", false); + }); + + $(document).on('click', '#controlNoDataDisplay', function (e) { + var controlNoDataDisplayCheckbox = document.getElementById('controlNoDataDisplay'); + + if (controlNoDataDisplayCheckbox.checked) { + $scope.applyNoDataDisplay(); + } else { + $scope.resetNoDataDisplay(); + } + + $rootScope.$broadcast("restyleCurrentLayer", false); + + // ensure that highlighted features remain highlighted + preserveHighlightedFeatures(); + }); + + + $scope.$on("applyNoDataDisplay", function() { + $scope.applyNoDataDisplay(); + }); + + + $scope.applyNoDataDisplay = function() { + kommonitorDataExchangeService.useNoDataToggle = true; + $scope.featuresWithValues = []; + for (var i = 0; i < $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { + if (!kommonitorDataExchangeService.indicatorValueIsNoData($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { + $scope.featuresWithValues.push($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i]) + } else { + $scope.featuresWithoutValues.push($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i]) + } + } + + // get feature names array + let featuresWithValuesNames = []; + for (var i = 0; i < $scope.featuresWithValues.length; i++) { + featuresWithValuesNames.push( $scope.featuresWithValues[i].properties["name"]); + } + + // store checkbox state + let completelyRemoveFilteredFeaturesFromDisplayChbState = kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay; + kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = true; // set checkbox true + // perform spatial filter + kommonitorFilterHelperService.applySpatialFilter_currentSpatialUnitFeatures(featuresWithValuesNames); + // set checkbox to previous state + kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = completelyRemoveFilteredFeaturesFromDisplayChbState; + } + + + $scope.$on("resetNoDataDisplay", function() { + $scope.resetNoDataDisplay(); + }); + + $scope.resetNoDataDisplay = function() { + kommonitorDataExchangeService.useNoDataToggle = false; + let visibleFeatures = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features; + let visibleAndNoDataFeatures = visibleFeatures.concat($scope.featuresWithoutValues); + + // get feature names array + let visibleAndNoDataFeaturesNames = []; + for (var i = 0; i < visibleAndNoDataFeatures.length; i++) { + visibleAndNoDataFeaturesNames.push( visibleAndNoDataFeatures[i].properties["name"]); + } + + // store checkbox state + let completelyRemoveFilteredFeaturesFromDisplayChbState = kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay; + kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = true; // set checkbox true + // perform spatial filter + kommonitorFilterHelperService.applySpatialFilter_currentSpatialUnitFeatures(visibleAndNoDataFeaturesNames); + // set checkbox to previous state + kommonitorFilterHelperService.completelyRemoveFilteredFeaturesFromDisplay = completelyRemoveFilteredFeaturesFromDisplayChbState; + + $scope.featuresWithoutValues = []; + } + + + /** + * binds the popup of a clicked output + * to layer.feature.properties.popupContent + */ + function onEachFeatureSpatialUnit(feature, layer) { + // does this feature have a property named popupContent? + layer.on({ + click: function () { + + // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; + + layer.bindPopup(popupContent); + + // if (propertiesString) + // layer.bindPopup(propertiesString); + } + }); + } + + /** + * binds the popup of a clicked output + * to layer.feature.properties.popupContent + */ + function onEachFeatureGeoresource(feature, layer) { + // does this feature have a property named popupContent? + layer.on({ + click: function () { + + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; + + layer.bindPopup(popupContent); + + // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + + // if (propertiesString) + // layer.bindPopup(propertiesString); + } + }); + } + + /** + * binds the popup of a clicked output + * to layer.feature.properties.popupContent + */ + function onEachFeatureIndicator(feature, layer) { + var indicatorValue = feature.properties[INDICATOR_DATE_PREFIX + $scope.date]; + var indicatorValueText; + if (kommonitorDataExchangeService.indicatorValueIsNoData(indicatorValue)) { + indicatorValueText = "NoData"; + } + else { + indicatorValueText = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(indicatorValue); + } + var tooltipHtml = "" + feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] + "
        " + indicatorValueText + " [" + kommonitorDataExchangeService.selectedIndicator.unit + "]"; + layer.bindTooltip(tooltipHtml, { + sticky: false // If true, the tooltip will follow the mouse instead of being fixed at the feature center. + }); + layer.on({ + mouseover: highlightFeature, + mouseout: resetHighlight, + click: function () { + switchHighlightFeature(layer); + } + }); + } + + + + function switchHighlightFeature(layer) { + // add or remove feature within a list of "clicked features" + // those shall be treated specially, i.e. keep being highlighted + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + kommonitorFilterHelperService.addFeatureToSelection(layer.feature); + highlightClickedFeature(layer); + } + + else { + //remove from array + kommonitorFilterHelperService.removeFeatureFromSelection(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME]); + resetHighlightClickedFeature(layer); + } + } + + function onEachFeatureCustomIndicator(feature, layer) { + // does this feature have a property named popupContent? + layer.on({ + mouseover: highlightFeature, + mouseout: resetHighlightCustom, + click: function () { + + var popupContent = layer.feature.properties; + + if (popupContent) + layer.bindPopup("Indicator: " + JSON.stringify(popupContent)); + } + }); + } + + + $scope.$on("addSpatialUnitAsGeopackage", function (event) { + + console.log('addSpatialUnitAsGeopackage was called'); + + var layer = L.geoPackageFeatureLayer([], { + geoPackageUrl: './test1234.gpkg', + layerName: 'test1234', + style: function (feature) { + return { + color: "#F00", + weight: 1, + opacity: 1 + }; + }, + onEachFeature: onEachFeatureSpatialUnit + }); + + // layer.StyledLayerControl = { + // removable : true, + // visible : true + // }; + + $scope.layerControl.addOverlay(layer, "GeoPackage", { groupName: spatialUnitLayerGroupName }); + layer.addTo($scope.map); + $scope.updateSearchControl(); + + + }); + + $scope.$on("addSpatialUnitAsGeoJSON", function (event, spatialUnitMetadataAndGeoJSON, date) { + + console.log('addSpatialUnitAsGeoJSON was called'); + + // if ($scope.layers.overlays[spatialUnitMetadataAndGeoJSON.spatialUnitLevel]) { + // delete $scope.layers.overlays[spatialUnitMetadataAndGeoJSON.spatialUnitLevel]; + // + // console.log($scope.layers.overlays); + // } + + var layer = L.geoJSON(spatialUnitMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + return { + color: "blue", + weight: 1, + opacity: 1 + }; + }, + onEachFeature: onEachFeatureSpatialUnit + }); + + // layer.StyledLayerControl = { + // removable : true, + // visible : true + // }; + + $scope.layerControl.addOverlay(layer, spatialUnitMetadataAndGeoJSON.spatialUnitLevel + "_" + date, spatialUnitLayerGroupName); + layer.addTo($scope.map); + $scope.updateSearchControl(); + + }); + + $scope.$on("addGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { + + var layer = L.geoJSON(georesourceMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + return { + color: "red", + weight: 1, + opacity: 1 + }; + }, + onEachFeature: onEachFeatureGeoresource + }); + + // layer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + + $scope.layerControl.addOverlay(layer, georesourceMetadataAndGeoJSON.datasetName + "_" + date, georesourceLayerGroupName); + layer.addTo($scope.map); + $scope.updateSearchControl(); + + $scope.map.invalidateSize(true); + }); + + $scope.$on("replaceIsochronesAsGeoJSON", function (event, geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour) { + + if ($scope.isochronesLayer) { + $scope.layerControl.removeLayer($scope.isochronesLayer); + $scope.map.removeLayer($scope.isochronesLayer); + } + + $scope.isochronesLayer = L.featureGroup(); + + $scope.isochroneReachMode = reachMode; + var cutOffUnitValue = "Meter"; + var reachModeValue = "Distanz"; + if (reachMode === "time") { + cutOffUnitValue = "Minuten"; + reachModeValue = "Zeit"; + } + + var transitModeValue = "Passant"; + switch (transitMode) { + case "buffer": + transitModeValue = "Puffer (Luftlinie)"; + break; + case "cycling-regular": + transitModeValue = "Fahrrad"; + break; + case "driving-car": + transitModeValue = "PKW"; + break; + case "wheelchair": + transitModeValue = "Barrierefrei"; + break; + default: + transitModeValue = "Passant"; + } + + kommonitorDataExchangeService.isochroneLegend = { + transitMode: transitModeValue, + reachMode: reachModeValue, + speedInKilometersPerHour: speedInKilometersPerHour, + colorValueEntries: [], + cutOffValues: cutOffValues, + cutOffUnit: cutOffUnitValue + }; + + if (cutOffValues.length === 0) { + return; + } + else if (cutOffValues.length === 1) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "green", + value: cutOffValues[0] + }]; + } + else if (cutOffValues.length === 2) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + else if (cutOffValues.length === 3) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "red", + value: cutOffValues[2] + }, + { + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + else if (cutOffValues.length === 4) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "red", + value: cutOffValues[3] + }, + { + color: "orange", + value: cutOffValues[2] + }, + { + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + else if (cutOffValues.length === 5) { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "brown", + value: cutOffValues[4] + }, { + color: "red", + value: cutOffValues[3] + }, + { + color: "orange", + value: cutOffValues[2] + }, + { + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + else { + kommonitorDataExchangeService.isochroneLegend.colorValueEntries = [{ + color: "brown", + value: cutOffValues[4] + }, { + color: "red", + value: cutOffValues[3] + }, + { + color: "orange", + value: cutOffValues[2] + }, + { + color: "yellow", + value: cutOffValues[1] + }, + { + color: "green", + value: cutOffValues[0] + }]; + } + + if (useMultipleStartPoints && dissolveIsochrones) { + // merge intersecting isochrones of same cutOffValue + + // execute it 3 times in order to dissolve multiple intersections + geoJSON = mergeIntersectingIsochrones(geoJSON); + geoJSON = mergeIntersectingIsochrones(geoJSON); + geoJSON = mergeIntersectingIsochrones(geoJSON); + } + + // sort features to ensure correct z-order of layers (begin with smallest isochrones) + geoJSON.features.sort((a, b) => a.properties.value - b.properties.value); + + for (var index = geoJSON.features.length - 1; index >= 0; index--) { + + var styleIndex = getStyleIndexForFeature(geoJSON.features[index], kommonitorDataExchangeService.isochroneLegend.colorValueEntries, reachMode); + + var style = { + color: kommonitorDataExchangeService.isochroneLegend.colorValueEntries[styleIndex].color, + weight: 1, + opacity: 0.4, + fillOpacity: 0.3 + }; + + L.geoJSON(geoJSON.features[index], { + style: style, + onEachFeature: function (feature, layer) { + layer.on({ + click: function () { + + var isochroneValue = layer.feature.properties.value; + + if ($scope.isochroneReachMode === "time") { + //transform seconds to minutes + isochroneValue = isochroneValue / 60; + } + var popupContent = "" + isochroneValue + " " + cutOffUnitValue; + // var popupContent = "TestValue"; + + if (popupContent) + layer.bindPopup("Isochrone: " + JSON.stringify(popupContent)); + } + }); + } + }).addTo($scope.isochronesLayer); + } + + // $scope.isochronesLayer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + + $scope.layerControl.addOverlay($scope.isochronesLayer, "Erreichbarkeits-Isochronen_" + transitModeValue, reachabilityLayerGroupName); + $scope.isochronesLayer.addTo($scope.map); + $scope.updateSearchControl(); + + $scope.map.invalidateSize(true); + }); + + $scope.$on("replaceRouteAsGeoJSON", function (event, geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, + routeDistance_km, routeDuration_minutes) { + + if ($scope.routingLayer) { + $scope.layerControl.removeLayer($scope.routingLayer); + $scope.map.removeLayer($scope.routingLayer); + } + + var preferenceValue = "Schnellste"; + if (preference === "recommended") { + preferenceValue = "Empfohlen"; + } + else if (preference === "shortest") { + preferenceValue = "Kürzeste"; + } + + var transitModeValue = "Passant"; + switch (transitMode) { + case "cycling-regular": + transitModeValue = "Fahrrad"; + break; + case "driving-car": + transitModeValue = "PKW"; + break; + case "wheelchair": + transitModeValue = "Barrierefrei"; + break; + default: + transitModeValue = "Passant"; + } + + /* + routeDistance_km, routeDuration_minutes, routeAvgSpeed_kmh, + routeTotalAscent, routeTotalDescent + */ + + kommonitorDataExchangeService.routingLegend = { + transitMode: transitModeValue, + preference: preferenceValue, + routingStartPoint: routingStartPoint, + routingEndPoint: routingEndPoint, + routeDistance_km: routeDistance_km, + routeDuration_minutes: routeDuration_minutes + }; + + var style = { + color: "#ed561a", + weight: 5, + opacity: 0.7 + }; + + $scope.routingLayer = L.featureGroup(); + + // start and end point + var customStartMarker = L.AwesomeMarkers.icon({ + icon: "home", + iconColor: "white", + markerColor: "green" + }); + + var customEndMarker = L.AwesomeMarkers.icon({ + icon: "screenshot", + iconColor: "white", + markerColor: "red" + }); + + var numPoints = geoJSON.features[0].geometry.coordinates.length; + var startPoint = geoJSON.features[0].geometry.coordinates[0]; + var endPoint = geoJSON.features[0].geometry.coordinates[numPoints - 1]; + + L.marker([startPoint[1], startPoint[0]], { icon: customStartMarker }).bindPopup(routingStartPoint.label).addTo($scope.routingLayer); + L.marker([endPoint[1], endPoint[0]], { icon: customEndMarker }).bindPopup(routingEndPoint.label).addTo($scope.routingLayer); + + L.geoJSON(geoJSON, { + style: style, + onEachFeature: function (feature, layer) { + layer.on({ + click: function () { + var popupContent = "Routing Ergebnis - " + transitModeValue + " - " + preferenceValue; + // var popupContent = "TestValue"; + + if (popupContent) + layer.bindPopup(JSON.stringify(popupContent)); + } + }); + } + }).addTo($scope.routingLayer); + + // $scope.isochronesLayer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + + $scope.layerControl.addOverlay($scope.routingLayer, "Routing-Ergebnis_" + transitModeValue + "_" + preferenceValue, reachabilityLayerGroupName); + $scope.routingLayer.addTo($scope.map); + $scope.map.fitBounds($scope.routingLayer.getBounds()); + $scope.updateSearchControl(); + + $scope.map.invalidateSize(true); + }); + + var getStyleIndexForFeature = function (feature, colorValueEntries, reachMode) { + var index = 0; + var featureCutOffValue = feature.properties.value; + + if (reachMode === "time") { + // answe has time in seconds - we expect minutes! + featureCutOffValue = featureCutOffValue / 60; + } + + for (var i = 0; i < colorValueEntries.length; i++) { + if (featureCutOffValue === colorValueEntries[i].value) { + index = i; + break; + } + } + + return index; + }; + + var mergeIntersectingIsochrones = function (geoJSON) { + // use turf to dissolve any overlapping/intersecting isochrones that have the same cutOffValue! + + try { + var dissolved = turf.dissolve(geoJSON, { propertyName: 'value' }); + + return dissolved; + } catch (e) { + console.error("Dissolving Isochrones failed with error: " + e); + console.error("Will return undissolved isochrones"); + return geoJSON; + } finally { + + } + + }; + + $scope.$on("replaceIsochroneMarker", function (event, lonLatArray) { + + if ($scope.isochroneMarkerLayer) { + $scope.layerControl.removeLayer($scope.isochroneMarkerLayer); + $scope.map.removeLayer($scope.isochroneMarkerLayer); + } + + $scope.isochroneMarkerLayer = L.featureGroup(); + + lonLatArray.forEach(function (lonLat) { + var layer = L.marker([lonLat[1], lonLat[0]]); + layer.bindPopup("Startpunkt der Isochronenberechnung"); + layer.addTo($scope.isochroneMarkerLayer); + }); + + $scope.layerControl.addOverlay($scope.isochroneMarkerLayer, "Startpunkte für Isochronenberechnung", reachabilityLayerGroupName); + $scope.isochroneMarkerLayer.addTo($scope.map); + $scope.updateSearchControl(); + + $scope.map.invalidateSize(true); + }); + + var createCustomMarkersFromWfsPoints = function(wfsLayer, poiMarkerLayer, dataset){ + for (var layerPropName in wfsLayer._layers){ + var geoJSONFeature = wfsLayer._layers[layerPropName].feature; + var latlng = wfsLayer._layers[layerPropName]._latlng; + + geoJSONFeature.geometry = { + type: "Point", + coordinates: [latlng.lng, latlng.lat] + }; + + var customMarker = createCustomMarker(geoJSONFeature, dataset.poiSymbolColor, dataset.poiMarkerColor, dataset.poiSymbolBootstrap3Name, dataset); + poiMarkerLayer = addPoiMarker(poiMarkerLayer, customMarker); + } + + return poiMarkerLayer; + }; + + var createCustomMarker = function(poiFeature, poiSymbolColor, poiMarkerColor, poiSymbolBootstrap3Name, metadataObject){ + var customMarker; + try { + customMarker = L.AwesomeMarkers.icon({ + icon: poiSymbolBootstrap3Name, + iconColor: poiSymbolColor, + markerColor: poiMarkerColor + }); + } catch (err) { + customMarker = L.AwesomeMarkers.icon({ + icon: 'home', // default back to home + iconColor: poiSymbolColor, + markerColor: poiMarkerColor + }); + } + + var newMarker; + + if(poiFeature.geometry.type === "Point"){ + // LAT LON order + newMarker = L.marker([Number(poiFeature.geometry.coordinates[1]), Number(poiFeature.geometry.coordinates[0])], { icon: customMarker }); + + //populate the original geoJSOn feature to the marker layer! + newMarker.feature = poiFeature; + newMarker.metadataObject = metadataObject; + } + else if (poiFeature.geometry.type === "MultiPoint"){ + + // simply take the first point as feature reference POI + // LAT LON order + newMarker = L.marker([Number(poiFeature.geometry.coordinates[0][1]), Number(poiFeature.geometry.coordinates[0][0])], { icon: customMarker }); + + //populate the original geoJSOn feature to the marker layer! + newMarker.feature = poiFeature; + newMarker.metadataObject = metadataObject; + } + else{ + console.error("NO POI object: instead got feature of type " + poiFeature.geometry.type); + } + + return newMarker; + + }; + + $scope.$on("addPoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date, useCluster) { + + // use leaflet.markercluster to cluster markers! + var markers; + if (useCluster) { + markers = L.markerClusterGroup({ + iconCreateFunction: function (cluster) { + var childCount = cluster.getChildCount(); + + var c = 'cluster-'; + if (childCount < 10) { + c += 'small'; + } else if (childCount < 30) { + c += 'medium'; + } else { + c += 'large'; + } + + var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + georesourceMetadataAndGeoJSON.poiMarkerColor; + + //'marker-cluster' + c + ' ' + + return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); + } + }); + } + else { + markers = L.layerGroup(); + } + + georesourceMetadataAndGeoJSON.geoJSON.features.forEach(function (poiFeature) { + // index 0 should be longitude and index 1 should be latitude + //.bindPopup( poiFeature.properties.name ) + var newMarker = createCustomMarker(poiFeature, georesourceMetadataAndGeoJSON.poiSymbolColor, georesourceMetadataAndGeoJSON.poiMarkerColor, georesourceMetadataAndGeoJSON.poiSymbolBootstrap3Name, georesourceMetadataAndGeoJSON); + + markers = addPoiMarker(markers, newMarker); + }); + + // markers.StyledLayerControl = { + // removable : false, + // visible : true + // }; + + $scope.layerControl.addOverlay(markers, georesourceMetadataAndGeoJSON.datasetName + "_" + date, poiLayerGroupName); + markers.addTo($scope.map); + $scope.updateSearchControl(); + // $scope.map.addLayer( markers ); + $scope.map.invalidateSize(true); + }); + + $scope.$on("addPoiGeoresourceAsGeoJSON_reachabilityAnalysis", function (event, georesourceMetadataAndGeoJSON, date, useCluster) { + + // use leaflet.markercluster to cluster markers! + var markers; + if (useCluster) { + markers = L.markerClusterGroup({ + iconCreateFunction: function (cluster) { + var childCount = cluster.getChildCount(); + + var c = 'cluster-'; + if (childCount < 10) { + c += 'small'; + } else if (childCount < 30) { + c += 'medium'; + } else { + c += 'large'; + } + + var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + georesourceMetadataAndGeoJSON.poiMarkerColor; + + //'marker-cluster' + c + ' ' + + return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); + } + }); + } + else { + markers = L.layerGroup(); + } + + georesourceMetadataAndGeoJSON.geoJSON.features.forEach(function (poiFeature) { + // index 0 should be longitude and index 1 should be latitude + //.bindPopup( poiFeature.properties.name ) + var newMarker = createCustomMarker(poiFeature, georesourceMetadataAndGeoJSON.poiSymbolColor, georesourceMetadataAndGeoJSON.poiMarkerColor, georesourceMetadataAndGeoJSON.poiSymbolBootstrap3Name, georesourceMetadataAndGeoJSON); + + markers = addPoiMarker(markers, newMarker); + }); + + // markers.StyledLayerControl = { + // removable : false, + // visible : true + // }; + + $scope.layerControl.addOverlay(markers, georesourceMetadataAndGeoJSON.datasetName + "_" + date + "_inEinzugsgebiet", reachabilityLayerGroupName); + markers.addTo($scope.map); + $scope.updateSearchControl(); + // $scope.map.addLayer( markers ); + $scope.map.invalidateSize(true); + }); + + var addPoiMarker = function(markers, poiMarker){ + + // var propertiesString = "
        " + JSON.stringify(poiMarker.feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + + var popupContent = '
        '; + for (var p in poiMarker.feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + ''+ poiMarker.feature.properties[p] + '
        '; + + if (poiMarker.feature.properties.name) { + poiMarker.bindPopup(poiMarker.feature.properties.name + "\n\n" + popupContent); + } + else if (poiMarker.feature.properties.NAME) { + poiMarker.bindPopup(poiMarker.feature.properties.NAME + "\n\n" + popupContent); + } + else if (poiMarker.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME]) { + poiMarker.bindPopup(poiMarker.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] + "\n\n" + popupContent); + } + else { + // poiMarker.bindPopup(propertiesString); + poiMarker.bindPopup(popupContent); + } + markers.addLayer(poiMarker); + + return markers; + }; + + $scope.$on("removePoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { + + var layerName = georesourceMetadataAndGeoJSON.datasetName; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === poiLayerGroupName && layer.name.includes(layerName + "_")) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + $scope.updateSearchControl(); + } + }); + }); + + $scope.$on("removePoiGeoresource_reachabilityAnalysis", function (event, georesourceMetadataAndGeoJSON) { + + var layerName = georesourceMetadataAndGeoJSON.datasetName; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerName + "_")) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + $scope.updateSearchControl(); + } + }); + }); + + $scope.$on("addAoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { + + var color = georesourceMetadataAndGeoJSON.aoiColor; + + var layer = L.geoJSON(georesourceMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + return { + fillColor: color, + color: "black", + weight: 1, + opacity: 1, + fillOpacity: 0.7 + }; + }, + onEachFeature: onEachFeatureGeoresource + }); + + // layer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + + $scope.layerControl.addOverlay(layer, georesourceMetadataAndGeoJSON.datasetName + "_" + date, aoiLayerGroupName); + layer.addTo($scope.map); + $scope.updateSearchControl(); + + $scope.map.invalidateSize(true); + }); + + $scope.$on("removeAoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { + + var layerName = georesourceMetadataAndGeoJSON.datasetName; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === aoiLayerGroupName && layer.name.includes(layerName + "_")) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + $scope.updateSearchControl(); + } + }); + }); + + $scope.$on("addLoiGeoresourceAsGeoJSON", function (event, georesourceMetadataAndGeoJSON, date) { + + var color = georesourceMetadataAndGeoJSON.aoiColor; + + var featureGroup = L.featureGroup(); + + var style = { + color: georesourceMetadataAndGeoJSON.loiColor, + dashArray: georesourceMetadataAndGeoJSON.loiDashArrayString, + weight: georesourceMetadataAndGeoJSON.loiWidth || 3, + opacity: 1 + }; + + + + georesourceMetadataAndGeoJSON.geoJSON.features.forEach((item, i) => { + var type = item.geometry.type; + + if (type === "Polygon" || type === "MultiPolygon"){ + var lines = turf.polygonToLine(item); + + L.geoJSON(lines, { + style: style, + onEachFeature: onEachFeatureGeoresource + }).addTo(featureGroup); + } + else{ + L.geoJSON(item, { + style: style, + onEachFeature: onEachFeatureGeoresource + }).addTo(featureGroup); + } + }); + + // georesourceMetadataAndGeoJSON.geoJSON.features.forEach((loiFeature, i) => { + // var latLngs = + // var polyline = L.polyline(loiFeature.geometry.coordinates); + // + // var geoJSON = polyline.toGeoJSON(); + // + // var geoJSON_line = L.geoJSON(geoJSON, { + // style: style, + // onEachFeature: onEachFeatureGeoresource + // }) + // + // geoJSON_line.addTo(featureGroup); + // }); + + // layer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + + $scope.layerControl.addOverlay(featureGroup, georesourceMetadataAndGeoJSON.datasetName + "_" + date, loiLayerGroupName); + featureGroup.addTo($scope.map); + $scope.updateSearchControl(); + + $scope.map.invalidateSize(true); + }); + + $scope.$on("removeLoiGeoresource", function (event, georesourceMetadataAndGeoJSON) { + + var layerName = georesourceMetadataAndGeoJSON.datasetName; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === loiLayerGroupName && layer.name.includes(layerName + "_")) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + $scope.updateSearchControl(); + } + }); + }); + + $scope.$on("adjustOpacityForIndicatorLayer", function (event, indicatorMetadata, opacity) { + // var layerName = indicatorMetadataAndGeoJSON.indicatorName; + // + // $scope.layerControl._layers.forEach(function(layer){ + // if(layer.group.name === indicatorLayerGroupName && layer.name.includes(layerName)){ + // layer.layer.setOpacity(opacity); + // layer.layer.setStyle({ + // opacity: opacity + // }); + // } + // }); + + opacity = opacity.toFixed(numberOfDecimals); + + kommonitorVisualStyleHelperService.setOpacity(opacity); + $rootScope.$broadcast("restyleCurrentLayer", true); + }); + + $scope.$on("addWmsLayerToMap", function (event, dataset, opacity) { + var wmsLayer = L.tileLayer.betterWms(dataset.url, { + layers: dataset.layerName, + transparent: true, + format: 'image/png', + minZoom: __env.minZoomLevel, + maxZoom: __env.maxZoomLevel, + opacity: opacity + }); + + $scope.layerControl.addOverlay(wmsLayer, dataset.title, wmsLayerGroupName); + wmsLayer.addTo($scope.map); + $scope.updateSearchControl(); + $scope.map.invalidateSize(true); + }); + + $scope.$on("adjustOpacityForWmsLayer", function (event, dataset, opacity) { + var layerName = dataset.title; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wmsLayerGroupName && layer.name.includes(layerName)) { + layer.layer.setOpacity(opacity); + } + }); + }); + + $scope.$on("adjustOpacityForAoiLayer", function (event, dataset, opacity) { + var layerName = dataset.datasetName; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === aoiLayerGroupName && layer.name.includes(layerName)) { + layer.layer.setStyle({ + fillOpacity:opacity, + opacity:opacity + }); + } + }); + }); + + $scope.$on("adjustOpacityForLoiLayer", function (event, dataset, opacity) { + var layerName = dataset.datasetName; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === loiLayerGroupName && layer.name.includes(layerName)) { + layer.layer.setStyle({ + fillOpacity:opacity, + opacity:opacity + }); + } + }); + }); + + $scope.$on("adjustOpacityForPoiLayer", function (event, dataset, opacity) { + var layerName = dataset.datasetName; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === poiLayerGroupName && layer.name.includes(layerName)) { + + if(layer.layer._layers){ + for(var layerId in layer.layer._layers){ + layer.layer._layers[layerId].setOpacity(opacity); + } + } + else if(layer.layer._featureGroup){ + for(var layerId in layer.layer._featureGroup._layers){ + layer.layer._featureGroup._layers[layerId].setOpacity(opacity); + } + } + else{ + layer.layer.setOpacity(opacity); + } + } + }); + }); + + $scope.$on("removeWmsLayerFromMap", function (event, dataset) { + + var layerName = dataset.title; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wmsLayerGroupName && layer.name.includes(layerName)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } + }); + }); + + var getWfsStyle = function(dataset, opacity){ + + if(dataset.geometryType === "POI"){ + return { + weight: 1, + opacity: opacity, + color: dataset.poiMarkerColor, + dashArray: '', + fillOpacity: opacity, + fillColor: dataset.poiMarkerColor + }; + } + + else if (dataset.geometryType === "LOI"){ + return { + weight: dataset.loiWidth, + opacity: opacity, + color: dataset.loiColor, + dashArray: dataset.loiDashArrayString, + fillOpacity: opacity, + fillColor: dataset.loiColor + }; + } + + else{ + return { + weight: 1, + opacity: opacity, + color: dataset.aoiColor, + dashArray: '', + fillOpacity: opacity, + fillColor: dataset.aoiColor + }; + } + + }; + + $scope.getFilterEncoding = function(dataset){ + + var filterExpressions = []; + + if(dataset.filterEncoding.PropertyIsEqualTo && dataset.filterEncoding.PropertyIsEqualTo.propertyName && dataset.filterEncoding.PropertyIsEqualTo.propertyValue){ + filterExpressions.push(new L.Filter.EQ(dataset.filterEncoding.PropertyIsEqualTo.propertyName, dataset.filterEncoding.PropertyIsEqualTo.propertyValue)); + } + + if (dataset.filterFeaturesToMapBBOX) { + filterExpressions.push(new L.Filter.BBox(dataset.featureTypeGeometryName, $scope.map.getBounds(), L.CRS.EPSG3857)); + } + + if (filterExpressions.length == 0){ + return undefined; + } + + if (filterExpressions.length < 2){ + return filterExpressions; + } + else{ + // var stringifiedFilterExpressions = []; + + // for (const filterExpr of filterExpressions) { + // stringifiedFilterExpressions.push(L.XmlUtil.serializeXmlDocumentString(filterExpr.toGml())); + // } + + // return new L.Filter.And(...stringifiedFilterExpressions); + return new L.Filter.And(...filterExpressions); + } + + }; + + $scope.$on("addWfsLayerToMap", function (event, dataset, opacity, useCluster) { + var wfsLayerOptions = { + url: dataset.url, + typeNS: dataset.featureTypeNamespace, + namespaceUri: "http://mapserver.gis.umn.edu/mapserver", + typeName: dataset.featureTypeName, + geometryField: dataset.featureTypeGeometryName, + // maxFeatures: null, + style: getWfsStyle(dataset, opacity) + }; + + var filterEncoding = $scope.getFilterEncoding(dataset); + if (filterEncoding){ + wfsLayerOptions.filter = filterEncoding; + } + + + var wfsLayer; + var poiMarkerLayer; + + if(dataset.geometryType === "POI"){ + + if (useCluster) { + poiMarkerLayer = L.markerClusterGroup({ + iconCreateFunction: function (cluster) { + var childCount = cluster.getChildCount(); + + var c = 'cluster-'; + if (childCount < 10) { + c += 'small'; + } else if (childCount < 30) { + c += 'medium'; + } else { + c += 'large'; + } + + var className = "marker-cluster " + c + " awesome-marker-legend-TransparentIcon-" + dataset.poiMarkerColor; + + //'marker-cluster' + c + ' ' + + return new L.DivIcon({ html: '
        ' + childCount + '
        ', className: className, iconSize: new L.Point(40, 40) }); + } + }); + } + else { + poiMarkerLayer = L.layerGroup(); + } + + wfsLayer = new L.WFS(wfsLayerOptions); + } + else{ + wfsLayer = new L.WFS(wfsLayerOptions); + } + + try { + wfsLayer.once('load', function () { + + if(dataset.geometryType === "POI"){ + poiMarkerLayer = createCustomMarkersFromWfsPoints(wfsLayer, poiMarkerLayer, dataset); + } + + console.log("Try to fit bounds on wfsLayer"); + $scope.map.fitBounds(wfsLayer.getBounds()); + + console.log("Tried fit bounds on wfsLayer"); + + $scope.map.invalidateSize(true); + // $scope.loadingData = false; + }); + + wfsLayer.on('click', function (event) { + // var propertiesString = "
        " + JSON.stringify(event.layer.feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + + var popupContent = '
        '; + for (var p in event.layer.feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + ''+ event.layer.feature.properties[p] + '
        '; + + var popup = L.popup(); + popup + .setLatLng(event.latlng) + .setContent(popupContent) + .openOn($scope.map); + }); + if(poiMarkerLayer){ + $scope.layerControl.addOverlay(poiMarkerLayer, dataset.title, wfsLayerGroupName); + poiMarkerLayer.addTo($scope.map); + } + else{ + $scope.layerControl.addOverlay(wfsLayer, dataset.title, wfsLayerGroupName); + wfsLayer.addTo($scope.map); + } + $scope.updateSearchControl(); + + } + catch (error) { + $scope.loadingData = false; + kommonitorDataExchangeService.displayMapApplicationError(error); + } + + }); + + $scope.$on("adjustOpacityForWfsLayer", function (event, dataset, opacity) { + var layerName = dataset.title; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { + // layer.layer.setOpacity(opacity); + var newStyle = getWfsStyle(dataset, opacity); + // layer.layer.options.style = newStyle; + if(layer.layer._layers){ + for(var layerId in layer.layer._layers){ + + + if(dataset.geometryType === "POI"){ + layer.layer._layers[layerId].setOpacity(opacity); + } + else{ + layer.layer._layers[layerId].setStyle(newStyle); + } + } + } + else{ + + if(dataset.geometryType === "POI"){ + layer.layer.setOpacity(opacity); + } + else{ + layer.layer.setStyle(newStyle); + } + } + + } + }); + }); + + $scope.$on("adjustColorForWfsLayer", function (event, dataset, opacity) { + var layerName = dataset.title; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { + var newStyle = getWfsStyle(dataset, opacity); + + layer.layer.setStyle(newStyle); + } + }); + }); + + $scope.$on("removeWfsLayerFromMap", function (event, dataset) { + + var layerName = dataset.title; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === wfsLayerGroupName && layer.name.includes(layerName)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } + }); + }); + + $scope.$on("addFileLayerToMap", function (event, dataset, opacity) { + var fileLayer; + + var style = { + weight: 1, + opacity: opacity, + color: defaultBorderColor, + dashArray: '', + fillOpacity: 1, + fillColor: dataset.displayColor + }; + + var fileType = dataset.type; + if (fileType.toUpperCase() === "geojson".toUpperCase()) { + var geoJSON = dataset.content; + + if (isLinearGeoJSON(geoJSON)) { + // when is line dataset then set the border color + style.color = dataset.displayColor; + } + + fileLayer = L.geoJSON(geoJSON, { + style: style, + onEachFeature: function (feature, layer) { + layer.on({ + click: function () { + + // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; + + if (popupContent) + layer.bindPopup(popupContent); + } + }); + } + }); + $scope.showFileLayer(fileLayer, dataset); + } + else if (fileType.toUpperCase() === "shp".toUpperCase()) { + // transform shape ZIP arrayBuffer to GeoJSON + // var geoJSON = await shp(dataset.content).then( + // var zip = shp.parseZip(dataset.content); + shp(dataset.content).then( + function (geojson) { + console.log("Shapefile parsed successfully"); + + if (isLinearGeoJSON(geojson)) { + // when is line dataset then set the border color + style.color = dataset.displayColor; + } + + fileLayer = L.geoJSON(geojson, { + style: style, + onEachFeature: function (feature, layer) { + layer.on({ + click: function () { + + // var propertiesString = "
        " + JSON.stringify(feature.properties, null, ' ').replace(/[\{\}"]/g, '') + "
        "; + + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; + + if (popupContent) + layer.bindPopup(popupContent); + } + }); + } + }); + + + $scope.showFileLayer(fileLayer, dataset); + }, + function (reason) { + console.error("Error while parsing Shapefile"); + console.error(reason); + $rootScope.$broadcast("FileLayerError", reason, dataset); + throw reason; + } + ); + } + + }); + + var isLinearGeoJSON = function (geoJSON) { + if (geoJSON.features) { + // featureCollection + if (geoJSON.features[0].geometry) { + if (geoJSON.features[0].geometry.type === "LineString" || geoJSON.features[0].geometry.type === "MultiLineString") { + return true; + } + } + } + else if (geoJSON.geometry) { + // single object + if (geoJSON.geometry.type === "LineString" || geoJSON.geometry.type === "MultiLineString") { + return true; + } + } + else if (geoJSON.geometries) { + // geometryCollection + if (geoJSON.geometries[0].type === "LineString" || geoJSON.geometries[0].type === "MultiLineString") { + return true; + } + } + + return false; + }; + + $scope.showFileLayer = function (fileLayer, dataset) { + $scope.layerControl.addOverlay(fileLayer, dataset.title, fileLayerGroupName); + fileLayer.addTo($scope.map); + + console.log("Try to fit bounds on fileLayer"); + $scope.map.fitBounds(fileLayer.getBounds()); + + console.log("Tried fit bounds on fileLayer"); + + $rootScope.$broadcast("FileLayerSuccess", dataset); + + $scope.updateSearchControl(); + + $scope.map.invalidateSize(true); + }; + + $scope.$on("adjustOpacityForFileLayer", function (event, dataset, opacity) { + var layerName = dataset.title; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { + var newStyle = { + weight: 1, + opacity: opacity, + color: defaultBorderColor, + dashArray: '', + fillOpacity: opacity, + fillColor: dataset.displayColor + }; + + // layer.layer.options.style = newStyle; + layer.layer.setStyle(newStyle); + } + }); + }); + + $scope.$on("adjustColorForFileLayer", function (event, dataset) { + var layerName = dataset.title; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { + var newStyle = { + weight: 1, + color: defaultBorderColor, + dashArray: '', + fillColor: dataset.displayColor + }; + + //var geoJSON = layer.layertoGeoJSON(); + var firstLayersPropertyName = Object.keys(layer.layer._layers)[0]; + if (firstLayersPropertyName) { + var geoJSON_exmaple = layer.layer._layers[firstLayersPropertyName].toGeoJSON(); + if (isLinearGeoJSON(geoJSON_exmaple)) { + newStyle.color = dataset.displayColor; + } + } + + layer.layer.setStyle(newStyle); + } + }); + }); + + $scope.$on("removeFileLayerFromMap", function (event, dataset) { + + var layerName = dataset.title; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === fileLayerGroupName && layer.name.includes(layerName)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } + }); + }); + + $scope.$on("removeReachabilityLayers", function (event) { + + var layerNamePartly = "Isochrone"; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerNamePartly)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } + }); + }); + + $scope.$on("removeRoutingLayers", function (event) { + + var layerNamePartly = "Routing"; + + $scope.layerControl._layers.forEach(function (layer) { + if (layer.group.name === reachabilityLayerGroupName && layer.name.includes(layerNamePartly)) { + $scope.layerControl.removeLayer(layer.layer); + $scope.map.removeLayer(layer.layer); + } + }); + }); + + function highlightFeature(e) { + var layer = e.target; + + highlightFeatureForLayer(layer); + } + + function highlightFeatureForLayer(layer) { + + setTemporarilyHighlightedStyle(layer); + + // update diagrams for hovered feature + $rootScope.$broadcast("updateDiagramsForHoveredFeature", layer.feature.properties); + + } + + function highlightClickedFeature(layer) { + + setPermanentlyHighlightedStyle(layer); + + // update diagrams for hovered feature + $rootScope.$broadcast("updateDiagramsForHoveredFeature", layer.feature.properties); + } + + function setPermanentlyHighlightedStyle(layer) { + var fillOpacity = 1; + if ($scope.useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacityForHighlightedFeatures; + } + + layer.setStyle({ + weight: 3, + color: defaultColorForClickedFeatures, + dashArray: '', + fillOpacity: fillOpacity + }); + + if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { + layer.bringToFront(); + // also bring possible isochrone layer to front + // so it will not disapper behing indicator layer + if ($scope.isochronesLayer) { + $scope.isochronesLayer.bringToFront(); + } + } + } + + function setTemporarilyHighlightedStyle(layer) { + var fillOpacity = 1; + if ($scope.useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacity; + } + + layer.setStyle({ + weight: 3, + color: defaultColorForHoveredFeatures, + dashArray: '', + fillOpacity: fillOpacity + }); + + if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { + layer.bringToFront(); + // also bring possible isochrone layer to front + // so it will not disapper behing indicator layer + if ($scope.isochronesLayer) { + $scope.isochronesLayer.bringToFront(); + } + } + } + + function preserveHighlightedFeatures() { + $scope.map.eachLayer(function (layer) { + if (layer.feature) { + if (kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + setPermanentlyHighlightedStyle(layer); + $rootScope.$broadcast("updateDiagramsForHoveredFeature", layer.feature.properties); + } + } + }); + } + + $scope.$on("preserveHighlightedFeatures", function (event) { + preserveHighlightedFeatures(); + }); + + function resetHighlight(e) { + var layer = e.target; + resetHighlightForLayer(layer); + + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.bringToBack(); + } + //layer.bringToBack(); + } + + function resetHighlightForLayer(layer) { + + var style; + + // only restyle feature when not in list of clicked features + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else if (!kommonitorDataExchangeService.isMeasureOfValueChecked) { + //$scope.currentIndicatorLayer.resetStyle(layer); + if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { + style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + + layer.setStyle(style); + } + else { + style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); + layer.setStyle(style); + } + } + else { + style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + layer.setStyle(style); + } + } + else { + setPermanentlyHighlightedStyle(layer); + } + + //update diagrams for unhoveredFeature + $rootScope.$broadcast("updateDiagramsForUnhoveredFeature", layer.feature.properties); + } + + function resetHighlightClickedFeature(layer) { + var style; + //$scope.currentIndicatorLayer.resetStyle(layer); + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else if (!kommonitorDataExchangeService.isMeasureOfValueChecked) { + //$scope.currentIndicatorLayer.resetStyle(layer); + if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { + style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + + layer.setStyle(style); + } + else { + style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); + + layer.setStyle(style); + } + } + else { + style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + + layer.setStyle(style); + } + } + + function resetHighlightCustom(e) { + $scope.currentCustomIndicatorLayer.resetStyle(e.target); + if (!kommonitorFilterHelperService.featureIsCurrentlySelected(e.target.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + e.target.bringToBack(); + } + } + + var wait = ms => new Promise((r, j) => setTimeout(r, ms)) + + $scope.recenterMap = function () { + $scope.map.invalidateSize(true); + + fitBounds(); + + }; + + $scope.$on("recenterMapContent", function (event) { + $scope.recenterMap(); + }); + + $scope.$on("invalidateMapSize", function (event) { + $timeout(function(){ + $scope.map.invalidateSize(true); + }, 500); + }); + + $scope.$on("recenterMapOnHideSideBar", async function (event) { + //wait due to animation of the sidebar + + // make animation in 30 steps + // var waitForInMs = 30; + // for(var i=0; i<=300; i++){ + // + // i += waitForInMs; + // + // await wait(waitForInMs); + // + // $scope.map.invalidateSize(true); + // + // panToCenterOnInActiveMenue(500); + // // $scope.recenterMap(); + // } + + var waitForInMs = 100; + await wait(waitForInMs); + panToCenterOnInActiveMenue(500); + }); + + $scope.$on("recenterMapOnShowSideBar", async function (event) { + //wait due to animation of the sidebar + + // make animation in 30 steps + // var waitForInMs = 30; + // for(var i=0; i<=300; i++){ + // + // i += waitForInMs; + // + // await wait(waitForInMs); + // + // $scope.map.invalidateSize(true); + // + // panToCenterOnActiveMenue(500); + // // $scope.recenterMap(); + // } + + var waitForInMs = 100; + await wait(waitForInMs); + panToCenterOnActiveMenue(500); + + }); + + function panToCenterOnActiveMenue(numPixels) { + if ($scope.map) { + $scope.map.invalidateSize(true); + $scope.map.panBy(L.point(numPixels, 0)); + + $scope.map.invalidateSize(true); + } + }; + + function panToCenterOnInActiveMenue(numPixels) { + if ($scope.map) { + $scope.map.invalidateSize(true); + $scope.map.panBy(L.point(-numPixels, 0)); + + $scope.map.invalidateSize(true); + } + }; + + + function fitBounds() { + if ($scope.map && $scope.currentIndicatorLayer) { + + $scope.map.invalidateSize(true); + // $scope.map.setView(L.latLng($scope.latCenter, $scope.lonCenter), $scope.zoomLevel); + $scope.map.fitBounds($scope.currentIndicatorLayer.getBounds()); + } + + } + + function zoomToFeature(e) { + map.fitBounds(e.target.getBounds()); + } + + function markOutliers(indicatorMetadataAndGeoJSON, indicatorPropertyName) { + // identify possible data outliers + // mark them using a dedicated property + + $scope.outliers_high = []; + $scope.outliers_low = []; + + var valueArray = new Array(); + + indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { + if (!kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[indicatorPropertyName])) { + if (!valueArray.includes(feature.properties[indicatorPropertyName])) { + valueArray.push(feature.properties[indicatorPropertyName]); + } + } + }); + + // https://jstat.github.io/all.html#quartiles + var quartiles = jStat.quartiles(valueArray); + var quartile_25 = quartiles[0]; + var quartile_75 = quartiles[2]; + + var diff = quartile_75 - quartile_25; + var whiskerRange_outliers_soft = diff * 1.5; + var whiskerRange_outliers_extreme = diff * 3; + + var whisker_low_soft = quartile_25 - whiskerRange_outliers_soft; + var whisker_high_soft = quartile_75 + whiskerRange_outliers_soft; + + var whisker_low_extreme = quartile_25 - whiskerRange_outliers_extreme; + var whisker_high_extreme = quartile_75 + whiskerRange_outliers_extreme; + + // for now only mark extreme outliers! + + indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { + // compare feature value to whiskers and set property + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[indicatorPropertyName])) { + feature.properties[outlierPropertyName] = outlierPropertyValue_no; + } + else if (feature.properties[indicatorPropertyName] < whisker_low_extreme) { + feature.properties[outlierPropertyName] = outlierPropertyValue_low_extreme; + $scope.containsOutliers_low = true; + $scope.outliers_low.push(feature.properties[indicatorPropertyName]); + } + // else if (feature.properties[indicatorPropertyName] < whisker_low_soft){ + // feature.properties[outlierPropertyName] = outlierPropertyValue_low_soft; + // $scope.containsOutliers_low = true; + // $scope.outliers_low.push(feature.properties[indicatorPropertyName]); + // } + else if (feature.properties[indicatorPropertyName] > whisker_high_extreme) { + feature.properties[outlierPropertyName] = outlierPropertyValue_high_extreme; + $scope.containsOutliers_high = true; + $scope.outliers_high.push(feature.properties[indicatorPropertyName]); + } + // else if (feature.properties[indicatorPropertyName] > whisker_high_soft){ + // feature.properties[outlierPropertyName] = outlierPropertyValue_high_soft; + // $scope.containsOutliers_high = true; + // $scope.outliers_high.push(feature.properties[indicatorPropertyName]); + // } + else { + feature.properties[outlierPropertyName] = outlierPropertyValue_no; + } + }); + + // sort outliers arrays + $scope.outliers_high.sort(function (a, b) { + return a - b; + }); + $scope.outliers_low.sort(function (a, b) { + return a - b; + }); + + return indicatorMetadataAndGeoJSON; + } + + $scope.setNoDataValuesAsNull = function (indicatorMetadataAndGeoJSON) { + indicatorMetadataAndGeoJSON.geoJSON.features.forEach(function (feature) { + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[$scope.indicatorPropertyName])) { + feature.properties[$scope.indicatorPropertyName] = null; + } + }); + + return indicatorMetadataAndGeoJSON; + } + + $scope.$on("replaceIndicatorAsGeoJSON", function (event, indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation) { + + console.log('replaceIndicatorAsGeoJSON was called'); + + kommonitorVisualStyleHelperService.isCustomComputation = false; + if (isCustomComputation){ + kommonitorVisualStyleHelperService.isCustomComputation = true; + } + + //reset opacity + kommonitorVisualStyleHelperService.setOpacity(__env.defaultFillOpacity); + + refreshFilteredStyle(); + refreshOutliersStyle(); + refreshNoDataStyle(); + + $scope.defaultBrew = new classyBrew(); + $scope.gtMeasureOfValueBrew = new classyBrew(); + $scope.ltMeasureOfValueBrew = new classyBrew(); + + $scope.currentIndicatorMetadataAndGeoJSON = indicatorMetadataAndGeoJSON; + + if (!justRestyling) { + // empty layer of possibly selected features + // kommonitorFilterHelperService.clearSelectedFeatures(); + // kommonitorFilterHelperService.clearFilteredFeatures(); + + $rootScope.$broadcast("checkBalanceMenueAndButton"); + } + + console.log("Remove old indicatorLayer if exists"); + if ($scope.currentIndicatorLayer) { + $scope.layerControl.removeLayer($scope.currentIndicatorLayer); + $scope.map.removeLayer($scope.currentIndicatorLayer); + } + + $scope.currentIndicatorContainsZeroValues = false; + + $scope.date = date; + + $scope.indicatorPropertyName = INDICATOR_DATE_PREFIX + date; + $scope.indicatorName = indicatorMetadataAndGeoJSON.indicatorName; + $scope.indicatorDescription = indicatorMetadataAndGeoJSON.metadata.description; + $scope.indicatorUnit = indicatorMetadataAndGeoJSON.unit; + + $scope.currentIndicatorMetadataAndGeoJSON = $scope.setNoDataValuesAsNull($scope.currentIndicatorMetadataAndGeoJSON); + + // identify and mark outliers prior to setting up of styling + // in styling methods, outliers should be removed from classification! + $scope.currentIndicatorMetadataAndGeoJSON = markOutliers($scope.currentIndicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); + + kommonitorDataExchangeService.setAllFeaturesProperty(indicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); + kommonitorDataExchangeService.setSelectedFeatureProperty(kommonitorFilterHelperService.selectedIndicatorFeatureIds, $scope.indicatorPropertyName); + + $scope.currentGeoJSONOfCurrentLayer = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON; + + for (var i = 0; i < indicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { + var containsZero = false; + var containsNoData = false; + if (indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === 0 || indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === "0") { + $scope.currentIndicatorContainsZeroValues = true; + containsZero = true; + }; + + if (kommonitorDataExchangeService.indicatorValueIsNoData(indicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { + $scope.currentIndicatorContainsNoDataValues = true; + containsNoData = true; + }; + + if (containsZero && containsNoData) { + break; + } + } + + /* ///////////////////////////////// RASTER SPECIAL TREATMENT + // improve Raster display by eliminiating NoData cells and + // omitting display border in style + */ + + if(kommonitorDataExchangeService.selectedSpatialUnitIsRaster()){ + indicatorMetadataAndGeoJSON.geoJSON.features = indicatorMetadataAndGeoJSON.geoJSON.features.filter(feature => { + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[$scope.indicatorPropertyName])) { + return false; + } + return true; + }); + } + + var layer; + + $scope.indicatorTypeOfCurrentLayer = indicatorMetadataAndGeoJSON.indicatorType; + + if (kommonitorDataExchangeService.isMeasureOfValueChecked) { + var measureOfValueBrewArray = kommonitorVisualStyleHelperService.setupMeasureOfValueBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, defaultColorBrewerPaletteForGtMovValues, defaultColorBrewerPaletteForLtMovValues, kommonitorVisualStyleHelperService.classifyMethod, kommonitorDataExchangeService.measureOfValue); + $scope.gtMeasureOfValueBrew = measureOfValueBrewArray[0]; + $scope.ltMeasureOfValueBrew = measureOfValueBrewArray[1]; + + $scope.propertyName = INDICATOR_DATE_PREFIX + date; + + layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + return $scope.filteredStyle; + } + return kommonitorVisualStyleHelperService.styleMeasureOfValue(feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + }, + onEachFeature: onEachFeatureIndicator + }); + + // $scope.makeMeasureOfValueLegend(isCustomComputation); + + } + else { + + if (indicatorMetadataAndGeoJSON.indicatorType.includes("STATUS")) { + $scope.datasetContainsNegativeValues = $scope.containsNegativeValues(indicatorMetadataAndGeoJSON.geoJSON); + if ($scope.datasetContainsNegativeValues) { + var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); + $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; + $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + + } + else { + $scope.defaultBrew = kommonitorVisualStyleHelperService.setupDefaultBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, indicatorMetadataAndGeoJSON.defaultClassificationMapping.items.length, indicatorMetadataAndGeoJSON.defaultClassificationMapping.colorBrewerSchemeName, kommonitorVisualStyleHelperService.classifyMethod); + } + $scope.propertyName = INDICATOR_DATE_PREFIX + date; + + layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { + style: function (feature) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + return $scope.filteredStyle; + } + return kommonitorVisualStyleHelperService.styleDefault(feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); + }, + onEachFeature: onEachFeatureIndicator + }); + // $scope.makeDefaultLegend(indicatorMetadataAndGeoJSON.defaultClassificationMapping, $scope.datasetContainsNegativeValues, isCustomComputation); + } + else if (indicatorMetadataAndGeoJSON.indicatorType.includes("DYNAMIC")) { + var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew(indicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); + $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; + $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + + $scope.propertyName = INDICATOR_DATE_PREFIX + date; + + layer = L.geoJSON(indicatorMetadataAndGeoJSON.geoJSON, { + style: function(feature){ + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + return $scope.filteredStyle; + } + return kommonitorVisualStyleHelperService.styleDynamicIndicator(feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + }, + onEachFeature: onEachFeatureIndicator + }); + // $scope.makeDynamicIndicatorLegend(isCustomComputation); + } + + + } + + $scope.currentIndicatorLayer = layer; + + $rootScope.$broadcast("updateLegendDisplay", $scope.currentIndicatorContainsZeroValues, $scope.datasetContainsNegativeValues, $scope.currentIndicatorContainsNoDataValues, $scope.containsOutliers_high, $scope.containsOutliers_low, $scope.outliers_low, $scope.outliers_high, kommonitorDataExchangeService.selectedDate); + + // if(spatialUnitName.includes("raster") || spatialUnitName.includes("Raster") || spatialUnitName.includes("grid") || spatialUnitName.includes("Grid")){ + // layer.style.color = undefined; + // } + + + + // layer.StyledLayerControl = { + // removable : false, + // visible : true + // }; + + var layerName = indicatorMetadataAndGeoJSON.indicatorName + "_" + spatialUnitName + "_" + date; + + if (isCustomComputation) { + layerName += " - individuelles Berechnungsergebnis"; + } + $scope.layerControl.addOverlay(layer, layerName, indicatorLayerGroupName); + layer.addTo($scope.map); + $scope.updateSearchControl(); + + // var justRestyling = false; + + // fitBounds(); + + if ($scope.containsOutliers_low || $scope.containsOutliers_high) { + $scope.showOutlierInfoAlert = true; + } + + $rootScope.$broadcast("updateDiagrams", $scope.currentIndicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitId, date, $scope.defaultBrew, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, kommonitorDataExchangeService.isMeasureOfValueChecked, kommonitorDataExchangeService.measureOfValue, justRestyling); + $rootScope.$broadcast("indicatortMapDisplayFinished"); + + $scope.map.invalidateSize(true); + }); + + $scope.containsNegativeValues = function (geoJSON) { + + var containsNegativeValues = false; + $scope.datasetContainsNegativeValues = false; + for (var i = 0; i < geoJSON.features.length; i++) { + if (geoJSON.features[i].properties[$scope.indicatorPropertyName] < 0) { + containsNegativeValues = true; + break; + } + } + + return containsNegativeValues; + }; + + $scope.$on("restyleCurrentLayer", function (event, skipDiagramRefresh) { + + // var transparency = document.getElementById("indicatorTransparencyInput").value; + // var opacity = 1 - transparency; + // + // kommonitorVisualStyleHelperService.setOpacity(opacity); + + refreshFilteredStyle(); + refreshOutliersStyle(); + refreshNoDataStyle(); + + $scope.defaultBrew = new classyBrew(); + $scope.gtMeasureOfValueBrew = new classyBrew(); + $scope.ltMeasureOfValueBrew = new classyBrew(); + + var style; + if ($scope.currentIndicatorLayer) { + + $scope.currentIndicatorMetadataAndGeoJSON = markOutliers($scope.currentIndicatorMetadataAndGeoJSON, $scope.indicatorPropertyName); + $scope.currentGeoJSONOfCurrentLayer = $scope.currentIndicatorMetadataAndGeoJSON.geoJSON; + + $scope.currentIndicatorContainsZeroValues = false; + + for (var i = 0; i < $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features.length; i++) { + var containsZero = false; + var containsNoData = false; + if ($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === 0 || $scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName] === "0") { + $scope.currentIndicatorContainsZeroValues = true; + containsZero = true; + }; + + if (kommonitorDataExchangeService.indicatorValueIsNoData($scope.currentIndicatorMetadataAndGeoJSON.geoJSON.features[i].properties[$scope.indicatorPropertyName])) { + $scope.currentIndicatorContainsNoDataValues = true; + containsNoData = true; + }; + + if (containsZero && containsNoData) { + break; + } + } + + if (kommonitorDataExchangeService.isMeasureOfValueChecked) { + var measureOfValueBrewArray = kommonitorVisualStyleHelperService.setupMeasureOfValueBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, defaultColorBrewerPaletteForGtMovValues, defaultColorBrewerPaletteForLtMovValues, kommonitorVisualStyleHelperService.classifyMethod, kommonitorDataExchangeService.measureOfValue); + $scope.gtMeasureOfValueBrew = measureOfValueBrewArray[0]; + $scope.ltMeasureOfValueBrew = measureOfValueBrewArray[1]; + + $scope.currentIndicatorLayer.eachLayer(function (layer) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else { + style = kommonitorVisualStyleHelperService.styleMeasureOfValue(layer.feature, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + + layer.setStyle(style); + } + + }); + + // $scope.makeMeasureOfValueLegend(); + } + else { + + if ($scope.indicatorTypeOfCurrentLayer.includes('DYNAMIC')) { + var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew($scope.currentIndicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); + $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; + $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + + $scope.currentIndicatorLayer.eachLayer(function (layer) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else { + style = kommonitorVisualStyleHelperService.styleDynamicIndicator(layer.feature, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator); + + layer.setStyle(style); + } + + }); + // $scope.makeDynamicIndicatorLegend(); + } + else { + $scope.datasetContainsNegativeValues = $scope.containsNegativeValues($scope.currentGeoJSONOfCurrentLayer); + if ($scope.datasetContainsNegativeValues) { + var dynamicIndicatorBrewArray = kommonitorVisualStyleHelperService.setupDynamicIndicatorBrew($scope.currentIndicatorMetadataAndGeoJSON.geoJSON, $scope.indicatorPropertyName, defaultColorBrewerPaletteForBalanceIncreasingValues, defaultColorBrewerPaletteForBalanceDecreasingValues, kommonitorVisualStyleHelperService.classifyMethod); + $scope.dynamicIncreaseBrew = dynamicIndicatorBrewArray[0]; + $scope.dynamicDecreaseBrew = dynamicIndicatorBrewArray[1]; + } + else { + $scope.defaultBrew = kommonitorVisualStyleHelperService.setupDefaultBrew($scope.currentGeoJSONOfCurrentLayer, $scope.indicatorPropertyName, $scope.currentIndicatorMetadataAndGeoJSON.defaultClassificationMapping.items.length, $scope.currentIndicatorMetadataAndGeoJSON.defaultClassificationMapping.colorBrewerSchemeName, kommonitorVisualStyleHelperService.classifyMethod); + } + + $scope.currentIndicatorLayer.eachLayer(function (layer) { + if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(layer.feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + layer.setStyle($scope.filteredStyle); + } + else { + style = kommonitorVisualStyleHelperService.styleDefault(layer.feature, $scope.defaultBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, $scope.propertyName, $scope.useTransparencyOnIndicator, $scope.datasetContainsNegativeValues); + layer.setStyle(style); + } + }); + // $scope.makeDefaultLegend(kommonitorDataExchangeService.selectedIndicator.defaultClassificationMapping, $scope.datasetContainsNegativeValues); + } + + } + + $rootScope.$broadcast("updateLegendDisplay", $scope.currentIndicatorContainsZeroValues, $scope.datasetContainsNegativeValues, $scope.currentIndicatorContainsNoDataValues, $scope.containsOutliers_high, $scope.containsOutliers_low, $scope.outliers_low, $scope.outliers_high, kommonitorDataExchangeService.selectedDate); + + if (!skipDiagramRefresh) { + var justRestyling = true; + + $rootScope.$broadcast("updateDiagrams", $scope.currentIndicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitId, $scope.date, $scope.defaultBrew, $scope.gtMeasureOfValueBrew, $scope.ltMeasureOfValueBrew, $scope.dynamicIncreaseBrew, $scope.dynamicDecreaseBrew, kommonitorDataExchangeService.isMeasureOfValueChecked, kommonitorDataExchangeService.measureOfValue, justRestyling); + } + + //ensure that highlighted feature remain highlighted + preserveHighlightedFeatures(); + } + + $scope.map.invalidateSize(true); + + }); + + $scope.$on("highlightFeatureOnMap", function (event, spatialFeatureName) { + + // console.log("highlight feature on map for featureName " + spatialFeatureName); + + if(!spatialFeatureName){ + return; + } + var done = false; + + $scope.map.eachLayer(function (layer) { + if (!done && layer.feature) { + if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { + highlightFeatureForLayer(layer); + done = true; + } + } + + }); + + }); + + $scope.$on("unhighlightFeatureOnMap", function (event, spatialFeatureName) { + if(!spatialFeatureName){ + return; + } + + // console.log("unhighlight feature on map for featureName " + spatialFeatureName); + + var done = false; + + $scope.map.eachLayer(function (layer) { + if (!done && layer.feature) { + if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { + resetHighlightForLayer(layer); + done = true; + } + } + + }); + + }); + + $scope.$on("switchHighlightFeatureOnMap", function (event, spatialFeatureName) { + if(!spatialFeatureName){ + return; + } + + // console.log("switch highlight feature on map for featureName " + spatialFeatureName); + + var done = false; + + $scope.map.eachLayer(function (layer) { + if (!done && layer.feature) { + if (layer.feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialFeatureName) { + switchHighlightFeature(layer); + done = true; + } + } + + }); + + }); + + $scope.$on("unselectAllFeatures", function (event) { + + kommonitorFilterHelperService.clearSelectedFeatures(); + $rootScope.$broadcast("restyleCurrentLayer", false); + }); + + $scope.$on("removeAllDrawnPoints", function (event) { + + if ($scope.drawnPointFeatures) { + $scope.drawnPointFeatures.clearLayers(); + $rootScope.$broadcast("onUpdateDrawnPointFeatures"); + } + }); + + $scope.$on("enablePointDrawTool", function (event) { + + // FeatureGroup is to store editable layers + if (!$scope.drawnPointFeatures) { + $scope.drawnPointFeatures = new L.FeatureGroup(); + } + + L.drawLocal = { + edit: { + toolbar: { + actions: { + save: { + title: "Bearbeitung speichern.", + text: "Speichern", + }, + cancel: { + title: "Bearbeitung verwerfen.", + text: "Abbrechen", + }, + clearAll: { + title: "Alle Features entfernen.", + text: "Alle Features entfernen", + }, + }, + buttons: { + edit: "Layer editieren.", + editDisabled: "Keine Layer zum editieren vorhanden.", + remove: "Layer entfernen.", + removeDisabled: "Keine Layer zum entfernen vorhanden.", + }, + }, + handlers: { + edit: { + tooltip: { + text: "Bearbeitungspunkte oder Punktmarker ziehen, um Feature zu editieren.", + subtext: "Abbrechen klicken, um Bearbeitung zu verwefen.", + }, + }, + remove: { + tooltip: { + text: "Feature anklicken, um es zu entfernen", + }, + }, + } + }, + draw: { + toolbar: { + actions: { + title: "Zeichnen abbrechen", + text: "Abbrechen", + }, + finish: { + title: "Zeichnen beenden", + text: "Beenden", + }, + undo: { + title: "Zuletzt gezeichneten Punkt entfernen", + text: "Letzten Punkt entfernen", + }, + buttons: { + polyline: "Polylinie zeichnen", + polygon: "Polygon zeichnen", + rectangle: "Rechteck zeichnen", + circle: "Kreis zeichnen", + marker: "Punkt zeichnen", + circlemarker: "Kreispunkt zeichnen", + }, + }, + handlers: { + circle: { + tooltip: { + start: "Klicken und halten, um Kreis zu zeichnen.", + }, + radius: "Radius", + }, + circlemarker: { + tooltip: { + start: "Klicken, um einen Punkt zu markieren.", + }, + }, + marker: { + tooltip: { + start: "Klicken, um einen Punkt zu markieren.", + }, + }, + polygon: { + tooltip: { + start: "Klicken, um ein Polygon zu beginnen.", + cont: "Klicken, um das Polygon weiter zu zeichnen.", + end: "Ersten Punkt anklicken, um Polygon zu beenden.", + }, + }, + polyline: { + error: "Fehler: Selbstueberschneidung!", + tooltip: { + start: "Klicken, um eine Polylinie zu beginnen.", + cont: "Klicken, um die Polylinie weiter zu zeichnen.", + end: "Letzten Punkt erneut anklicken, um Polylinie zu beenden.", + }, + }, + rectangle: { + tooltip: { + start: "Klicken und halten, um Rechteck zu zeichnen.", + }, + }, + simpleshape: { + tooltip: { + end: "Maus loslassen, um Zeichnung zu beenden.", + }, + }, + } + } + + }; + + $scope.map.addLayer($scope.drawnPointFeatures); + $scope.drawPointControl = new L.Control.Draw({ + edit: { + featureGroup: $scope.drawnPointFeatures + }, + draw: { + polyline: false, + polygon: false, + rectangle: false, + circle: false, + circlemarker: false + }, + position: 'bottomleft' + + }); + + $scope.map.addControl($scope.drawPointControl); + + $scope.map.on(L.Draw.Event.CREATED, function (event) { + var layer = event.layer; + + $scope.drawnPointFeatures.addLayer(layer); + + $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); + }); + + $scope.map.on(L.Draw.Event.EDITED, function (event) { + + $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); + }); + + $scope.map.on(L.Draw.Event.DELETED, function (event) { + + $rootScope.$broadcast("onUpdateDrawnPointFeatures", $scope.drawnPointFeatures); + }); + + }); + + $scope.$on("disablePointDrawTool", function (event) { + + try { + $scope.drawPointControl = undefined; + $scope.map.removeLayer($scope.drawnPointFeatures); + $scope.map.removeControl($scope.drawPointControl); + } + catch (error) { + // kommonitorDataExchangeService.displayMapApplicationError(error); + } + + }); + + $scope.$on("zoomToGeoresourceLayer", async function (event, georesourceMetadata) { + + let layerName = georesourceMetadata.datasetName; + + let layerGroupName = undefined; + + if (georesourceMetadata.isPOI){ + layerGroupName = poiLayerGroupName; + } + else if(georesourceMetadata.isLOI){ + layerGroupName = loiLayerGroupName; + } + else if(georesourceMetadata.isAOI){ + layerGroupName = aoiLayerGroupName; + } + + $scope.layerControl._layers.forEach(function (layer) { + if (layerGroupName && layer.group.name === layerGroupName && layer.name.includes(layerName + "_")) { + $scope.map.fitBounds(layer.layer.getBounds()); + } + else if (layer.name.includes(layerName + "_")){ + $scope.map.fitBounds(layer.layer.getBounds()); + } + }); + }); + + } + ] + }); diff --git a/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.js b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.js index 82c908fc0..42d3964de 100644 --- a/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.js +++ b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.js @@ -1,533 +1,368 @@ +"use strict"; angular.module('kommonitorMap', ['kommonitorDataExchange', 'kommonitorVisualStyleHelper', 'kommonitorInfoLegendHelper', 'kommonitorFilterHelper']); /** * a common serviceInstance that holds all needed properties and methods for * interacting with a map (openlayers). */ -angular.module('kommonitorMap').service( - 'kommonitorMapService', - [ '$rootScope', '$http', function($rootScope, $http) { - - - // // central map object - // this.map; - // - // this.initializeMap = function() { - // - // // initialize map referring to div element with id="map" - // this.map = L.map('map').setView([51.4386432, 7.0115552], 12); - // - // // create OSM tile layer with correct attribution - // var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; - // var osmAttrib='Map data © OpenStreetMap contributors'; - // var osm = new L.TileLayer(osmUrl, {minZoom: 1, maxZoom: 19, attribution: osmAttrib}).addTo(this.map); - // - // } - - this.addSpatialUnitGeopackage = function () { - - $rootScope.$broadcast("addSpatialUnitAsGeopackage"); - }; - - - this.addSpatialUnitGeoJSON = function (spatialUnitMetadataAndGeoJSON, date) { - - $rootScope.$broadcast("addSpatialUnitAsGeoJSON", - spatialUnitMetadataAndGeoJSON, date); - }; - - this.addSpatialUnitWFS = function (name, wfsUrl) { - - $rootScope.$broadcast("addSpatialUnitAsWFS", - name, wfsUrl); - }; - - this.addGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { - - $rootScope.$broadcast("addGeoresourceAsGeoJSON", - georesourceMetadataAndGeoJSON, date); - }; - - this.addPoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date, useCluster) { - - $rootScope.$broadcast("addPoiGeoresourceAsGeoJSON", - georesourceMetadataAndGeoJSON, date, useCluster); - }; - - this.addPoiGeoresourceGeoJSON_reachabilityAnalysis = function (georesourceMetadataAndGeoJSON, date, useCluster) { - - $rootScope.$broadcast("addPoiGeoresourceAsGeoJSON_reachabilityAnalysis", - georesourceMetadataAndGeoJSON, date, useCluster); - }; - - this.addLoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { - - $rootScope.$broadcast("addLoiGeoresourceAsGeoJSON", - georesourceMetadataAndGeoJSON, date); - }; - - this.addAoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { - - $rootScope.$broadcast("addAoiGeoresourceAsGeoJSON", - georesourceMetadataAndGeoJSON, date); - }; - - this.replaceIsochroneGeoJSON = function (geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour) { - - $rootScope.$broadcast("replaceIsochronesAsGeoJSON", - geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour); - }; - - this.replaceRouteGeoJSON = function (geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, - routeDistance_km, routeDuration_minutes) { - - $rootScope.$broadcast("replaceRouteAsGeoJSON", geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, - routeDistance_km, routeDuration_minutes); - }; - - this.replaceIsochroneMarker = function (lonLatArray) { - - $rootScope.$broadcast("replaceIsochroneMarker", - lonLatArray); - }; - - this.removePoiGeoresource = function (georesourceMetadataAndGeoJSON) { - - $rootScope.$broadcast("removePoiGeoresource", - georesourceMetadataAndGeoJSON); - }; - - this.removePoiGeoresource_reachabilityAnalysis = function (georesourceMetadataAndGeoJSON) { - - $rootScope.$broadcast("removePoiGeoresource_reachabilityAnalysis", - georesourceMetadataAndGeoJSON); - }; - - this.removeLoiGeoresource = function (georesourceMetadataAndGeoJSON) { - - $rootScope.$broadcast("removeLoiGeoresource", - georesourceMetadataAndGeoJSON); - }; - - this.removeAoiGeoresource = function (georesourceMetadataAndGeoJSON) { - - $rootScope.$broadcast("removeAoiGeoresource", - georesourceMetadataAndGeoJSON); - }; - - this.removeReachabilityLayers = function(){ - $rootScope.$broadcast("removeReachabilityLayers"); - } - - this.removeRoutingLayers = function(){ - $rootScope.$broadcast("removeRoutingLayers"); - } - - this.addIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date) { - - $rootScope.$broadcast("addIndicatorAsGeoJSON", - indicatorMetadataAndGeoJSON, spatialUnitName, date); - }; - - this.replaceIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation) { - - $rootScope.$broadcast("replaceIndicatorAsGeoJSON", - indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation); - }; - - this.addCustomIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date) { - - $rootScope.$broadcast("addCustomIndicatorAsGeoJSON", - indicatorMetadataAndGeoJSON, spatialUnitName, date); - }; - - this.restyleCurrentLayer = function () { - - $rootScope.$broadcast("restyleCurrentLayer"); - }; - - this.addWmsLayerToMap = function (dataset, opacity) { - $rootScope.$broadcast("addWmsLayerToMap", - dataset); - }; - - this.adjustOpacityForWmsLayer = function (dataset, opacity) { - $rootScope.$broadcast("adjustOpacityForWmsLayer", - dataset, opacity); - }; - - this.adjustOpacityForAoiLayer = function (dataset, opacity) { - $rootScope.$broadcast("adjustOpacityForAoiLayer", - dataset, opacity); - }; - - this.adjustOpacityForPoiLayer = function (dataset, opacity) { - $rootScope.$broadcast("adjustOpacityForPoiLayer", - dataset, opacity); - }; - - this.adjustOpacityForLoiLayer = function (dataset, opacity) { - $rootScope.$broadcast("adjustOpacityForLoiLayer", - dataset, opacity); - }; - - this.removeWmsLayerFromMap = function (dataset) { - $rootScope.$broadcast("removeWmsLayerFromMap", - dataset); - }; - - this.addWfsLayerToMap = function (dataset, opacity, useCluster) { - $rootScope.$broadcast("addWfsLayerToMap", - dataset, opacity, useCluster); - }; - - this.adjustOpacityForWfsLayer = function (dataset, opacity) { - $rootScope.$broadcast("adjustOpacityForWfsLayer", - dataset, opacity); - }; - - this.adjustColorForWfsLayer = function (dataset, opacity) { - $rootScope.$broadcast("adjustColorForWfsLayer", - dataset, opacity); - }; - - this.removeWfsLayerFromMap = function (dataset) { - $rootScope.$broadcast("removeWfsLayerFromMap", - dataset); - }; - - this.addFileLayerToMap = function (dataset, opacity) { - $rootScope.$broadcast("addFileLayerToMap", - dataset); - }; - - this.adjustOpacityForFileLayer = function (dataset, opacity) { - $rootScope.$broadcast("adjustOpacityForFileLayer", - dataset, opacity); - }; - - this.adjustColorForFileLayer = function (dataset, color) { - $rootScope.$broadcast("adjustColorForFileLayer", - dataset, color); - }; - - this.removeFileLayerFromMap = function (dataset) { - $rootScope.$broadcast("removeFileLayerFromMap", - dataset); - }; - - - - this.addBaseDataLayer = function (selectedBaseData) { - - $rootScope.$broadcast("addBaseDataLayerAsWMS", - selectedBaseData); - - }; - - this.addIndicatorLayer = function (selectedIndicator) { - - $rootScope.$broadcast("addIndicatorLayerAsWMS", - selectedIndicator); - - }; - - this.addIndicatorLayer_withNameAndStyle = function(selectedIndicator, layerName, sldName){ - $rootScope.$broadcast("addIndicatorLayerAsWMS_withNameAndStyle", - { - 'selectedIndicator':selectedIndicator, - 'layerName':layerName, - 'sldName':sldName - }); - } - - - - this.visualizeGeometricOutputs = function(geometricOutputs){ - - for (var i=0; i < geometricOutputs.length; i++){ - - var currentNameForLayerProperty = this.generateUniqueOutputLayerPropertyName(); - - /* - * if output is a "reference" output, then we will not display - * it on the map --> hence continue! - */ - if(geometricOutputs[i].reference) - continue; - else - this.addGeometricOutputToMap(geometricOutputs[i], currentNameForLayerProperty); - } - }; - - this.generateUniqueOutputLayerPropertyName = function(){ - - /* - * basic name for layer property - * - * important if we add multiple layers as overlays, - * since each layer has to be defined as unique property - */ - var baseNameForLayerProperty = 'Output'; - var min = 1; - var max = 1000; - - var randomNameExtension = (Math.random() * (max - min)) + min; - - return baseNameForLayerProperty + '_' + randomNameExtension; - }; - - this.generateUniqueInputLayerPropertyName = function(inputIdentifier){ - - /* - * basic name for layer property - * - * important if we add multiple layers as overlays, - * since each layer has to be defined as unique property - */ - var baseNameForLayerProperty = 'Input_' + inputIdentifier; - - return baseNameForLayerProperty; - -// var min = 1; -// var max = 1000; -// -// var randomNameExtension = (Math.random() * (max - min)) + min; -// -// return baseNameForLayerProperty + '_' + randomNameExtension; - }; - - this.addGeometricOutputToMap = function(geometricOutput, currentNameForLayerProperty){ - /* - * output may be complex output or bbox output - */ - - if(geometricOutput.data.complexData) - this.addComplexOutputToMap(geometricOutput, currentNameForLayerProperty); - - else if(geometricOutput.data.boundingBoxData) - this.addBboxOutputToMap(geometricOutput, currentNameForLayerProperty); - - else - // should never reach this line; error - return null; - }; - - this.addComplexOutputToMap = function(complexOutput, currentNameForLayerProperty){ - /* - * format will be GeoJSON or a WMS. Hence we must inspect its format/mimeType. - */ - - var format = complexOutput.data.complexData.mimeType; - - if(format === 'application/WMS'){ - /* - * it is a WMS data! - */ - this.processAsWMS(complexOutput, currentNameForLayerProperty); - } - else{ - /* - * it is GeoJSON data! - */ - this.processAsGeoJSON(complexOutput, currentNameForLayerProperty); - } - }; - - this.processAsGeoJSON = function(complexOutput, currentNameForLayerProperty){ - var geoJSONValue = complexOutput.data.complexData.value; - - /* - * geoJSONValue can either be a String or directly a GeoJSON object! - * - * if it it a GeoJSON object, it should have a "type" property! - */ - var geoJSONFeature; - if(geoJSONValue.type){ - /* - * is already GeoJSON object! - */ - geoJSONFeature = geoJSONValue; - } - else{ - /* - * it is a String, so we parse it as JSON - */ - geoJSONFeature = JSON.parse(geoJSONValue); - } - - var outputIdentifier = complexOutput.identifier; - - /* - * calls the associated event/method from wps-map controller! - */ - $rootScope.$broadcast("addGeoJSONOutput", - { geoJSONFeature: geoJSONFeature, - layerPropertyName: currentNameForLayerProperty, - outputIdentifier: outputIdentifier}); - }; - - this.processAsWMS = function(complexOutput, currentNameForLayerProperty){ - - /* - * the WMS URL is currently included as follows: - * - * - */ - var wmsURL_complexDataValue = complexOutput.data.complexData.value; - - var wmsURL_withQueryParameters = extract_WMS_URL(wmsURL_complexDataValue); - - /* - * comma-separated String of layerNames listed in WMS Capabilities - * - * retrieved from query parameter within wmsURL: - * Example: "layers=N52:primary3416203586858505312.tif_b5f8f00c-903c-477d-876b-86bfe1fe8788" - */ - var layerNamesString = getUrlQueryParameterValueByName("layers", wmsURL_withQueryParameters); - console.log("layers query parameter: " + layerNamesString); - - var outputIdentifier = complexOutput.identifier; - - //remove all query parameters to obtain base WMS URL - var wmsBaseURL = wmsURL_withQueryParameters.split("?")[0]; - //re-append "?" as required by Leaflet - wmsBaseURL = wmsBaseURL + "?"; - - /* - * TODO retrieve Capabilities of WMS and get layer names - * - * TODO maybe there is a JS library that can help us here! - * - * TODO simply use all layers??? - * - * TODO or similar to reference outputs: Change result forms to show available - * WMS Layers and let user choose the layer he/she intends to visualize! - */ - - /* - * calls the associated event/method from wps-map controller! - */ - $rootScope.$broadcast("addWMSOutput", - { wmsURL: wmsBaseURL, - layerNamesString: layerNamesString, - layerPropertyName: currentNameForLayerProperty, - outputIdentifier: outputIdentifier}); - }; - - var extract_WMS_URL = function(wmsURL_complexDataValue){ - - /* - * WMS URL value might look like this: - * "" - * - * Hence we must remove the leading "![CDATA[" and trailing "]]" - */ - - var leadingCdataString = ""; - - console.log(wmsURL_complexDataValue); - - if (wmsURL_complexDataValue.startsWith(leadingCdataString)){ - /* - * remove leading and trailing sections - */ - var wmsTargetURL = wmsURL_complexDataValue.replace(leadingCdataString, ""); - - wmsTargetURL = wmsTargetURL.replace(trailingBracketsString, ""); - - console.log(wmsTargetURL); - - return wmsTargetURL; - } - else if (wmsURL_complexDataValue.startsWith("http")){ - /* - * seems to be the target URL already, no extraction needed - */ - return wmsURL_complexDataValue; - } - else{ - /* - * TODO can this line be reached? Then, how to handle correctly? - */ - return wmsURL_complexDataValue; - } - - }; - - function getUrlQueryParameterValueByName(parameterName, url) { - - parameterName = parameterName.replace(/[\[\]]/g, "\\$&"); - var regex = new RegExp("[?&]" + parameterName + "(=([^&#]*)|&|#|$)"), - resultsArray = regex.exec(url); - if (!resultsArray) - return null; - if (!resultsArray[2]) - return ''; - - return decodeURIComponent(resultsArray[2].replace(/\+/g, " ")); - } - - this.addBboxOutputToMap = function(bboxOutput, currentNameForLayerProperty){ - - /* - * TODO check CRS --> GeoJSON requires WGS84 - * project if necessary! - */ - - var outputIdentifier = bboxOutput.identifier; - - var description = bboxOutput.abstractValue || bboxOutput.title; - - var crs = bboxOutput.data.boundingBoxData.crs; - - /* - * TODO check CRS --> WGS84 should be used for GeoJSON - */ - - var lowerCorner = bboxOutput.data.boundingBoxData.lowerCorner; - var upperCorner = bboxOutput.data.boundingBoxData.upperCorner; - - var coordinatesArray = this.createCoordinatesArrayFromBbox(lowerCorner, upperCorner); - - var geoJSONFeature = { - "type": "Feature", - "properties": {"popupContent": description}, - "geometry": { - "type": "Polygon", - "coordinates": coordinatesArray - } - }; - - /* - * calls the associated event/method from wps-map controller! - */ - $rootScope.$broadcast("addGeoJSONOutput", - { geoJSONFeature: geoJSONFeature, - layerPropertyName: currentNameForLayerProperty, - outputIdentifier: outputIdentifier}); - }; - - /** - * Creates a Coordinates Array for GeoJSON feature representing the - * Bounding Box - */ - this.createCoordinatesArrayFromBbox = function(lowerCorner, upperCorner){ - - var lat_lowerLeft = parseFloat(lowerCorner.split(" ")[0]); - var lat_upperRight = parseFloat(upperCorner.split(" ")[0]); - var lon_lowerLeft = parseFloat(lowerCorner.split(" ")[1]); - var lon_upperRight = parseFloat(upperCorner.split(" ")[1]); - - var coordinatesArray = [[ - [lon_lowerLeft, lat_lowerLeft], - [lon_lowerLeft, lat_upperRight], - [lon_upperRight, lat_upperRight], - [lon_upperRight, lat_lowerLeft], - [lon_lowerLeft, lat_lowerLeft] - ]]; - - return coordinatesArray; - }; - - }]); +angular.module('kommonitorMap').service('kommonitorMapService', ['$rootScope', '$http', function ($rootScope, $http) { + // // central map object + // this.map; + // + // this.initializeMap = function() { + // + // // initialize map referring to div element with id="map" + // this.map = L.map('map').setView([51.4386432, 7.0115552], 12); + // + // // create OSM tile layer with correct attribution + // var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; + // var osmAttrib='Map data © OpenStreetMap contributors'; + // var osm = new L.TileLayer(osmUrl, {minZoom: 1, maxZoom: 19, attribution: osmAttrib}).addTo(this.map); + // + // } + this.addSpatialUnitGeopackage = function () { + $rootScope.$broadcast("addSpatialUnitAsGeopackage"); + }; + this.addSpatialUnitGeoJSON = function (spatialUnitMetadataAndGeoJSON, date) { + $rootScope.$broadcast("addSpatialUnitAsGeoJSON", spatialUnitMetadataAndGeoJSON, date); + }; + this.addSpatialUnitWFS = function (name, wfsUrl) { + $rootScope.$broadcast("addSpatialUnitAsWFS", name, wfsUrl); + }; + this.addGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { + $rootScope.$broadcast("addGeoresourceAsGeoJSON", georesourceMetadataAndGeoJSON, date); + }; + this.addPoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date, useCluster) { + $rootScope.$broadcast("addPoiGeoresourceAsGeoJSON", georesourceMetadataAndGeoJSON, date, useCluster); + }; + this.addPoiGeoresourceGeoJSON_reachabilityAnalysis = function (georesourceMetadataAndGeoJSON, date, useCluster) { + $rootScope.$broadcast("addPoiGeoresourceAsGeoJSON_reachabilityAnalysis", georesourceMetadataAndGeoJSON, date, useCluster); + }; + this.addLoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { + $rootScope.$broadcast("addLoiGeoresourceAsGeoJSON", georesourceMetadataAndGeoJSON, date); + }; + this.addAoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { + $rootScope.$broadcast("addAoiGeoresourceAsGeoJSON", georesourceMetadataAndGeoJSON, date); + }; + this.replaceIsochroneGeoJSON = function (geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour) { + $rootScope.$broadcast("replaceIsochronesAsGeoJSON", geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour); + }; + this.replaceRouteGeoJSON = function (geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, routeDistance_km, routeDuration_minutes) { + $rootScope.$broadcast("replaceRouteAsGeoJSON", geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, routeDistance_km, routeDuration_minutes); + }; + this.replaceIsochroneMarker = function (lonLatArray) { + $rootScope.$broadcast("replaceIsochroneMarker", lonLatArray); + }; + this.removePoiGeoresource = function (georesourceMetadataAndGeoJSON) { + $rootScope.$broadcast("removePoiGeoresource", georesourceMetadataAndGeoJSON); + }; + this.removePoiGeoresource_reachabilityAnalysis = function (georesourceMetadataAndGeoJSON) { + $rootScope.$broadcast("removePoiGeoresource_reachabilityAnalysis", georesourceMetadataAndGeoJSON); + }; + this.removeLoiGeoresource = function (georesourceMetadataAndGeoJSON) { + $rootScope.$broadcast("removeLoiGeoresource", georesourceMetadataAndGeoJSON); + }; + this.removeAoiGeoresource = function (georesourceMetadataAndGeoJSON) { + $rootScope.$broadcast("removeAoiGeoresource", georesourceMetadataAndGeoJSON); + }; + this.removeReachabilityLayers = function () { + $rootScope.$broadcast("removeReachabilityLayers"); + }; + this.removeRoutingLayers = function () { + $rootScope.$broadcast("removeRoutingLayers"); + }; + this.addIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date) { + $rootScope.$broadcast("addIndicatorAsGeoJSON", indicatorMetadataAndGeoJSON, spatialUnitName, date); + }; + this.replaceIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation) { + $rootScope.$broadcast("replaceIndicatorAsGeoJSON", indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation); + }; + this.addCustomIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date) { + $rootScope.$broadcast("addCustomIndicatorAsGeoJSON", indicatorMetadataAndGeoJSON, spatialUnitName, date); + }; + this.restyleCurrentLayer = function () { + $rootScope.$broadcast("restyleCurrentLayer"); + }; + this.addWmsLayerToMap = function (dataset, opacity) { + $rootScope.$broadcast("addWmsLayerToMap", dataset); + }; + this.adjustOpacityForWmsLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForWmsLayer", dataset, opacity); + }; + this.adjustOpacityForAoiLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForAoiLayer", dataset, opacity); + }; + this.adjustOpacityForPoiLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForPoiLayer", dataset, opacity); + }; + this.adjustOpacityForLoiLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForLoiLayer", dataset, opacity); + }; + this.removeWmsLayerFromMap = function (dataset) { + $rootScope.$broadcast("removeWmsLayerFromMap", dataset); + }; + this.addWfsLayerToMap = function (dataset, opacity, useCluster) { + $rootScope.$broadcast("addWfsLayerToMap", dataset, opacity, useCluster); + }; + this.adjustOpacityForWfsLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForWfsLayer", dataset, opacity); + }; + this.adjustColorForWfsLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustColorForWfsLayer", dataset, opacity); + }; + this.removeWfsLayerFromMap = function (dataset) { + $rootScope.$broadcast("removeWfsLayerFromMap", dataset); + }; + this.addFileLayerToMap = function (dataset, opacity) { + $rootScope.$broadcast("addFileLayerToMap", dataset); + }; + this.adjustOpacityForFileLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForFileLayer", dataset, opacity); + }; + this.adjustColorForFileLayer = function (dataset, color) { + $rootScope.$broadcast("adjustColorForFileLayer", dataset, color); + }; + this.removeFileLayerFromMap = function (dataset) { + $rootScope.$broadcast("removeFileLayerFromMap", dataset); + }; + this.addBaseDataLayer = function (selectedBaseData) { + $rootScope.$broadcast("addBaseDataLayerAsWMS", selectedBaseData); + }; + this.addIndicatorLayer = function (selectedIndicator) { + $rootScope.$broadcast("addIndicatorLayerAsWMS", selectedIndicator); + }; + this.addIndicatorLayer_withNameAndStyle = function (selectedIndicator, layerName, sldName) { + $rootScope.$broadcast("addIndicatorLayerAsWMS_withNameAndStyle", { + 'selectedIndicator': selectedIndicator, + 'layerName': layerName, + 'sldName': sldName + }); + }; + this.visualizeGeometricOutputs = function (geometricOutputs) { + for (var i = 0; i < geometricOutputs.length; i++) { + var currentNameForLayerProperty = this.generateUniqueOutputLayerPropertyName(); + /* + * if output is a "reference" output, then we will not display + * it on the map --> hence continue! + */ + if (geometricOutputs[i].reference) + continue; + else + this.addGeometricOutputToMap(geometricOutputs[i], currentNameForLayerProperty); + } + }; + this.generateUniqueOutputLayerPropertyName = function () { + /* + * basic name for layer property + * + * important if we add multiple layers as overlays, + * since each layer has to be defined as unique property + */ + var baseNameForLayerProperty = 'Output'; + var min = 1; + var max = 1000; + var randomNameExtension = (Math.random() * (max - min)) + min; + return baseNameForLayerProperty + '_' + randomNameExtension; + }; + this.generateUniqueInputLayerPropertyName = function (inputIdentifier) { + /* + * basic name for layer property + * + * important if we add multiple layers as overlays, + * since each layer has to be defined as unique property + */ + var baseNameForLayerProperty = 'Input_' + inputIdentifier; + return baseNameForLayerProperty; + // var min = 1; + // var max = 1000; + // + // var randomNameExtension = (Math.random() * (max - min)) + min; + // + // return baseNameForLayerProperty + '_' + randomNameExtension; + }; + this.addGeometricOutputToMap = function (geometricOutput, currentNameForLayerProperty) { + /* + * output may be complex output or bbox output + */ + if (geometricOutput.data.complexData) + this.addComplexOutputToMap(geometricOutput, currentNameForLayerProperty); + else if (geometricOutput.data.boundingBoxData) + this.addBboxOutputToMap(geometricOutput, currentNameForLayerProperty); + else + // should never reach this line; error + return null; + }; + this.addComplexOutputToMap = function (complexOutput, currentNameForLayerProperty) { + /* + * format will be GeoJSON or a WMS. Hence we must inspect its format/mimeType. + */ + var format = complexOutput.data.complexData.mimeType; + if (format === 'application/WMS') { + /* + * it is a WMS data! + */ + this.processAsWMS(complexOutput, currentNameForLayerProperty); + } + else { + /* + * it is GeoJSON data! + */ + this.processAsGeoJSON(complexOutput, currentNameForLayerProperty); + } + }; + this.processAsGeoJSON = function (complexOutput, currentNameForLayerProperty) { + var geoJSONValue = complexOutput.data.complexData.value; + /* + * geoJSONValue can either be a String or directly a GeoJSON object! + * + * if it it a GeoJSON object, it should have a "type" property! + */ + var geoJSONFeature; + if (geoJSONValue.type) { + /* + * is already GeoJSON object! + */ + geoJSONFeature = geoJSONValue; + } + else { + /* + * it is a String, so we parse it as JSON + */ + geoJSONFeature = JSON.parse(geoJSONValue); + } + var outputIdentifier = complexOutput.identifier; + /* + * calls the associated event/method from wps-map controller! + */ + $rootScope.$broadcast("addGeoJSONOutput", { geoJSONFeature: geoJSONFeature, + layerPropertyName: currentNameForLayerProperty, + outputIdentifier: outputIdentifier }); + }; + this.processAsWMS = function (complexOutput, currentNameForLayerProperty) { + /* + * the WMS URL is currently included as follows: + * + * + */ + var wmsURL_complexDataValue = complexOutput.data.complexData.value; + var wmsURL_withQueryParameters = extract_WMS_URL(wmsURL_complexDataValue); + /* + * comma-separated String of layerNames listed in WMS Capabilities + * + * retrieved from query parameter within wmsURL: + * Example: "layers=N52:primary3416203586858505312.tif_b5f8f00c-903c-477d-876b-86bfe1fe8788" + */ + var layerNamesString = getUrlQueryParameterValueByName("layers", wmsURL_withQueryParameters); + console.log("layers query parameter: " + layerNamesString); + var outputIdentifier = complexOutput.identifier; + //remove all query parameters to obtain base WMS URL + var wmsBaseURL = wmsURL_withQueryParameters.split("?")[0]; + //re-append "?" as required by Leaflet + wmsBaseURL = wmsBaseURL + "?"; + /* + * TODO retrieve Capabilities of WMS and get layer names + * + * TODO maybe there is a JS library that can help us here! + * + * TODO simply use all layers??? + * + * TODO or similar to reference outputs: Change result forms to show available + * WMS Layers and let user choose the layer he/she intends to visualize! + */ + /* + * calls the associated event/method from wps-map controller! + */ + $rootScope.$broadcast("addWMSOutput", { wmsURL: wmsBaseURL, + layerNamesString: layerNamesString, + layerPropertyName: currentNameForLayerProperty, + outputIdentifier: outputIdentifier }); + }; + var extract_WMS_URL = function (wmsURL_complexDataValue) { + /* + * WMS URL value might look like this: + * "" + * + * Hence we must remove the leading "![CDATA[" and trailing "]]" + */ + var leadingCdataString = ""; + console.log(wmsURL_complexDataValue); + if (wmsURL_complexDataValue.startsWith(leadingCdataString)) { + /* + * remove leading and trailing sections + */ + var wmsTargetURL = wmsURL_complexDataValue.replace(leadingCdataString, ""); + wmsTargetURL = wmsTargetURL.replace(trailingBracketsString, ""); + console.log(wmsTargetURL); + return wmsTargetURL; + } + else if (wmsURL_complexDataValue.startsWith("http")) { + /* + * seems to be the target URL already, no extraction needed + */ + return wmsURL_complexDataValue; + } + else { + /* + * TODO can this line be reached? Then, how to handle correctly? + */ + return wmsURL_complexDataValue; + } + }; + function getUrlQueryParameterValueByName(parameterName, url) { + parameterName = parameterName.replace(/[\[\]]/g, "\\$&"); + var regex = new RegExp("[?&]" + parameterName + "(=([^&#]*)|&|#|$)"), resultsArray = regex.exec(url); + if (!resultsArray) + return null; + if (!resultsArray[2]) + return ''; + return decodeURIComponent(resultsArray[2].replace(/\+/g, " ")); + } + this.addBboxOutputToMap = function (bboxOutput, currentNameForLayerProperty) { + /* + * TODO check CRS --> GeoJSON requires WGS84 + * project if necessary! + */ + var outputIdentifier = bboxOutput.identifier; + var description = bboxOutput.abstractValue || bboxOutput.title; + var crs = bboxOutput.data.boundingBoxData.crs; + /* + * TODO check CRS --> WGS84 should be used for GeoJSON + */ + var lowerCorner = bboxOutput.data.boundingBoxData.lowerCorner; + var upperCorner = bboxOutput.data.boundingBoxData.upperCorner; + var coordinatesArray = this.createCoordinatesArrayFromBbox(lowerCorner, upperCorner); + var geoJSONFeature = { + "type": "Feature", + "properties": { "popupContent": description }, + "geometry": { + "type": "Polygon", + "coordinates": coordinatesArray + } + }; + /* + * calls the associated event/method from wps-map controller! + */ + $rootScope.$broadcast("addGeoJSONOutput", { geoJSONFeature: geoJSONFeature, + layerPropertyName: currentNameForLayerProperty, + outputIdentifier: outputIdentifier }); + }; + /** + * Creates a Coordinates Array for GeoJSON feature representing the + * Bounding Box + */ + this.createCoordinatesArrayFromBbox = function (lowerCorner, upperCorner) { + var lat_lowerLeft = parseFloat(lowerCorner.split(" ")[0]); + var lat_upperRight = parseFloat(upperCorner.split(" ")[0]); + var lon_lowerLeft = parseFloat(lowerCorner.split(" ")[1]); + var lon_upperRight = parseFloat(upperCorner.split(" ")[1]); + var coordinatesArray = [[ + [lon_lowerLeft, lat_lowerLeft], + [lon_lowerLeft, lat_upperRight], + [lon_upperRight, lat_upperRight], + [lon_upperRight, lat_lowerLeft], + [lon_lowerLeft, lat_lowerLeft] + ]]; + return coordinatesArray; + }; + }]); +//# sourceMappingURL=kommonitor-map.module.js.map \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.js.map b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.js.map new file mode 100644 index 000000000..e9e99d5bc --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-map.module.js","sourceRoot":"","sources":["kommonitor-map.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.ts b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.ts new file mode 100644 index 000000000..82c908fc0 --- /dev/null +++ b/app/components/kommonitorUserInterface/kommonitorMap/kommonitor-map.module.ts @@ -0,0 +1,533 @@ +angular.module('kommonitorMap', ['kommonitorDataExchange', 'kommonitorVisualStyleHelper', 'kommonitorInfoLegendHelper', 'kommonitorFilterHelper']); +/** + * a common serviceInstance that holds all needed properties and methods for + * interacting with a map (openlayers). + */ +angular.module('kommonitorMap').service( + 'kommonitorMapService', + [ '$rootScope', '$http', function($rootScope, $http) { + + + // // central map object + // this.map; + // + // this.initializeMap = function() { + // + // // initialize map referring to div element with id="map" + // this.map = L.map('map').setView([51.4386432, 7.0115552], 12); + // + // // create OSM tile layer with correct attribution + // var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; + // var osmAttrib='Map data © OpenStreetMap contributors'; + // var osm = new L.TileLayer(osmUrl, {minZoom: 1, maxZoom: 19, attribution: osmAttrib}).addTo(this.map); + // + // } + + this.addSpatialUnitGeopackage = function () { + + $rootScope.$broadcast("addSpatialUnitAsGeopackage"); + }; + + + this.addSpatialUnitGeoJSON = function (spatialUnitMetadataAndGeoJSON, date) { + + $rootScope.$broadcast("addSpatialUnitAsGeoJSON", + spatialUnitMetadataAndGeoJSON, date); + }; + + this.addSpatialUnitWFS = function (name, wfsUrl) { + + $rootScope.$broadcast("addSpatialUnitAsWFS", + name, wfsUrl); + }; + + this.addGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { + + $rootScope.$broadcast("addGeoresourceAsGeoJSON", + georesourceMetadataAndGeoJSON, date); + }; + + this.addPoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date, useCluster) { + + $rootScope.$broadcast("addPoiGeoresourceAsGeoJSON", + georesourceMetadataAndGeoJSON, date, useCluster); + }; + + this.addPoiGeoresourceGeoJSON_reachabilityAnalysis = function (georesourceMetadataAndGeoJSON, date, useCluster) { + + $rootScope.$broadcast("addPoiGeoresourceAsGeoJSON_reachabilityAnalysis", + georesourceMetadataAndGeoJSON, date, useCluster); + }; + + this.addLoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { + + $rootScope.$broadcast("addLoiGeoresourceAsGeoJSON", + georesourceMetadataAndGeoJSON, date); + }; + + this.addAoiGeoresourceGeoJSON = function (georesourceMetadataAndGeoJSON, date) { + + $rootScope.$broadcast("addAoiGeoresourceAsGeoJSON", + georesourceMetadataAndGeoJSON, date); + }; + + this.replaceIsochroneGeoJSON = function (geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour) { + + $rootScope.$broadcast("replaceIsochronesAsGeoJSON", + geoJSON, transitMode, reachMode, cutOffValues, useMultipleStartPoints, dissolveIsochrones, speedInKilometersPerHour); + }; + + this.replaceRouteGeoJSON = function (geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, + routeDistance_km, routeDuration_minutes) { + + $rootScope.$broadcast("replaceRouteAsGeoJSON", geoJSON, transitMode, preference, routingStartPoint, routingEndPoint, + routeDistance_km, routeDuration_minutes); + }; + + this.replaceIsochroneMarker = function (lonLatArray) { + + $rootScope.$broadcast("replaceIsochroneMarker", + lonLatArray); + }; + + this.removePoiGeoresource = function (georesourceMetadataAndGeoJSON) { + + $rootScope.$broadcast("removePoiGeoresource", + georesourceMetadataAndGeoJSON); + }; + + this.removePoiGeoresource_reachabilityAnalysis = function (georesourceMetadataAndGeoJSON) { + + $rootScope.$broadcast("removePoiGeoresource_reachabilityAnalysis", + georesourceMetadataAndGeoJSON); + }; + + this.removeLoiGeoresource = function (georesourceMetadataAndGeoJSON) { + + $rootScope.$broadcast("removeLoiGeoresource", + georesourceMetadataAndGeoJSON); + }; + + this.removeAoiGeoresource = function (georesourceMetadataAndGeoJSON) { + + $rootScope.$broadcast("removeAoiGeoresource", + georesourceMetadataAndGeoJSON); + }; + + this.removeReachabilityLayers = function(){ + $rootScope.$broadcast("removeReachabilityLayers"); + } + + this.removeRoutingLayers = function(){ + $rootScope.$broadcast("removeRoutingLayers"); + } + + this.addIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date) { + + $rootScope.$broadcast("addIndicatorAsGeoJSON", + indicatorMetadataAndGeoJSON, spatialUnitName, date); + }; + + this.replaceIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation) { + + $rootScope.$broadcast("replaceIndicatorAsGeoJSON", + indicatorMetadataAndGeoJSON, spatialUnitName, date, justRestyling, isCustomComputation); + }; + + this.addCustomIndicatorGeoJSON = function (indicatorMetadataAndGeoJSON, spatialUnitName, date) { + + $rootScope.$broadcast("addCustomIndicatorAsGeoJSON", + indicatorMetadataAndGeoJSON, spatialUnitName, date); + }; + + this.restyleCurrentLayer = function () { + + $rootScope.$broadcast("restyleCurrentLayer"); + }; + + this.addWmsLayerToMap = function (dataset, opacity) { + $rootScope.$broadcast("addWmsLayerToMap", + dataset); + }; + + this.adjustOpacityForWmsLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForWmsLayer", + dataset, opacity); + }; + + this.adjustOpacityForAoiLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForAoiLayer", + dataset, opacity); + }; + + this.adjustOpacityForPoiLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForPoiLayer", + dataset, opacity); + }; + + this.adjustOpacityForLoiLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForLoiLayer", + dataset, opacity); + }; + + this.removeWmsLayerFromMap = function (dataset) { + $rootScope.$broadcast("removeWmsLayerFromMap", + dataset); + }; + + this.addWfsLayerToMap = function (dataset, opacity, useCluster) { + $rootScope.$broadcast("addWfsLayerToMap", + dataset, opacity, useCluster); + }; + + this.adjustOpacityForWfsLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForWfsLayer", + dataset, opacity); + }; + + this.adjustColorForWfsLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustColorForWfsLayer", + dataset, opacity); + }; + + this.removeWfsLayerFromMap = function (dataset) { + $rootScope.$broadcast("removeWfsLayerFromMap", + dataset); + }; + + this.addFileLayerToMap = function (dataset, opacity) { + $rootScope.$broadcast("addFileLayerToMap", + dataset); + }; + + this.adjustOpacityForFileLayer = function (dataset, opacity) { + $rootScope.$broadcast("adjustOpacityForFileLayer", + dataset, opacity); + }; + + this.adjustColorForFileLayer = function (dataset, color) { + $rootScope.$broadcast("adjustColorForFileLayer", + dataset, color); + }; + + this.removeFileLayerFromMap = function (dataset) { + $rootScope.$broadcast("removeFileLayerFromMap", + dataset); + }; + + + + this.addBaseDataLayer = function (selectedBaseData) { + + $rootScope.$broadcast("addBaseDataLayerAsWMS", + selectedBaseData); + + }; + + this.addIndicatorLayer = function (selectedIndicator) { + + $rootScope.$broadcast("addIndicatorLayerAsWMS", + selectedIndicator); + + }; + + this.addIndicatorLayer_withNameAndStyle = function(selectedIndicator, layerName, sldName){ + $rootScope.$broadcast("addIndicatorLayerAsWMS_withNameAndStyle", + { + 'selectedIndicator':selectedIndicator, + 'layerName':layerName, + 'sldName':sldName + }); + } + + + + this.visualizeGeometricOutputs = function(geometricOutputs){ + + for (var i=0; i < geometricOutputs.length; i++){ + + var currentNameForLayerProperty = this.generateUniqueOutputLayerPropertyName(); + + /* + * if output is a "reference" output, then we will not display + * it on the map --> hence continue! + */ + if(geometricOutputs[i].reference) + continue; + else + this.addGeometricOutputToMap(geometricOutputs[i], currentNameForLayerProperty); + } + }; + + this.generateUniqueOutputLayerPropertyName = function(){ + + /* + * basic name for layer property + * + * important if we add multiple layers as overlays, + * since each layer has to be defined as unique property + */ + var baseNameForLayerProperty = 'Output'; + var min = 1; + var max = 1000; + + var randomNameExtension = (Math.random() * (max - min)) + min; + + return baseNameForLayerProperty + '_' + randomNameExtension; + }; + + this.generateUniqueInputLayerPropertyName = function(inputIdentifier){ + + /* + * basic name for layer property + * + * important if we add multiple layers as overlays, + * since each layer has to be defined as unique property + */ + var baseNameForLayerProperty = 'Input_' + inputIdentifier; + + return baseNameForLayerProperty; + +// var min = 1; +// var max = 1000; +// +// var randomNameExtension = (Math.random() * (max - min)) + min; +// +// return baseNameForLayerProperty + '_' + randomNameExtension; + }; + + this.addGeometricOutputToMap = function(geometricOutput, currentNameForLayerProperty){ + /* + * output may be complex output or bbox output + */ + + if(geometricOutput.data.complexData) + this.addComplexOutputToMap(geometricOutput, currentNameForLayerProperty); + + else if(geometricOutput.data.boundingBoxData) + this.addBboxOutputToMap(geometricOutput, currentNameForLayerProperty); + + else + // should never reach this line; error + return null; + }; + + this.addComplexOutputToMap = function(complexOutput, currentNameForLayerProperty){ + /* + * format will be GeoJSON or a WMS. Hence we must inspect its format/mimeType. + */ + + var format = complexOutput.data.complexData.mimeType; + + if(format === 'application/WMS'){ + /* + * it is a WMS data! + */ + this.processAsWMS(complexOutput, currentNameForLayerProperty); + } + else{ + /* + * it is GeoJSON data! + */ + this.processAsGeoJSON(complexOutput, currentNameForLayerProperty); + } + }; + + this.processAsGeoJSON = function(complexOutput, currentNameForLayerProperty){ + var geoJSONValue = complexOutput.data.complexData.value; + + /* + * geoJSONValue can either be a String or directly a GeoJSON object! + * + * if it it a GeoJSON object, it should have a "type" property! + */ + var geoJSONFeature; + if(geoJSONValue.type){ + /* + * is already GeoJSON object! + */ + geoJSONFeature = geoJSONValue; + } + else{ + /* + * it is a String, so we parse it as JSON + */ + geoJSONFeature = JSON.parse(geoJSONValue); + } + + var outputIdentifier = complexOutput.identifier; + + /* + * calls the associated event/method from wps-map controller! + */ + $rootScope.$broadcast("addGeoJSONOutput", + { geoJSONFeature: geoJSONFeature, + layerPropertyName: currentNameForLayerProperty, + outputIdentifier: outputIdentifier}); + }; + + this.processAsWMS = function(complexOutput, currentNameForLayerProperty){ + + /* + * the WMS URL is currently included as follows: + * + * + */ + var wmsURL_complexDataValue = complexOutput.data.complexData.value; + + var wmsURL_withQueryParameters = extract_WMS_URL(wmsURL_complexDataValue); + + /* + * comma-separated String of layerNames listed in WMS Capabilities + * + * retrieved from query parameter within wmsURL: + * Example: "layers=N52:primary3416203586858505312.tif_b5f8f00c-903c-477d-876b-86bfe1fe8788" + */ + var layerNamesString = getUrlQueryParameterValueByName("layers", wmsURL_withQueryParameters); + console.log("layers query parameter: " + layerNamesString); + + var outputIdentifier = complexOutput.identifier; + + //remove all query parameters to obtain base WMS URL + var wmsBaseURL = wmsURL_withQueryParameters.split("?")[0]; + //re-append "?" as required by Leaflet + wmsBaseURL = wmsBaseURL + "?"; + + /* + * TODO retrieve Capabilities of WMS and get layer names + * + * TODO maybe there is a JS library that can help us here! + * + * TODO simply use all layers??? + * + * TODO or similar to reference outputs: Change result forms to show available + * WMS Layers and let user choose the layer he/she intends to visualize! + */ + + /* + * calls the associated event/method from wps-map controller! + */ + $rootScope.$broadcast("addWMSOutput", + { wmsURL: wmsBaseURL, + layerNamesString: layerNamesString, + layerPropertyName: currentNameForLayerProperty, + outputIdentifier: outputIdentifier}); + }; + + var extract_WMS_URL = function(wmsURL_complexDataValue){ + + /* + * WMS URL value might look like this: + * "" + * + * Hence we must remove the leading "![CDATA[" and trailing "]]" + */ + + var leadingCdataString = ""; + + console.log(wmsURL_complexDataValue); + + if (wmsURL_complexDataValue.startsWith(leadingCdataString)){ + /* + * remove leading and trailing sections + */ + var wmsTargetURL = wmsURL_complexDataValue.replace(leadingCdataString, ""); + + wmsTargetURL = wmsTargetURL.replace(trailingBracketsString, ""); + + console.log(wmsTargetURL); + + return wmsTargetURL; + } + else if (wmsURL_complexDataValue.startsWith("http")){ + /* + * seems to be the target URL already, no extraction needed + */ + return wmsURL_complexDataValue; + } + else{ + /* + * TODO can this line be reached? Then, how to handle correctly? + */ + return wmsURL_complexDataValue; + } + + }; + + function getUrlQueryParameterValueByName(parameterName, url) { + + parameterName = parameterName.replace(/[\[\]]/g, "\\$&"); + var regex = new RegExp("[?&]" + parameterName + "(=([^&#]*)|&|#|$)"), + resultsArray = regex.exec(url); + if (!resultsArray) + return null; + if (!resultsArray[2]) + return ''; + + return decodeURIComponent(resultsArray[2].replace(/\+/g, " ")); + } + + this.addBboxOutputToMap = function(bboxOutput, currentNameForLayerProperty){ + + /* + * TODO check CRS --> GeoJSON requires WGS84 + * project if necessary! + */ + + var outputIdentifier = bboxOutput.identifier; + + var description = bboxOutput.abstractValue || bboxOutput.title; + + var crs = bboxOutput.data.boundingBoxData.crs; + + /* + * TODO check CRS --> WGS84 should be used for GeoJSON + */ + + var lowerCorner = bboxOutput.data.boundingBoxData.lowerCorner; + var upperCorner = bboxOutput.data.boundingBoxData.upperCorner; + + var coordinatesArray = this.createCoordinatesArrayFromBbox(lowerCorner, upperCorner); + + var geoJSONFeature = { + "type": "Feature", + "properties": {"popupContent": description}, + "geometry": { + "type": "Polygon", + "coordinates": coordinatesArray + } + }; + + /* + * calls the associated event/method from wps-map controller! + */ + $rootScope.$broadcast("addGeoJSONOutput", + { geoJSONFeature: geoJSONFeature, + layerPropertyName: currentNameForLayerProperty, + outputIdentifier: outputIdentifier}); + }; + + /** + * Creates a Coordinates Array for GeoJSON feature representing the + * Bounding Box + */ + this.createCoordinatesArrayFromBbox = function(lowerCorner, upperCorner){ + + var lat_lowerLeft = parseFloat(lowerCorner.split(" ")[0]); + var lat_upperRight = parseFloat(upperCorner.split(" ")[0]); + var lon_lowerLeft = parseFloat(lowerCorner.split(" ")[1]); + var lon_upperRight = parseFloat(upperCorner.split(" ")[1]); + + var coordinatesArray = [[ + [lon_lowerLeft, lat_lowerLeft], + [lon_lowerLeft, lat_upperRight], + [lon_upperRight, lat_upperRight], + [lon_upperRight, lat_lowerLeft], + [lon_lowerLeft, lat_lowerLeft] + ]]; + + return coordinatesArray; + }; + + }]); diff --git a/app/config/config-storage-server.json b/app/config/config-storage-server.json index 7a86c3466..f83a94a60 100644 --- a/app/config/config-storage-server.json +++ b/app/config/config-storage-server.json @@ -1,5 +1,5 @@ { - "targetUrlToConfigStorageServer_appConfig" : "http://localhost:8088/config/client-app-config", - "targetUrlToConfigStorageServer_keycloakConfig" : "http://localhost:8088/config/client-keycloak-config", - "targetUrlToConfigStorageServer_controlsConfig" : "http://localhost:8088/config/client-controls-config" + "targetUrlToConfigStorageServer_appConfig" : "https://demo.kommonitor.de/client-config/config/client-app-config", + "targetUrlToConfigStorageServer_keycloakConfig" : "https://demo.kommonitor.de/client-config/config/client-keycloak-config", + "targetUrlToConfigStorageServer_controlsConfig" : "https://demo.kommonitor.de/client-config/config/client-controls-config" } \ No newline at end of file diff --git a/app/config/env_backup.js b/app/config/env_backup.js index 3a61216e8..046ce4101 100644 --- a/app/config/env_backup.js +++ b/app/config/env_backup.js @@ -1,576 +1,539 @@ +"use strict"; try { - - window.__env = window.__env || {}; - - window.__env.appTitle = "KomMonitor (Pilotversion)"; - - // a unique prefix for the respective KomMonitor instance - // it is used to distuingish between various KomMonitor instances in order to write/read data to/from browser cache - window.__env.localStoragePrefix = "kommonitor-develop"; - - // Whether or not to enable debug mode - // Setting this to false will disable console output - window.__env.enableDebug = true; - - // enable/disable role based access using keycloak - window.__env.enableKeycloakSecurity = true; - - // keycloak super admin role name - window.__env.keycloakKomMonitorAdminRoleName = "kommonitor-creator"; - - // enable and show/hide switch to toggle basic and advanced mode - // this feature can hide certain app elements via ID if in basic mode - // configure elements in admin page app settings via controls-config file - window.__env.isAdvancedMode = true; // controls if advanced mode is activated on startup - window.__env.showAdvancedModeSwitch = true; // controls if toggle switch is at all displayed for toggling basinc/advanced mode - - // encrypted data transfer from Data Management API settings - window.__env.encryption = { - enabled: false, - password: "password", // this is shared secret between all components (hence must be set to the exact same value for all participating components) - ivLength_byte: 16 - }; - - /* - PROPERTIES used within greetings window (infoModal component) - to insert custom LOGO by URL with custom width - and adjust individual information text - as well as contact information - */ - window.__env.customLogoURL = "data:image/png;base64,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"; // image format allows all types usable within HTML tag - window.__env.customLogo_onClickURL = "https://www.hochschule-bochum.de/fbg/forschung-und-entwicklung/kommonitor/"; // uses tag to insert clickable link on logo - window.__env.customLogoWidth = "35px"; // height is fixed to 35px; so adjust your custom width to keep aspect ratio - window.__env.customGreetingsContact_name = "Christian Danowski-Buhren"; - window.__env.customGreetingsContact_organisation = "Hochschule Bochum, Fachbereich Geodäsie"; - window.__env.customGreetingsContact_mail = "christian.danowski-buhren@hs-bochum.de"; - window.__env.customGreetingsTextInfoMessage = ""; // as HTML; only set if you want to give users some extra hints; if empty will be ignored - - - - /* - PROPERTIES used within special modal (spatialUnitNotification component) - to show a customizable HTMLText only when user selects a certian spatial unit for any indicator - */ - window.__env.enableSpatialUnitNotificationSelection = false; // controls if a notification should be shown when selecting certain spatial units - window.__env.enableSpatialUnitNotificationButton = false; // enables button to manually open spatial unit notification - window.__env.spatialUnitNotificationSelection = ["Baublockebene"]; // unit(s) for which the notification is shown - window.__env.spatialUnitNotificationTitle = "Informationsverlust auf kleinräumigen Ebenen (Bau- und Mittelblock)"; // title of the notification window - window.__env.spatialUnitNotificationMessage = "Alle Daten, die im KomMonitor dargestellt werden, halten die statistische Geheimhaltung ein. Das bedeutet, dass Angaben zu einzelnen Personen nicht offengelegt werden, insbesondere auch, wenn aus aggregierten Werten Rückschlüsse zu Einzelangaben ermöglicht werden. Aus diesem Grund werden Indikatorenwerte, die in einem räumlichen Aggregat eine absolute Fallzahl von < 3 Einwohnern aufweisen, so behandelt, als hätten diese 0 Einwohner.\ + window.__env = window.__env || {}; + window.__env.appTitle = "KomMonitor (Pilotversion)"; + // a unique prefix for the respective KomMonitor instance + // it is used to distuingish between various KomMonitor instances in order to write/read data to/from browser cache + window.__env.localStoragePrefix = "kommonitor-develop"; + // Whether or not to enable debug mode + // Setting this to false will disable console output + window.__env.enableDebug = true; + // enable/disable role based access using keycloak + window.__env.enableKeycloakSecurity = true; + // keycloak super admin role name + window.__env.keycloakKomMonitorAdminRoleName = "kommonitor-creator"; + // enable and show/hide switch to toggle basic and advanced mode + // this feature can hide certain app elements via ID if in basic mode + // configure elements in admin page app settings via controls-config file + window.__env.isAdvancedMode = true; // controls if advanced mode is activated on startup + window.__env.showAdvancedModeSwitch = true; // controls if toggle switch is at all displayed for toggling basinc/advanced mode + // encrypted data transfer from Data Management API settings + window.__env.encryption = { + enabled: false, + password: "password", + ivLength_byte: 16 + }; + /* + PROPERTIES used within greetings window (infoModal component) + to insert custom LOGO by URL with custom width + and adjust individual information text + as well as contact information + */ + window.__env.customLogoURL = "data:image/png;base64,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"; // image format allows all types usable within HTML tag + window.__env.customLogo_onClickURL = "https://www.hochschule-bochum.de/fbg/forschung-und-entwicklung/kommonitor/"; // uses tag to insert clickable link on logo + window.__env.customLogoWidth = "35px"; // height is fixed to 35px; so adjust your custom width to keep aspect ratio + window.__env.customGreetingsContact_name = "Christian Danowski-Buhren"; + window.__env.customGreetingsContact_organisation = "Hochschule Bochum, Fachbereich Geodäsie"; + window.__env.customGreetingsContact_mail = "christian.danowski-buhren@hs-bochum.de"; + window.__env.customGreetingsTextInfoMessage = ""; // as HTML; only set if you want to give users some extra hints; if empty will be ignored + /* + PROPERTIES used within special modal (spatialUnitNotification component) + to show a customizable HTMLText only when user selects a certian spatial unit for any indicator + */ + window.__env.enableSpatialUnitNotificationSelection = false; // controls if a notification should be shown when selecting certain spatial units + window.__env.enableSpatialUnitNotificationButton = false; // enables button to manually open spatial unit notification + window.__env.spatialUnitNotificationSelection = ["Baublockebene"]; // unit(s) for which the notification is shown + window.__env.spatialUnitNotificationTitle = "Informationsverlust auf kleinräumigen Ebenen (Bau- und Mittelblock)"; // title of the notification window + window.__env.spatialUnitNotificationMessage = "Alle Daten, die im KomMonitor dargestellt werden, halten die statistische Geheimhaltung ein. Das bedeutet, dass Angaben zu einzelnen Personen nicht offengelegt werden, insbesondere auch, wenn aus aggregierten Werten Rückschlüsse zu Einzelangaben ermöglicht werden. Aus diesem Grund werden Indikatorenwerte, die in einem räumlichen Aggregat eine absolute Fallzahl von < 3 Einwohnern aufweisen, so behandelt, als hätten diese 0 Einwohner.\ Diese Methode der statistischen Geheimhaltung kann zu einem teilweise hohen Informationsverlust auf kleinräumigen Ebenen führen. Stark differenzierte Indikatoren auf kleinräumigen Ebenen, die insgesamt nur wenige Fallzahlen aufweisen, könnten so an vielen Stellen entsprechend bereinigt worden seien und somit keine validen Werte liefern. \ Dies lässt sich daran erkennen, dass die Fallzahlen insgesamt niedrig sind und viele Gebiete 0-Werte haben. Eine flächendeckendes Bild ist somit nicht möglich. \ Dennoch bieten diese Indikatoren trotz ungenauer Wertedie Möglichkeit, „Hot-Spots“ und „Cluster“ der jeweiligen Indikatoren zu ermitteln. \ Zahlen auf kleinräumige Ebenen sollten vor diesem Hintergrund vorsichtig und sorgfältig interpretiert werden."; // message shown when previous spatial unit is selected - - /* - PROPERTIES used within extended info modal (second tab) to show a customizable HTMLText - */ - window.__env.enableExtendedInfoModal = false; // controls if an extra tab should be shown in the info modal. - window.__env.standardInfoModalTabTitle = "Informationen zu KomMonitor" // title of the first tab - window.__env.extendedInfoModalTabTitle = "Weitere Informationen" // title of the second tab - window.__env.extendedInfoModalHTMLMessage = ""; // message in the second tab as HTML - - // property names of feature id and name (relevant for all spatial features) - KomMonitor specific - // DO NOT CHANGE THEM - ONLY IF YOU REALLY KNOW WHAT YOU ARE DOING - window.__env.FEATURE_ID_PROPERTY_NAME = "ID"; - window.__env.FEATURE_NAME_PROPERTY_NAME = "NAME"; - window.__env.VALID_START_DATE_PROPERTY_NAME = "validStartDate"; - window.__env.VALID_END_DATE_PROPERTY_NAME = "validEndDate"; - window.__env.indicatorDatePrefix = "DATE_"; - - // Data Management API URL - // window.__env.apiUrl = 'http://kommonitor.fbg-hsbo.de/'; - window.__env.apiUrl = 'http://localhost:8085/'; - // Base url for Data Management API - window.__env.basePath = 'management'; - - // Processing Engine URL - window.__env.targetUrlToProcessingEngine = 'http://localhost:8086/processing/'; - - // Open Route Service URL - window.__env.targetUrlToReachabilityService_ORS = 'https://ors5.fbg-hsbo.de'; - - // Open Trip Planner URL - currently not integrated - window.__env.targetUrlToReachabilityService_OTP = 'http://localhost:8090/opentripplanner'; - - // Data Imporret URL - window.__env.targetUrlToImporterService = 'http://localhost:8087/importer/'; - - // KomMonitor Geocoder Proxy - window.__env.targetUrlToGeocoderService = 'https://geocoder.fbg-hsbo.de/nominatim/'; - - // optional geometry simplification (a feature of Data Management API) - window.__env.simplifyGeometriesParameterName = "simplifyGeometries"; - // allowed values and meaning: - // ["original" --> no simplification; "weak" --> weak simplification, - // "medium" --> medium simplification; "strong" --> string simplification] - window.__env.simplifyGeometriesOptions = [{"label": "nein", "value": "original"}, {"label": "schwach", "value": "weak"}, {"label": "mittel", "value": "medium"}, {"label": "stark", "value": "strong"}]; - // use strong as default to minimize size of queried features - // for display, strong simplification is okay - window.__env.simplifyGeometries = "original"; - - // number of decimals for display of numeric values in app - window.__env.numberOfDecimals = 2; - - // starting viewpoint parameters and zoom level - window.__env.initialLatitude = 51.4386432; - window.__env.initialLongitude = 7.0115552; - window.__env.initialZoomLevel = 12; - // window.__env.minZoomLevel = 11; - window.__env.minZoomLevel = 5; - window.__env.maxZoomLevel = 18; - - window.__env.baseLayers = [ // baseLayers of instance; first will be set as default starting layer - // { - // name: "", // display name - // url: "", // URL to layer - // layerType: "TILE_LAYER", // TILE_LAYER | TILE_LAYER_GRAYSCALE | WMS - // layerName_WMS: "", // only relevant for layers of type WMS - multiple layers comma-separated - // attribution_html: "", // attribution info displayed at the bottom of the map as HTML string - // minZoomLevel: window.__env.minZoomLevel, // min zoom level for this layer (number between 1-20) - // maxZoomLevel: window.__env.maxZoomLevel // max zoom level for this layer (number between 1-20, greater than minZoomLevel) - // }, - { - name: "Open Street Map - Graustufen", - url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", - layerType: "TILE_LAYER_GRAYSCALE", - layerName_WMS: "", - attribution_html: "Map data © OpenStreetMap contributors", - minZoomLevel: window.__env.minZoomLevel, - maxZoomLevel: window.__env.maxZoomLevel - }, - { - name: "Open Street Map - Farbe", - url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", - layerType: "TILE_LAYER", - layerName_WMS: "", - attribution_html: "Map data © OpenStreetMap contributors", - minZoomLevel: window.__env.minZoomLevel, - maxZoomLevel: window.__env.maxZoomLevel - }, - { - name: "RVR Stadtplan - Farbe", - url: "https://geodaten.metropoleruhr.de/spw2?", - layerType: "WMS", - layerName_WMS: "stadtplan_rvr", - attribution_html: "Map data © https://geodaten.metropoleruhr.de", - minZoomLevel: window.__env.minZoomLevel, - maxZoomLevel: window.__env.maxZoomLevel - }, - { - name: "RVR Stadtplan - Graublau", - url: "https://geodaten.metropoleruhr.de/spw2?", - layerType: "WMS", - layerName_WMS: "spw2_graublau", - attribution_html: "Map data © https://geodaten.metropoleruhr.de", - minZoomLevel: window.__env.minZoomLevel, - maxZoomLevel: window.__env.maxZoomLevel - }, - { - name: "NRW Digitale Topographische Karte", - url: "https://www.wms.nrw.de/geobasis/wms_nw_dtk?", - layerType: "WMS", - layerName_WMS: "nw_dtk_sw", - attribution_html: "Map data © Geobasis NRW", - minZoomLevel: window.__env.minZoomLevel, - maxZoomLevel: 20 - }, - { - name: "NRW Digitale Orthophotos (Luftbilder)", - url: "https://www.wms.nrw.de/geobasis/wms_nw_dop?", - layerType: "WMS", - layerName_WMS: "nw_dop_rgb", - attribution_html: "Map data © Geobasis NRW", - minZoomLevel: window.__env.minZoomLevel, - maxZoomLevel: window.__env.maxZoomLevel - }, - { - name: "Stadt Essen - Automatisierte Liegenschaftskarte", - url: "https://geo.essen.de/arcgis/services/basemap/Stadtplanpaket_ALK_grau/MapServer/WMSServer?", - layerType: "WMS", - layerName_WMS: "0,1,2,3", - attribution_html: "Stadt Essen: Amt für Geoinformation, Vermessung und Kataster", - minZoomLevel: window.__env.minZoomLevel, - maxZoomLevel: window.__env.maxZoomLevel - }, - { - name: "Stadt Essen - Amtliche Basiskarte", - url: "https://geo.essen.de/arcgis/services/basemap/Uebersicht_ABK_Stadtgrundkarte/MapServer/WMSServer?", - layerType: "WMS", - layerName_WMS: "nw_dop_rgb", - attribution_html: "Stadt Essen: Amt für Geoinformation, Vermessung und Kataster", - minZoomLevel: window.__env.minZoomLevel, - maxZoomLevel: window.__env.maxZoomLevel - } - ]; - - - // starting indicator and spatial unit - // if faulty values are provided, a random indicator will be displayed - window.__env.initialIndicatorId = "48a18455-6a52-4e74-bdbf-99237187fc5c"; - window.__env.initialSpatialUnitName = "Stadtteilebene"; - - // various color settings - window.__env.defaultColorForNoDataValues = "rgba(255,255,255,0)"; - window.__env.defaultBorderColorForNoDataValues = "black"; - window.__env.defaultColorForOutliers_high = "#191919"; - window.__env.defaultBorderColorForOutliers_high = "black"; - window.__env.defaultFillOpacityForOutliers_high = "0.7"; - window.__env.defaultColorForOutliers_low = "#4f4f4f"; - window.__env.defaultBorderColorForOutliers_low = "black"; - window.__env.defaultFillOpacityForOutliers_low = "0.7"; - window.__env.defaultColorForHoveredFeatures = "#e01414"; - window.__env.defaultColorForClickedFeatures = "#42e5f4"; - window.__env.defaultColorForZeroValues = "#bababa"; - window.__env.defaultBorderColor = "black"; - window.__env.defaultColorForFilteredValues = "rgba(255,255,255,0)"; - window.__env.defaultBorderColorForFilteredValues = "black"; - window.__env.defaultFillOpacity = "0.7"; - window.__env.defaultFillOpacityForFilteredFeatures = "0.7"; - window.__env.defaultFillOpacityForZeroFeatures = "0.7"; - window.__env.defaultFillOpacityForNoDataFeatures = "0.7"; - window.__env.defaultFillOpacityForHighlightedFeatures = "0.8"; - window.__env.useTransparencyOnIndicator = true; - window.__env.useOutlierDetectionOnIndicator = true; - window.__env.classifyZeroSeparately = true; - window.__env.classifyUsingWholeTimeseries = true; - window.__env.useNoDataToggle = false; // true = hide no data values, false = show no data values - - // default color for specific classification as ColorBrewer palette name - // i.e. balance mode - // i.e. measure of value classification (German: Schwellwertklassifizierung) - window.__env.defaultColorBrewerPaletteForBalanceIncreasingValues = "Purples"; - window.__env.defaultColorBrewerPaletteForBalanceDecreasingValues = "YlOrBr"; - window.__env.defaultColorBrewerPaletteForGtMovValues = "YlOrBr"; - window.__env.defaultColorBrewerPaletteForLtMovValues = "Blues"; - - // classification - //allowesValues: equal_interval, quantile, jenks - window.__env.defaultClassifyMethod = "equal_interval"; - - // array of indicator name substring that shal be used to filter out / hide certain indicators by their name - // e.g. set ["entwicklung"] to hide all indicators whose name contains the substring "entwicklung" - window.__env.arrayOfNameSubstringsForHidingIndicators = []; - // window.__env.arrayOfNameSubstringsForHidingIndicators = []; - - window.__env.arrayOfNameSubstringsForHidingGeoresources = []; - - // e-mail recipient for feedback mail - window.__env.feedbackMailRecipient = "christian.danowski-buhren@hochschule-bochum.de"; - // window.__env.feedbackMailRecipient = "christian.danowski-buhren@hs-bochum.de"; - - // config array of available options for choosing update interval of indicators - window.__env.updateIntervalOptions = [ - { - displayName: "jährlich", - apiName: "YEARLY" - }, - { - displayName: "halbjährlich", - apiName: "HALF_YEARLY" - }, - { - displayName: "vierteljährlich", - apiName: "QUARTERLY" - }, - { - displayName: "monatlich", - apiName: "MONTHLY" - }, - { - displayName: "wöchentlich", - apiName: "WEEKLY" - }, - { - displayName: "täglich", - apiName: "DAILY" - }, - { - displayName: "beliebig", - apiName: "ARBITRARY" - } - ]; - - // config array of available options for choosing creation type of indicators - window.__env.indicatorCreationTypeOptions = [ - { - displayName: "manuell", - apiName: "INSERTION" - }, - { - displayName: "automatisierte Berechnung durch KomMonitor", - apiName: "COMPUTATION" - } - ]; - - // config array of available options for choosing indicator's unit - window.__env.indicatorUnitOptions = [ "Anzahl", "Anteil", "Prozent", "Einwohner", "m", "m²", "km", "km²", "ha", "dimensionslos", "standardisiert", "z-transformierte Werte" - ]; - - // config array of available options for choosing indicator type of indicators - window.__env.indicatorTypeOptions = [ - { - displayName: "Status-Indikator (absolut)", - apiName: "STATUS_ABSOLUTE" - }, - { - displayName: "Status-Indikator (relativ)", - apiName: "STATUS_RELATIVE" - }, - { - displayName: "Dynamik-Indikator (absolut)", - apiName: "DYNAMIC_ABSOLUTE" - }, - { - displayName: "Dynamik-Indikator (relativ)", - apiName: "DYNAMIC_RELATIVE" - }, - { - displayName: "Status-Indikator (standardisiert)", - apiName: "STATUS_STANDARDIZED" - }, - { - displayName: "Dynamik-Indikator (standardisiert)", - apiName: "DYNAMIC_STANDARDIZED" - } - - ]; - - // array of available WMS datasets - window.__env.wmsDatasets = [ - // { - // title: "Title of WMS dataset", - // description: "Description as HTML code (HTML tags allowed)", - // url: "URL including '?' as last character (i.e. https://wms.example/myWMS)", - // topicReference: "3af3b65e-4792-4998-8531-54616564b5bc", // id of georesource topic to hang in the WMS entry - // layerName:"laerm" // name of WMS layer to display - // }, - { - title: "Lärmkartierung - Test", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "3af3b65e-4792-4998-8531-54616564b5bc", - layerName:"laerm" - }, - { - title: "Unfalldaten 2019", - description: "Unfalldaten des statistischen Bundesamtes", - url: "https://www.wms.nrw.de/wms/unfallatlas?", - topicReference: "7255b83f-feb0-4f01-9dc1-6b355447206d", - layerName:"Unfallorte_2019" - }, - { - title: "Lärmkartierung - Flugverkehr 24h-Pegel LDEN", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "FLG_DEN" - }, - { - title: "Lärmkartierung - Flugverkehr Nachtpegel LNight", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "FLG_NGT" - }, - { - title: "Lärmkartierung - Industrie 24h-Pegel LDEN", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "IND_DEN" - }, - { - title: "Lärmkartierung - Industrie Nachtpegel LNight", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "IND_NGT" - }, - { - title: "Lärmkartierung - Straße 24h-Pegel LDEN", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "STR_DEN" - }, - { - title: "Lärmkartierung - Straße Nachtpegel LNight", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "STR_NGT" - }, - { - title: "Lärmkartierung - Schiene sonstige 24h-Pegel LDEN", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "SCS_DEN" - }, - { - title: "Lärmkartierung - Schiene sonstige Nachtpegel LNight", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "SCS_NGT" - }, - { - title: "Lärmkartierung - Schiene Bund 24h-Pegel LDEN", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "SCB_DEN" - }, - { - title: "Lärmkartierung - Schiene Bund Nachtpegel LNight", - description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - url: "https://www.wms.nrw.de/umwelt/laerm?", - topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", - layerName: "SCB_NGT" - }, - // { - // title: "Lärmkartierung - Gebaeude", - // description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - // url: "https://www.wms.nrw.de/umwelt/laerm?", - // layerName: "Gebaeude" - // }, - // { - // title: "Lärmkartierung - Modell", - // description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", - // url: "https://www.wms.nrw.de/umwelt/laerm?", - // layerName: "Modell" - // }, - { - title: "Versiegelungsgrad - 2006 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2006/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "0" - }, - { - title: "Versiegelungsgrad - 2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2009/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "0" - }, - { - title: "Versiegelungsgrad - 2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_Imperviousness_Density_2012/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "Imperviousness density 2012 20m" - }, - { - title: "Versiegelungsgrad - 2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2015/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "0" - }, - { - title: "Versiegelungsgrad - Veränderung 2006-2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_06_09/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "0" - }, - { - title: "Versiegelungsgrad - Veränderung 2009-2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_09_12/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "Imperviousness density change 09-12 20m" - }, - { - title: "Versiegelungsgrad - Veränderung 2012-2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_12_15/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "0" - }, - { - title: "Versiegelungsgrad - Klassifizierte Veränderung 2006-2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessClassifiedChange_06_09/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "0" - }, - { - title: "Versiegelungsgrad - Klassifizierte Veränderung 2009-2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessClassifiedChange_09_12/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "0" - }, - { - title: "Versiegelungsgrad - Klassifizierte Veränderung 2012-2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", - description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", - url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_12_15/MapServer/WMSServer?", - topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", - layerName: "0" - }, - { - title: "Bodennutzung - Bebauungsplanumringe", - description: "Umringe der Bebauungspläne gemäß geodaten.metropoleruhr.de", - url: "https://geodaten.metropoleruhr.de/inspire/bodennutzung/metropoleruhr?", - topicReference: null, - layerName: "bplan" - } - ]; - - // array if available WFS datasets - window.__env.wfsDatasets = [ - // { - // title: "Title of dataset", - // description: "Description as HTML code (HTML tags allowed)", - // url: "URL of dataset including '?' as last character (i.e. https://wfs.example/myWfS?)", - // featureTypeNamespace: "namespace of featureType", - // featureTypeName: "name of featureType", // // check GetCapabilities Response - // featureTypeGeometryName: "name of geometry property of feature type", // check DescribeFeature Response - // geometryType: "AOI", // POI|LOI|AOI - // poiSymbolColor: "white", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] - // poiMarkerColor: "red", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] - // poiSymbolBootstrap3Name: "home", - // loiColor: "#00aabb", // color for LOI datasets - // loiWidth: 3, // 1 - 5 - // loiDashArrayString: "", // e.g. "20, 20" for equal dash/space visuals - // aoiColor: "#00aabb", // color for AOI datasets - // filterFeaturesToMapBBOX: false, // applies BBOX filter to WFS request - if not supported by WFS may lead to error - // filterEncoding: { // only one filter is currently implemented (PropertyIsEqualTo) - // // PropertyIsEqualTo: { - // // propertyName: undefined, // name of property - // // propertyValue: undefined // value of property - // // } - // }, - // topicReference: "c712af89-ff11-40ff-ad84-b3592901e085" // id of georesource topic entry which shall be used to display the WFS dataset entry - // }, - { - title: "Bodennutzung - Bebauungsplanumringe", - description: "Umringe der Bebauungspläne gemäß geodaten.metropoleruhr.de. WFS-Dienst unterstützt keine räumllichen Filter. Daher müssen zwingend alle Features abgerufen werden.", - url: "https://geodaten.metropoleruhr.de/inspire/bodennutzung/metropoleruhr?", - featureTypeNamespace: "ms", - featureTypeName: "bplan_stand", - featureTypeGeometryName: "geom", - geometryType: "AOI", // POI|LOI|AOI - poiSymbolColor: "white", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] - poiMarkerColor: "red", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] - poiSymbolBootstrap3Name: "home", - loiColor: "#00aabb", - loiWidth: 3, - loiDashArrayString: "", - aoiColor: "#00aabb", - filterFeaturesToMapBBOX: false, - filterEncoding: { - // PropertyIsEqualTo: { - // propertyName: undefined, - // propertyValue: undefined - // } - }, - topicReference: "c712af89-ff11-40ff-ad84-b3592901e085" - } - ]; - -} catch (error) { - console.error("Error while evaluating app config. Error is: \n" + error); -} \ No newline at end of file + /* + PROPERTIES used within extended info modal (second tab) to show a customizable HTMLText + */ + window.__env.enableExtendedInfoModal = false; // controls if an extra tab should be shown in the info modal. + window.__env.standardInfoModalTabTitle = "Informationen zu KomMonitor"; // title of the first tab + window.__env.extendedInfoModalTabTitle = "Weitere Informationen"; // title of the second tab + window.__env.extendedInfoModalHTMLMessage = ""; // message in the second tab as HTML + // property names of feature id and name (relevant for all spatial features) - KomMonitor specific + // DO NOT CHANGE THEM - ONLY IF YOU REALLY KNOW WHAT YOU ARE DOING + window.__env.FEATURE_ID_PROPERTY_NAME = "ID"; + window.__env.FEATURE_NAME_PROPERTY_NAME = "NAME"; + window.__env.VALID_START_DATE_PROPERTY_NAME = "validStartDate"; + window.__env.VALID_END_DATE_PROPERTY_NAME = "validEndDate"; + window.__env.indicatorDatePrefix = "DATE_"; + // Data Management API URL + // window.__env.apiUrl = 'http://kommonitor.fbg-hsbo.de/'; + window.__env.apiUrl = 'http://localhost:8085/'; + // Base url for Data Management API + window.__env.basePath = 'management'; + // Processing Engine URL + window.__env.targetUrlToProcessingEngine = 'http://localhost:8086/processing/'; + // Open Route Service URL + window.__env.targetUrlToReachabilityService_ORS = 'https://ors5.fbg-hsbo.de'; + // Open Trip Planner URL - currently not integrated + window.__env.targetUrlToReachabilityService_OTP = 'http://localhost:8090/opentripplanner'; + // Data Imporret URL + window.__env.targetUrlToImporterService = 'http://localhost:8087/importer/'; + // KomMonitor Geocoder Proxy + window.__env.targetUrlToGeocoderService = 'https://geocoder.fbg-hsbo.de/nominatim/'; + // optional geometry simplification (a feature of Data Management API) + window.__env.simplifyGeometriesParameterName = "simplifyGeometries"; + // allowed values and meaning: + // ["original" --> no simplification; "weak" --> weak simplification, + // "medium" --> medium simplification; "strong" --> string simplification] + window.__env.simplifyGeometriesOptions = [{ "label": "nein", "value": "original" }, { "label": "schwach", "value": "weak" }, { "label": "mittel", "value": "medium" }, { "label": "stark", "value": "strong" }]; + // use strong as default to minimize size of queried features + // for display, strong simplification is okay + window.__env.simplifyGeometries = "original"; + // number of decimals for display of numeric values in app + window.__env.numberOfDecimals = 2; + // starting viewpoint parameters and zoom level + window.__env.initialLatitude = 51.4386432; + window.__env.initialLongitude = 7.0115552; + window.__env.initialZoomLevel = 12; + // window.__env.minZoomLevel = 11; + window.__env.minZoomLevel = 5; + window.__env.maxZoomLevel = 18; + window.__env.baseLayers = [ + // { + // name: "", // display name + // url: "", // URL to layer + // layerType: "TILE_LAYER", // TILE_LAYER | TILE_LAYER_GRAYSCALE | WMS + // layerName_WMS: "", // only relevant for layers of type WMS - multiple layers comma-separated + // attribution_html: "", // attribution info displayed at the bottom of the map as HTML string + // minZoomLevel: window.__env.minZoomLevel, // min zoom level for this layer (number between 1-20) + // maxZoomLevel: window.__env.maxZoomLevel // max zoom level for this layer (number between 1-20, greater than minZoomLevel) + // }, + { + name: "Open Street Map - Graustufen", + url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + layerType: "TILE_LAYER_GRAYSCALE", + layerName_WMS: "", + attribution_html: "Map data © OpenStreetMap contributors", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "Open Street Map - Farbe", + url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + layerType: "TILE_LAYER", + layerName_WMS: "", + attribution_html: "Map data © OpenStreetMap contributors", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "RVR Stadtplan - Farbe", + url: "https://geodaten.metropoleruhr.de/spw2?", + layerType: "WMS", + layerName_WMS: "stadtplan_rvr", + attribution_html: "Map data © https://geodaten.metropoleruhr.de", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "RVR Stadtplan - Graublau", + url: "https://geodaten.metropoleruhr.de/spw2?", + layerType: "WMS", + layerName_WMS: "spw2_graublau", + attribution_html: "Map data © https://geodaten.metropoleruhr.de", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "NRW Digitale Topographische Karte", + url: "https://www.wms.nrw.de/geobasis/wms_nw_dtk?", + layerType: "WMS", + layerName_WMS: "nw_dtk_sw", + attribution_html: "Map data © Geobasis NRW", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: 20 + }, + { + name: "NRW Digitale Orthophotos (Luftbilder)", + url: "https://www.wms.nrw.de/geobasis/wms_nw_dop?", + layerType: "WMS", + layerName_WMS: "nw_dop_rgb", + attribution_html: "Map data © Geobasis NRW", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "Stadt Essen - Automatisierte Liegenschaftskarte", + url: "https://geo.essen.de/arcgis/services/basemap/Stadtplanpaket_ALK_grau/MapServer/WMSServer?", + layerType: "WMS", + layerName_WMS: "0,1,2,3", + attribution_html: "Stadt Essen: Amt für Geoinformation, Vermessung und Kataster", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "Stadt Essen - Amtliche Basiskarte", + url: "https://geo.essen.de/arcgis/services/basemap/Uebersicht_ABK_Stadtgrundkarte/MapServer/WMSServer?", + layerType: "WMS", + layerName_WMS: "nw_dop_rgb", + attribution_html: "Stadt Essen: Amt für Geoinformation, Vermessung und Kataster", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + } + ]; + // starting indicator and spatial unit + // if faulty values are provided, a random indicator will be displayed + window.__env.initialIndicatorId = "48a18455-6a52-4e74-bdbf-99237187fc5c"; + window.__env.initialSpatialUnitName = "Stadtteilebene"; + // various color settings + window.__env.defaultColorForNoDataValues = "rgba(255,255,255,0)"; + window.__env.defaultBorderColorForNoDataValues = "black"; + window.__env.defaultColorForOutliers_high = "#191919"; + window.__env.defaultBorderColorForOutliers_high = "black"; + window.__env.defaultFillOpacityForOutliers_high = "0.7"; + window.__env.defaultColorForOutliers_low = "#4f4f4f"; + window.__env.defaultBorderColorForOutliers_low = "black"; + window.__env.defaultFillOpacityForOutliers_low = "0.7"; + window.__env.defaultColorForHoveredFeatures = "#e01414"; + window.__env.defaultColorForClickedFeatures = "#42e5f4"; + window.__env.defaultColorForZeroValues = "#bababa"; + window.__env.defaultBorderColor = "black"; + window.__env.defaultColorForFilteredValues = "rgba(255,255,255,0)"; + window.__env.defaultBorderColorForFilteredValues = "black"; + window.__env.defaultFillOpacity = "0.7"; + window.__env.defaultFillOpacityForFilteredFeatures = "0.7"; + window.__env.defaultFillOpacityForZeroFeatures = "0.7"; + window.__env.defaultFillOpacityForNoDataFeatures = "0.7"; + window.__env.defaultFillOpacityForHighlightedFeatures = "0.8"; + window.__env.useTransparencyOnIndicator = true; + window.__env.useOutlierDetectionOnIndicator = true; + window.__env.classifyZeroSeparately = true; + window.__env.classifyUsingWholeTimeseries = true; + window.__env.useNoDataToggle = false; // true = hide no data values, false = show no data values + // default color for specific classification as ColorBrewer palette name + // i.e. balance mode + // i.e. measure of value classification (German: Schwellwertklassifizierung) + window.__env.defaultColorBrewerPaletteForBalanceIncreasingValues = "Purples"; + window.__env.defaultColorBrewerPaletteForBalanceDecreasingValues = "YlOrBr"; + window.__env.defaultColorBrewerPaletteForGtMovValues = "YlOrBr"; + window.__env.defaultColorBrewerPaletteForLtMovValues = "Blues"; + // classification + //allowesValues: equal_interval, quantile, jenks + window.__env.defaultClassifyMethod = "equal_interval"; + // array of indicator name substring that shal be used to filter out / hide certain indicators by their name + // e.g. set ["entwicklung"] to hide all indicators whose name contains the substring "entwicklung" + window.__env.arrayOfNameSubstringsForHidingIndicators = []; + // window.__env.arrayOfNameSubstringsForHidingIndicators = []; + window.__env.arrayOfNameSubstringsForHidingGeoresources = []; + // e-mail recipient for feedback mail + window.__env.feedbackMailRecipient = "christian.danowski-buhren@hochschule-bochum.de"; + // window.__env.feedbackMailRecipient = "christian.danowski-buhren@hs-bochum.de"; + // config array of available options for choosing update interval of indicators + window.__env.updateIntervalOptions = [ + { + displayName: "jährlich", + apiName: "YEARLY" + }, + { + displayName: "halbjährlich", + apiName: "HALF_YEARLY" + }, + { + displayName: "vierteljährlich", + apiName: "QUARTERLY" + }, + { + displayName: "monatlich", + apiName: "MONTHLY" + }, + { + displayName: "wöchentlich", + apiName: "WEEKLY" + }, + { + displayName: "täglich", + apiName: "DAILY" + }, + { + displayName: "beliebig", + apiName: "ARBITRARY" + } + ]; + // config array of available options for choosing creation type of indicators + window.__env.indicatorCreationTypeOptions = [ + { + displayName: "manuell", + apiName: "INSERTION" + }, + { + displayName: "automatisierte Berechnung durch KomMonitor", + apiName: "COMPUTATION" + } + ]; + // config array of available options for choosing indicator's unit + window.__env.indicatorUnitOptions = ["Anzahl", "Anteil", "Prozent", "Einwohner", "m", "m²", "km", "km²", "ha", "dimensionslos", "standardisiert", "z-transformierte Werte" + ]; + // config array of available options for choosing indicator type of indicators + window.__env.indicatorTypeOptions = [ + { + displayName: "Status-Indikator (absolut)", + apiName: "STATUS_ABSOLUTE" + }, + { + displayName: "Status-Indikator (relativ)", + apiName: "STATUS_RELATIVE" + }, + { + displayName: "Dynamik-Indikator (absolut)", + apiName: "DYNAMIC_ABSOLUTE" + }, + { + displayName: "Dynamik-Indikator (relativ)", + apiName: "DYNAMIC_RELATIVE" + }, + { + displayName: "Status-Indikator (standardisiert)", + apiName: "STATUS_STANDARDIZED" + }, + { + displayName: "Dynamik-Indikator (standardisiert)", + apiName: "DYNAMIC_STANDARDIZED" + } + ]; + // array of available WMS datasets + window.__env.wmsDatasets = [ + // { + // title: "Title of WMS dataset", + // description: "Description as HTML code (HTML tags allowed)", + // url: "URL including '?' as last character (i.e. https://wms.example/myWMS)", + // topicReference: "3af3b65e-4792-4998-8531-54616564b5bc", // id of georesource topic to hang in the WMS entry + // layerName:"laerm" // name of WMS layer to display + // }, + { + title: "Lärmkartierung - Test", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "3af3b65e-4792-4998-8531-54616564b5bc", + layerName: "laerm" + }, + { + title: "Unfalldaten 2019", + description: "Unfalldaten des statistischen Bundesamtes", + url: "https://www.wms.nrw.de/wms/unfallatlas?", + topicReference: "7255b83f-feb0-4f01-9dc1-6b355447206d", + layerName: "Unfallorte_2019" + }, + { + title: "Lärmkartierung - Flugverkehr 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "FLG_DEN" + }, + { + title: "Lärmkartierung - Flugverkehr Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "FLG_NGT" + }, + { + title: "Lärmkartierung - Industrie 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "IND_DEN" + }, + { + title: "Lärmkartierung - Industrie Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "IND_NGT" + }, + { + title: "Lärmkartierung - Straße 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "STR_DEN" + }, + { + title: "Lärmkartierung - Straße Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "STR_NGT" + }, + { + title: "Lärmkartierung - Schiene sonstige 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "SCS_DEN" + }, + { + title: "Lärmkartierung - Schiene sonstige Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "SCS_NGT" + }, + { + title: "Lärmkartierung - Schiene Bund 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "SCB_DEN" + }, + { + title: "Lärmkartierung - Schiene Bund Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "SCB_NGT" + }, + // { + // title: "Lärmkartierung - Gebaeude", + // description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + // url: "https://www.wms.nrw.de/umwelt/laerm?", + // layerName: "Gebaeude" + // }, + // { + // title: "Lärmkartierung - Modell", + // description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + // url: "https://www.wms.nrw.de/umwelt/laerm?", + // layerName: "Modell" + // }, + { + title: "Versiegelungsgrad - 2006 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2006/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - 2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2009/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - 2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_Imperviousness_Density_2012/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "Imperviousness density 2012 20m" + }, + { + title: "Versiegelungsgrad - 2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2015/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Veränderung 2006-2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_06_09/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Veränderung 2009-2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_09_12/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "Imperviousness density change 09-12 20m" + }, + { + title: "Versiegelungsgrad - Veränderung 2012-2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_12_15/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Klassifizierte Veränderung 2006-2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessClassifiedChange_06_09/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Klassifizierte Veränderung 2009-2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessClassifiedChange_09_12/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Klassifizierte Veränderung 2012-2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_12_15/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Bodennutzung - Bebauungsplanumringe", + description: "Umringe der Bebauungspläne gemäß geodaten.metropoleruhr.de", + url: "https://geodaten.metropoleruhr.de/inspire/bodennutzung/metropoleruhr?", + topicReference: null, + layerName: "bplan" + } + ]; + // array if available WFS datasets + window.__env.wfsDatasets = [ + // { + // title: "Title of dataset", + // description: "Description as HTML code (HTML tags allowed)", + // url: "URL of dataset including '?' as last character (i.e. https://wfs.example/myWfS?)", + // featureTypeNamespace: "namespace of featureType", + // featureTypeName: "name of featureType", // // check GetCapabilities Response + // featureTypeGeometryName: "name of geometry property of feature type", // check DescribeFeature Response + // geometryType: "AOI", // POI|LOI|AOI + // poiSymbolColor: "white", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] + // poiMarkerColor: "red", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] + // poiSymbolBootstrap3Name: "home", + // loiColor: "#00aabb", // color for LOI datasets + // loiWidth: 3, // 1 - 5 + // loiDashArrayString: "", // e.g. "20, 20" for equal dash/space visuals + // aoiColor: "#00aabb", // color for AOI datasets + // filterFeaturesToMapBBOX: false, // applies BBOX filter to WFS request - if not supported by WFS may lead to error + // filterEncoding: { // only one filter is currently implemented (PropertyIsEqualTo) + // // PropertyIsEqualTo: { + // // propertyName: undefined, // name of property + // // propertyValue: undefined // value of property + // // } + // }, + // topicReference: "c712af89-ff11-40ff-ad84-b3592901e085" // id of georesource topic entry which shall be used to display the WFS dataset entry + // }, + { + title: "Bodennutzung - Bebauungsplanumringe", + description: "Umringe der Bebauungspläne gemäß geodaten.metropoleruhr.de. WFS-Dienst unterstützt keine räumllichen Filter. Daher müssen zwingend alle Features abgerufen werden.", + url: "https://geodaten.metropoleruhr.de/inspire/bodennutzung/metropoleruhr?", + featureTypeNamespace: "ms", + featureTypeName: "bplan_stand", + featureTypeGeometryName: "geom", + geometryType: "AOI", + poiSymbolColor: "white", + poiMarkerColor: "red", + poiSymbolBootstrap3Name: "home", + loiColor: "#00aabb", + loiWidth: 3, + loiDashArrayString: "", + aoiColor: "#00aabb", + filterFeaturesToMapBBOX: false, + filterEncoding: { + // PropertyIsEqualTo: { + // propertyName: undefined, + // propertyValue: undefined + // } + }, + topicReference: "c712af89-ff11-40ff-ad84-b3592901e085" + } + ]; +} +catch (error) { + console.error("Error while evaluating app config. Error is: \n" + error); +} +//# sourceMappingURL=env_backup.js.map \ No newline at end of file diff --git a/app/config/env_backup.js.map b/app/config/env_backup.js.map new file mode 100644 index 000000000..af7217e11 --- /dev/null +++ b/app/config/env_backup.js.map @@ -0,0 +1 @@ +{"version":3,"file":"env_backup.js","sourceRoot":"","sources":["env_backup.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/config/env_backup.ts b/app/config/env_backup.ts new file mode 100644 index 000000000..3a61216e8 --- /dev/null +++ b/app/config/env_backup.ts @@ -0,0 +1,576 @@ +try { + + window.__env = window.__env || {}; + + window.__env.appTitle = "KomMonitor (Pilotversion)"; + + // a unique prefix for the respective KomMonitor instance + // it is used to distuingish between various KomMonitor instances in order to write/read data to/from browser cache + window.__env.localStoragePrefix = "kommonitor-develop"; + + // Whether or not to enable debug mode + // Setting this to false will disable console output + window.__env.enableDebug = true; + + // enable/disable role based access using keycloak + window.__env.enableKeycloakSecurity = true; + + // keycloak super admin role name + window.__env.keycloakKomMonitorAdminRoleName = "kommonitor-creator"; + + // enable and show/hide switch to toggle basic and advanced mode + // this feature can hide certain app elements via ID if in basic mode + // configure elements in admin page app settings via controls-config file + window.__env.isAdvancedMode = true; // controls if advanced mode is activated on startup + window.__env.showAdvancedModeSwitch = true; // controls if toggle switch is at all displayed for toggling basinc/advanced mode + + // encrypted data transfer from Data Management API settings + window.__env.encryption = { + enabled: false, + password: "password", // this is shared secret between all components (hence must be set to the exact same value for all participating components) + ivLength_byte: 16 + }; + + /* + PROPERTIES used within greetings window (infoModal component) + to insert custom LOGO by URL with custom width + and adjust individual information text + as well as contact information + */ + window.__env.customLogoURL = "data:image/png;base64,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"; // image format allows all types usable within HTML tag + window.__env.customLogo_onClickURL = "https://www.hochschule-bochum.de/fbg/forschung-und-entwicklung/kommonitor/"; // uses tag to insert clickable link on logo + window.__env.customLogoWidth = "35px"; // height is fixed to 35px; so adjust your custom width to keep aspect ratio + window.__env.customGreetingsContact_name = "Christian Danowski-Buhren"; + window.__env.customGreetingsContact_organisation = "Hochschule Bochum, Fachbereich Geodäsie"; + window.__env.customGreetingsContact_mail = "christian.danowski-buhren@hs-bochum.de"; + window.__env.customGreetingsTextInfoMessage = ""; // as HTML; only set if you want to give users some extra hints; if empty will be ignored + + + + /* + PROPERTIES used within special modal (spatialUnitNotification component) + to show a customizable HTMLText only when user selects a certian spatial unit for any indicator + */ + window.__env.enableSpatialUnitNotificationSelection = false; // controls if a notification should be shown when selecting certain spatial units + window.__env.enableSpatialUnitNotificationButton = false; // enables button to manually open spatial unit notification + window.__env.spatialUnitNotificationSelection = ["Baublockebene"]; // unit(s) for which the notification is shown + window.__env.spatialUnitNotificationTitle = "Informationsverlust auf kleinräumigen Ebenen (Bau- und Mittelblock)"; // title of the notification window + window.__env.spatialUnitNotificationMessage = "Alle Daten, die im KomMonitor dargestellt werden, halten die statistische Geheimhaltung ein. Das bedeutet, dass Angaben zu einzelnen Personen nicht offengelegt werden, insbesondere auch, wenn aus aggregierten Werten Rückschlüsse zu Einzelangaben ermöglicht werden. Aus diesem Grund werden Indikatorenwerte, die in einem räumlichen Aggregat eine absolute Fallzahl von < 3 Einwohnern aufweisen, so behandelt, als hätten diese 0 Einwohner.\ + Diese Methode der statistischen Geheimhaltung kann zu einem teilweise hohen Informationsverlust auf kleinräumigen Ebenen führen. Stark differenzierte Indikatoren auf kleinräumigen Ebenen, die insgesamt nur wenige Fallzahlen aufweisen, könnten so an vielen Stellen entsprechend bereinigt worden seien und somit keine validen Werte liefern. \ + Dies lässt sich daran erkennen, dass die Fallzahlen insgesamt niedrig sind und viele Gebiete 0-Werte haben. Eine flächendeckendes Bild ist somit nicht möglich. \ + Dennoch bieten diese Indikatoren trotz ungenauer Wertedie Möglichkeit, „Hot-Spots“ und „Cluster“ der jeweiligen Indikatoren zu ermitteln. \ + Zahlen auf kleinräumige Ebenen sollten vor diesem Hintergrund vorsichtig und sorgfältig interpretiert werden."; // message shown when previous spatial unit is selected + + /* + PROPERTIES used within extended info modal (second tab) to show a customizable HTMLText + */ + window.__env.enableExtendedInfoModal = false; // controls if an extra tab should be shown in the info modal. + window.__env.standardInfoModalTabTitle = "Informationen zu KomMonitor" // title of the first tab + window.__env.extendedInfoModalTabTitle = "Weitere Informationen" // title of the second tab + window.__env.extendedInfoModalHTMLMessage = ""; // message in the second tab as HTML + + // property names of feature id and name (relevant for all spatial features) - KomMonitor specific + // DO NOT CHANGE THEM - ONLY IF YOU REALLY KNOW WHAT YOU ARE DOING + window.__env.FEATURE_ID_PROPERTY_NAME = "ID"; + window.__env.FEATURE_NAME_PROPERTY_NAME = "NAME"; + window.__env.VALID_START_DATE_PROPERTY_NAME = "validStartDate"; + window.__env.VALID_END_DATE_PROPERTY_NAME = "validEndDate"; + window.__env.indicatorDatePrefix = "DATE_"; + + // Data Management API URL + // window.__env.apiUrl = 'http://kommonitor.fbg-hsbo.de/'; + window.__env.apiUrl = 'http://localhost:8085/'; + // Base url for Data Management API + window.__env.basePath = 'management'; + + // Processing Engine URL + window.__env.targetUrlToProcessingEngine = 'http://localhost:8086/processing/'; + + // Open Route Service URL + window.__env.targetUrlToReachabilityService_ORS = 'https://ors5.fbg-hsbo.de'; + + // Open Trip Planner URL - currently not integrated + window.__env.targetUrlToReachabilityService_OTP = 'http://localhost:8090/opentripplanner'; + + // Data Imporret URL + window.__env.targetUrlToImporterService = 'http://localhost:8087/importer/'; + + // KomMonitor Geocoder Proxy + window.__env.targetUrlToGeocoderService = 'https://geocoder.fbg-hsbo.de/nominatim/'; + + // optional geometry simplification (a feature of Data Management API) + window.__env.simplifyGeometriesParameterName = "simplifyGeometries"; + // allowed values and meaning: + // ["original" --> no simplification; "weak" --> weak simplification, + // "medium" --> medium simplification; "strong" --> string simplification] + window.__env.simplifyGeometriesOptions = [{"label": "nein", "value": "original"}, {"label": "schwach", "value": "weak"}, {"label": "mittel", "value": "medium"}, {"label": "stark", "value": "strong"}]; + // use strong as default to minimize size of queried features + // for display, strong simplification is okay + window.__env.simplifyGeometries = "original"; + + // number of decimals for display of numeric values in app + window.__env.numberOfDecimals = 2; + + // starting viewpoint parameters and zoom level + window.__env.initialLatitude = 51.4386432; + window.__env.initialLongitude = 7.0115552; + window.__env.initialZoomLevel = 12; + // window.__env.minZoomLevel = 11; + window.__env.minZoomLevel = 5; + window.__env.maxZoomLevel = 18; + + window.__env.baseLayers = [ // baseLayers of instance; first will be set as default starting layer + // { + // name: "", // display name + // url: "", // URL to layer + // layerType: "TILE_LAYER", // TILE_LAYER | TILE_LAYER_GRAYSCALE | WMS + // layerName_WMS: "", // only relevant for layers of type WMS - multiple layers comma-separated + // attribution_html: "", // attribution info displayed at the bottom of the map as HTML string + // minZoomLevel: window.__env.minZoomLevel, // min zoom level for this layer (number between 1-20) + // maxZoomLevel: window.__env.maxZoomLevel // max zoom level for this layer (number between 1-20, greater than minZoomLevel) + // }, + { + name: "Open Street Map - Graustufen", + url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + layerType: "TILE_LAYER_GRAYSCALE", + layerName_WMS: "", + attribution_html: "Map data © OpenStreetMap contributors", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "Open Street Map - Farbe", + url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + layerType: "TILE_LAYER", + layerName_WMS: "", + attribution_html: "Map data © OpenStreetMap contributors", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "RVR Stadtplan - Farbe", + url: "https://geodaten.metropoleruhr.de/spw2?", + layerType: "WMS", + layerName_WMS: "stadtplan_rvr", + attribution_html: "Map data © https://geodaten.metropoleruhr.de", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "RVR Stadtplan - Graublau", + url: "https://geodaten.metropoleruhr.de/spw2?", + layerType: "WMS", + layerName_WMS: "spw2_graublau", + attribution_html: "Map data © https://geodaten.metropoleruhr.de", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "NRW Digitale Topographische Karte", + url: "https://www.wms.nrw.de/geobasis/wms_nw_dtk?", + layerType: "WMS", + layerName_WMS: "nw_dtk_sw", + attribution_html: "Map data © Geobasis NRW", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: 20 + }, + { + name: "NRW Digitale Orthophotos (Luftbilder)", + url: "https://www.wms.nrw.de/geobasis/wms_nw_dop?", + layerType: "WMS", + layerName_WMS: "nw_dop_rgb", + attribution_html: "Map data © Geobasis NRW", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "Stadt Essen - Automatisierte Liegenschaftskarte", + url: "https://geo.essen.de/arcgis/services/basemap/Stadtplanpaket_ALK_grau/MapServer/WMSServer?", + layerType: "WMS", + layerName_WMS: "0,1,2,3", + attribution_html: "Stadt Essen: Amt für Geoinformation, Vermessung und Kataster", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + }, + { + name: "Stadt Essen - Amtliche Basiskarte", + url: "https://geo.essen.de/arcgis/services/basemap/Uebersicht_ABK_Stadtgrundkarte/MapServer/WMSServer?", + layerType: "WMS", + layerName_WMS: "nw_dop_rgb", + attribution_html: "Stadt Essen: Amt für Geoinformation, Vermessung und Kataster", + minZoomLevel: window.__env.minZoomLevel, + maxZoomLevel: window.__env.maxZoomLevel + } + ]; + + + // starting indicator and spatial unit + // if faulty values are provided, a random indicator will be displayed + window.__env.initialIndicatorId = "48a18455-6a52-4e74-bdbf-99237187fc5c"; + window.__env.initialSpatialUnitName = "Stadtteilebene"; + + // various color settings + window.__env.defaultColorForNoDataValues = "rgba(255,255,255,0)"; + window.__env.defaultBorderColorForNoDataValues = "black"; + window.__env.defaultColorForOutliers_high = "#191919"; + window.__env.defaultBorderColorForOutliers_high = "black"; + window.__env.defaultFillOpacityForOutliers_high = "0.7"; + window.__env.defaultColorForOutliers_low = "#4f4f4f"; + window.__env.defaultBorderColorForOutliers_low = "black"; + window.__env.defaultFillOpacityForOutliers_low = "0.7"; + window.__env.defaultColorForHoveredFeatures = "#e01414"; + window.__env.defaultColorForClickedFeatures = "#42e5f4"; + window.__env.defaultColorForZeroValues = "#bababa"; + window.__env.defaultBorderColor = "black"; + window.__env.defaultColorForFilteredValues = "rgba(255,255,255,0)"; + window.__env.defaultBorderColorForFilteredValues = "black"; + window.__env.defaultFillOpacity = "0.7"; + window.__env.defaultFillOpacityForFilteredFeatures = "0.7"; + window.__env.defaultFillOpacityForZeroFeatures = "0.7"; + window.__env.defaultFillOpacityForNoDataFeatures = "0.7"; + window.__env.defaultFillOpacityForHighlightedFeatures = "0.8"; + window.__env.useTransparencyOnIndicator = true; + window.__env.useOutlierDetectionOnIndicator = true; + window.__env.classifyZeroSeparately = true; + window.__env.classifyUsingWholeTimeseries = true; + window.__env.useNoDataToggle = false; // true = hide no data values, false = show no data values + + // default color for specific classification as ColorBrewer palette name + // i.e. balance mode + // i.e. measure of value classification (German: Schwellwertklassifizierung) + window.__env.defaultColorBrewerPaletteForBalanceIncreasingValues = "Purples"; + window.__env.defaultColorBrewerPaletteForBalanceDecreasingValues = "YlOrBr"; + window.__env.defaultColorBrewerPaletteForGtMovValues = "YlOrBr"; + window.__env.defaultColorBrewerPaletteForLtMovValues = "Blues"; + + // classification + //allowesValues: equal_interval, quantile, jenks + window.__env.defaultClassifyMethod = "equal_interval"; + + // array of indicator name substring that shal be used to filter out / hide certain indicators by their name + // e.g. set ["entwicklung"] to hide all indicators whose name contains the substring "entwicklung" + window.__env.arrayOfNameSubstringsForHidingIndicators = []; + // window.__env.arrayOfNameSubstringsForHidingIndicators = []; + + window.__env.arrayOfNameSubstringsForHidingGeoresources = []; + + // e-mail recipient for feedback mail + window.__env.feedbackMailRecipient = "christian.danowski-buhren@hochschule-bochum.de"; + // window.__env.feedbackMailRecipient = "christian.danowski-buhren@hs-bochum.de"; + + // config array of available options for choosing update interval of indicators + window.__env.updateIntervalOptions = [ + { + displayName: "jährlich", + apiName: "YEARLY" + }, + { + displayName: "halbjährlich", + apiName: "HALF_YEARLY" + }, + { + displayName: "vierteljährlich", + apiName: "QUARTERLY" + }, + { + displayName: "monatlich", + apiName: "MONTHLY" + }, + { + displayName: "wöchentlich", + apiName: "WEEKLY" + }, + { + displayName: "täglich", + apiName: "DAILY" + }, + { + displayName: "beliebig", + apiName: "ARBITRARY" + } + ]; + + // config array of available options for choosing creation type of indicators + window.__env.indicatorCreationTypeOptions = [ + { + displayName: "manuell", + apiName: "INSERTION" + }, + { + displayName: "automatisierte Berechnung durch KomMonitor", + apiName: "COMPUTATION" + } + ]; + + // config array of available options for choosing indicator's unit + window.__env.indicatorUnitOptions = [ "Anzahl", "Anteil", "Prozent", "Einwohner", "m", "m²", "km", "km²", "ha", "dimensionslos", "standardisiert", "z-transformierte Werte" + ]; + + // config array of available options for choosing indicator type of indicators + window.__env.indicatorTypeOptions = [ + { + displayName: "Status-Indikator (absolut)", + apiName: "STATUS_ABSOLUTE" + }, + { + displayName: "Status-Indikator (relativ)", + apiName: "STATUS_RELATIVE" + }, + { + displayName: "Dynamik-Indikator (absolut)", + apiName: "DYNAMIC_ABSOLUTE" + }, + { + displayName: "Dynamik-Indikator (relativ)", + apiName: "DYNAMIC_RELATIVE" + }, + { + displayName: "Status-Indikator (standardisiert)", + apiName: "STATUS_STANDARDIZED" + }, + { + displayName: "Dynamik-Indikator (standardisiert)", + apiName: "DYNAMIC_STANDARDIZED" + } + + ]; + + // array of available WMS datasets + window.__env.wmsDatasets = [ + // { + // title: "Title of WMS dataset", + // description: "Description as HTML code (HTML tags allowed)", + // url: "URL including '?' as last character (i.e. https://wms.example/myWMS)", + // topicReference: "3af3b65e-4792-4998-8531-54616564b5bc", // id of georesource topic to hang in the WMS entry + // layerName:"laerm" // name of WMS layer to display + // }, + { + title: "Lärmkartierung - Test", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "3af3b65e-4792-4998-8531-54616564b5bc", + layerName:"laerm" + }, + { + title: "Unfalldaten 2019", + description: "Unfalldaten des statistischen Bundesamtes
        ", + url: "https://www.wms.nrw.de/wms/unfallatlas?", + topicReference: "7255b83f-feb0-4f01-9dc1-6b355447206d", + layerName:"Unfallorte_2019" + }, + { + title: "Lärmkartierung - Flugverkehr 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "FLG_DEN" + }, + { + title: "Lärmkartierung - Flugverkehr Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "FLG_NGT" + }, + { + title: "Lärmkartierung - Industrie 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "IND_DEN" + }, + { + title: "Lärmkartierung - Industrie Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "IND_NGT" + }, + { + title: "Lärmkartierung - Straße 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "STR_DEN" + }, + { + title: "Lärmkartierung - Straße Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "STR_NGT" + }, + { + title: "Lärmkartierung - Schiene sonstige 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "SCS_DEN" + }, + { + title: "Lärmkartierung - Schiene sonstige Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "SCS_NGT" + }, + { + title: "Lärmkartierung - Schiene Bund 24h-Pegel LDEN", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "SCB_DEN" + }, + { + title: "Lärmkartierung - Schiene Bund Nachtpegel LNight", + description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + url: "https://www.wms.nrw.de/umwelt/laerm?", + topicReference: "e94c8100-3790-4ddd-b977-fe48b4f93e26", + layerName: "SCB_NGT" + }, + // { + // title: "Lärmkartierung - Gebaeude", + // description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + // url: "https://www.wms.nrw.de/umwelt/laerm?", + // layerName: "Gebaeude" + // }, + // { + // title: "Lärmkartierung - Modell", + // description: "Veröffentlichung der Lärmkarten gemäß Lärmkartierung nach Richtlinie 2002/49/EG - EU-Umgebungslärmrichtlinie

        Maßstabsabhängige Darstellung - ggf. zoomen erforderlich", + // url: "https://www.wms.nrw.de/umwelt/laerm?", + // layerName: "Modell" + // }, + { + title: "Versiegelungsgrad - 2006 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2006/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - 2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2009/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - 2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_Imperviousness_Density_2012/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "Imperviousness density 2012 20m" + }, + { + title: "Versiegelungsgrad - 2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessDensity_2015/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Veränderung 2006-2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_06_09/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Veränderung 2009-2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_09_12/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "Imperviousness density change 09-12 20m" + }, + { + title: "Versiegelungsgrad - Veränderung 2012-2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_12_15/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Klassifizierte Veränderung 2006-2009 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessClassifiedChange_06_09/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Klassifizierte Veränderung 2009-2012 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessClassifiedChange_09_12/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Versiegelungsgrad - Klassifizierte Veränderung 2012-2015 anhand von Copernicus Satellitendaten - 20m Rasterzellen", + description: "Mehr Informationen unter https://land.copernicus.eu/pan-european/high-resolution-layers/imperviousness", + url: "https://image.discomap.eea.europa.eu/arcgis/services/GioLandPublic/HRL_ImperviousnessChange_12_15/MapServer/WMSServer?", + topicReference: "c46ecf8b-3f77-4be6-9ec1-851dc48e3eb8", + layerName: "0" + }, + { + title: "Bodennutzung - Bebauungsplanumringe", + description: "Umringe der Bebauungspläne gemäß geodaten.metropoleruhr.de", + url: "https://geodaten.metropoleruhr.de/inspire/bodennutzung/metropoleruhr?", + topicReference: null, + layerName: "bplan" + } + ]; + + // array if available WFS datasets + window.__env.wfsDatasets = [ + // { + // title: "Title of dataset", + // description: "Description as HTML code (HTML tags allowed)", + // url: "URL of dataset including '?' as last character (i.e. https://wfs.example/myWfS?)", + // featureTypeNamespace: "namespace of featureType", + // featureTypeName: "name of featureType", // // check GetCapabilities Response + // featureTypeGeometryName: "name of geometry property of feature type", // check DescribeFeature Response + // geometryType: "AOI", // POI|LOI|AOI + // poiSymbolColor: "white", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] + // poiMarkerColor: "red", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] + // poiSymbolBootstrap3Name: "home", + // loiColor: "#00aabb", // color for LOI datasets + // loiWidth: 3, // 1 - 5 + // loiDashArrayString: "", // e.g. "20, 20" for equal dash/space visuals + // aoiColor: "#00aabb", // color for AOI datasets + // filterFeaturesToMapBBOX: false, // applies BBOX filter to WFS request - if not supported by WFS may lead to error + // filterEncoding: { // only one filter is currently implemented (PropertyIsEqualTo) + // // PropertyIsEqualTo: { + // // propertyName: undefined, // name of property + // // propertyValue: undefined // value of property + // // } + // }, + // topicReference: "c712af89-ff11-40ff-ad84-b3592901e085" // id of georesource topic entry which shall be used to display the WFS dataset entry + // }, + { + title: "Bodennutzung - Bebauungsplanumringe", + description: "Umringe der Bebauungspläne gemäß geodaten.metropoleruhr.de. WFS-Dienst unterstützt keine räumllichen Filter. Daher müssen zwingend alle Features abgerufen werden.", + url: "https://geodaten.metropoleruhr.de/inspire/bodennutzung/metropoleruhr?", + featureTypeNamespace: "ms", + featureTypeName: "bplan_stand", + featureTypeGeometryName: "geom", + geometryType: "AOI", // POI|LOI|AOI + poiSymbolColor: "white", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] + poiMarkerColor: "red", // ['white', 'red', 'orange', 'beige', 'green', 'blue', 'purple', 'pink', 'gray', 'black'] + poiSymbolBootstrap3Name: "home", + loiColor: "#00aabb", + loiWidth: 3, + loiDashArrayString: "", + aoiColor: "#00aabb", + filterFeaturesToMapBBOX: false, + filterEncoding: { + // PropertyIsEqualTo: { + // propertyName: undefined, + // propertyValue: undefined + // } + }, + topicReference: "c712af89-ff11-40ff-ad84-b3592901e085" + } + ]; + +} catch (error) { + console.error("Error while evaluating app config. Error is: \n" + error); +} \ No newline at end of file diff --git a/app/index.html b/app/index.html index 2b09e77c0..b4a26234b 100644 --- a/app/index.html +++ b/app/index.html @@ -12,7 +12,10 @@ KomMonitor + content="Kommunales Raumbeobachtungssystem"> + + + @@ -331,7 +334,7 @@ - + diff --git a/app/kommonitor-script-resources/km_georesource_miscStatistics.js b/app/kommonitor-script-resources/km_georesource_miscStatistics.js index 0e16c2f12..c7576431c 100644 --- a/app/kommonitor-script-resources/km_georesource_miscStatistics.js +++ b/app/kommonitor-script-resources/km_georesource_miscStatistics.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -37,7 +33,6 @@ const aggregationType = "SUM"; const computationGeoresourceId_name = "compGeoId"; const computationProperty_name = "compProp"; const computationMethod_name = "compMeth"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -55,74 +50,62 @@ const computationMethod_name = "compMeth"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - // compute indicator for targetDate and targetSpatialUnitFeatures - - // retrieve required georesource using its meaningful name - var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters); - var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); - var computationProperty = KmHelper.getProcessParameterByName_asString(computationProperty_name, processParameters); - var computationMethod = KmHelper.getProcessParameterByName_asString(computationMethod_name, processParameters); - - // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset - computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); - -KmHelper.log("calculating spatial within check between points and target spatial unit."); - -// create progress log after each 10th percent of features -var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); - - for (var featureIndex=0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++){ - var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; - // initialize indicatorValue - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); - - var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); - if(pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0){ - var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationProperty); - - // make sure that each value of valueArray is numeric! - for (var k=0; k < valueArray.length; k++){ - valueArray[k] = Number(valueArray[k]); - } - switch (computationMethod) { - case ("SUM"): - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.sum(valueArray)); - break; - case ("MIN"): - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.min(valueArray)); - break; - case ("MAX"): - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.max(valueArray)); - break; - case ("MEAN"): - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.mean(valueArray)); - break; - case ("MEDIAN"): - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.median(valueArray)); - break; - case ("STANDARD_DEVIATION"): - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.standardDeviation(valueArray)); - break; - default: - KmHelper.log("Indicator was not computed from computation resources because no valid computation method was chosen. Indicator value is set to null."); - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); - break; - } - } - - if(featureIndex % logProgressIndexSeparator === 0){ - KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); - } +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + // compute indicator for targetDate and targetSpatialUnitFeatures + // retrieve required georesource using its meaningful name + var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters); + var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); + var computationProperty = KmHelper.getProcessParameterByName_asString(computationProperty_name, processParameters); + var computationMethod = KmHelper.getProcessParameterByName_asString(computationMethod_name, processParameters); + // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset + computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); + KmHelper.log("calculating spatial within check between points and target spatial unit."); + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); + for (var featureIndex = 0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++) { + var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; + // initialize indicatorValue + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); + if (pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0) { + var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationProperty); + // make sure that each value of valueArray is numeric! + for (var k = 0; k < valueArray.length; k++) { + valueArray[k] = Number(valueArray[k]); + } + switch (computationMethod) { + case ("SUM"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.sum(valueArray)); + break; + case ("MIN"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.min(valueArray)); + break; + case ("MAX"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.max(valueArray)); + break; + case ("MEAN"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.mean(valueArray)); + break; + case ("MEDIAN"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.median(valueArray)); + break; + case ("STANDARD_DEVIATION"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.standardDeviation(valueArray)); + break; + default: + KmHelper.log("Indicator was not computed from computation resources because no valid computation method was chosen. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + break; + } + } + if (featureIndex % logProgressIndexSeparator === 0) { + KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); + } } - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - - - + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -138,22 +121,22 @@ var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.le * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -164,12 +147,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -183,74 +164,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -264,59 +231,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_georesource_miscStatistics.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_georesource_miscStatistics.js.map b/app/kommonitor-script-resources/km_georesource_miscStatistics.js.map new file mode 100644 index 000000000..b1cd769fc --- /dev/null +++ b/app/kommonitor-script-resources/km_georesource_miscStatistics.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_georesource_miscStatistics.js","sourceRoot":"","sources":["km_georesource_miscStatistics.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_georesource_miscStatistics.ts b/app/kommonitor-script-resources/km_georesource_miscStatistics.ts new file mode 100644 index 000000000..0e16c2f12 --- /dev/null +++ b/app/kommonitor-script-resources/km_georesource_miscStatistics.ts @@ -0,0 +1,322 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; +const computationGeoresourceId_name = "compGeoId"; +const computationProperty_name = "compProp"; +const computationMethod_name = "compMeth"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + // compute indicator for targetDate and targetSpatialUnitFeatures + + // retrieve required georesource using its meaningful name + var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters); + var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); + var computationProperty = KmHelper.getProcessParameterByName_asString(computationProperty_name, processParameters); + var computationMethod = KmHelper.getProcessParameterByName_asString(computationMethod_name, processParameters); + + // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset + computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); + +KmHelper.log("calculating spatial within check between points and target spatial unit."); + +// create progress log after each 10th percent of features +var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); + + for (var featureIndex=0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++){ + var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; + // initialize indicatorValue + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + + var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); + if(pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0){ + var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationProperty); + + // make sure that each value of valueArray is numeric! + for (var k=0; k < valueArray.length; k++){ + valueArray[k] = Number(valueArray[k]); + } + switch (computationMethod) { + case ("SUM"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.sum(valueArray)); + break; + case ("MIN"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.min(valueArray)); + break; + case ("MAX"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.max(valueArray)); + break; + case ("MEAN"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.mean(valueArray)); + break; + case ("MEDIAN"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.median(valueArray)); + break; + case ("STANDARD_DEVIATION"): + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, KmHelper.standardDeviation(valueArray)); + break; + default: + KmHelper.log("Indicator was not computed from computation resources because no valid computation method was chosen. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + break; + } + } + + if(featureIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); + } + } + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + + + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.js b/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.js index 71188f804..5574eff2d 100644 --- a/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.js +++ b/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -37,8 +33,6 @@ const aggregationType = "SUM"; const computationFilterProperty_name = "compFilterProp"; const computationFilterOperator_name = "compFilterOperator"; const computationFilterPropertyValue_name = "compFilterPropVal"; - - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -56,109 +50,97 @@ const computationFilterPropertyValue_name = "compFilterPropVal"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - // compute indicator for targetDate and targetSpatialUnitFeatures - var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters) - // retrieve required baseIndicator using its meaningful name - var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); - // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset - computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); - // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource - var computationFilterProperty; - var computationFilterOperator; - var computationFilterPropertyValue; - var parameter = undefined; - - processParameters.forEach(function(property){ - if(property.name === computationFilterProperty_name){ - parameter = property.value; - } - }); - - if(parameter === undefined) { - computationFilterProperty = undefined; - computationFilterOperator = undefined; - computationFilterPropertyValue = undefined; - } - else { - computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); - computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); - computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); - } - - KmHelper.log("calculating spatial within check between points and target spatial unit."); - - - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); - - for (var featureIndex=0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++){ - var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; - // initialize indicatorValue - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); - - var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); - if(pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0){ - if (computationFilterProperty !== undefined) { - var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationFilterProperty); - var filteredArray = []; - switch (computationFilterOperator) { - case ("Equal"): - filteredArray = valueArray.filter(item => item === computationFilterPropertyValue); - break; - case ("Greater_than"): - filteredArray = valueArray.filter(item => item > computationFilterPropertyValue); - break; - case ("Greater_than_or_equal"): - filteredArray = valueArray.filter(item => item >= computationFilterPropertyValue); - break; - case ("Less_than"): - filteredArray = valueArray.filter(item => item < computationFilterPropertyValue); - break; - case ("Less_than_or_equal"): - filteredArray = valueArray.filter(item => item <= computationFilterPropertyValue); - break; - case ("Unequal"): - filteredArray = valueArray.filter(item => item !== computationFilterPropertyValue); - break; - case ("Contains"): - var computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); - for (let i=0; i item === trimmedElement); - filteredArray = filteredArray.concat(tmp); - } - break; - case ("Range"): - var computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); - filteredArray = valueArray.filter(item => item >= computationFilterPropertyValueArray[0] && item < computationFilterPropertyValueArray[1]); - break; - default: - KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); - break; - } - var share = filteredArray.length / valueArray.length * 100; - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, share); - } - else { - KmHelper.log("Indicator was not computed from computation resources because no valid filter has been defined. Indicator value is set to null."); - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); - } - } - - } - - if(featureIndex % logProgressIndexSeparator === 0){ - KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); - } +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + // compute indicator for targetDate and targetSpatialUnitFeatures + var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters); + // retrieve required baseIndicator using its meaningful name + var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); + // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset + computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); + // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource + var computationFilterProperty; + var computationFilterOperator; + var computationFilterPropertyValue; + var parameter = undefined; + processParameters.forEach(function (property) { + if (property.name === computationFilterProperty_name) { + parameter = property.value; + } + }); + if (parameter === undefined) { + computationFilterProperty = undefined; + computationFilterOperator = undefined; + computationFilterPropertyValue = undefined; + } + else { + computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); + computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); + computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); } - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + KmHelper.log("calculating spatial within check between points and target spatial unit."); + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); + for (var featureIndex = 0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++) { + var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; + // initialize indicatorValue + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); + if (pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0) { + if (computationFilterProperty !== undefined) { + var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationFilterProperty); + var filteredArray = []; + switch (computationFilterOperator) { + case ("Equal"): + filteredArray = valueArray.filter(item => item === computationFilterPropertyValue); + break; + case ("Greater_than"): + filteredArray = valueArray.filter(item => item > computationFilterPropertyValue); + break; + case ("Greater_than_or_equal"): + filteredArray = valueArray.filter(item => item >= computationFilterPropertyValue); + break; + case ("Less_than"): + filteredArray = valueArray.filter(item => item < computationFilterPropertyValue); + break; + case ("Less_than_or_equal"): + filteredArray = valueArray.filter(item => item <= computationFilterPropertyValue); + break; + case ("Unequal"): + filteredArray = valueArray.filter(item => item !== computationFilterPropertyValue); + break; + case ("Contains"): + var computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); + for (let i = 0; i < computationFilterPropertyValueArray.length; i++) { + let trimmedElement = computationFilterPropertyValueArray[i].trim(); + let tmp = valueArray.filter(item => item === trimmedElement); + filteredArray = filteredArray.concat(tmp); + } + break; + case ("Range"): + var computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); + filteredArray = valueArray.filter(item => item >= computationFilterPropertyValueArray[0] && item < computationFilterPropertyValueArray[1]); + break; + default: + KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + break; + } + var share = filteredArray.length / valueArray.length * 100; + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, share); + } + else { + KmHelper.log("Indicator was not computed from computation resources because no valid filter has been defined. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + } + } + if (featureIndex % logProgressIndexSeparator === 0) { + KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); + } + } + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -174,22 +156,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -200,12 +182,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -219,74 +199,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -300,59 +266,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_georesource_share_byPropertyValue.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.js.map b/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.js.map new file mode 100644 index 000000000..f54d54557 --- /dev/null +++ b/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_georesource_share_byPropertyValue.js","sourceRoot":"","sources":["km_georesource_share_byPropertyValue.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.ts b/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.ts new file mode 100644 index 000000000..fe2d4a312 --- /dev/null +++ b/app/kommonitor-script-resources/km_georesource_share_byPropertyValue.ts @@ -0,0 +1,358 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; +const computationFilterProperty_name = "compFilterProp"; +const computationFilterOperator_name = "compFilterOperator"; +const computationFilterPropertyValue_name = "compFilterPropVal"; + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + // compute indicator for targetDate and targetSpatialUnitFeatures + var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters) + // retrieve required baseIndicator using its meaningful name + var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); + // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset + computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); + // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource + var computationFilterProperty; + var computationFilterOperator; + var computationFilterPropertyValue; + var parameter = undefined; + + processParameters.forEach(function(property){ + if(property.name === computationFilterProperty_name){ + parameter = property.value; + } + }); + + if(parameter === undefined) { + computationFilterProperty = undefined; + computationFilterOperator = undefined; + computationFilterPropertyValue = undefined; + } + else { + computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); + computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); + computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); + } + + KmHelper.log("calculating spatial within check between points and target spatial unit."); + + + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); + + for (var featureIndex=0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++){ + var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; + // initialize indicatorValue + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + + var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); + if(pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0){ + if (computationFilterProperty !== undefined) { + var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationFilterProperty); + var filteredArray = []; + switch (computationFilterOperator) { + case ("Equal"): + filteredArray = valueArray.filter(item => item === computationFilterPropertyValue); + break; + case ("Greater_than"): + filteredArray = valueArray.filter(item => item > computationFilterPropertyValue); + break; + case ("Greater_than_or_equal"): + filteredArray = valueArray.filter(item => item >= computationFilterPropertyValue); + break; + case ("Less_than"): + filteredArray = valueArray.filter(item => item < computationFilterPropertyValue); + break; + case ("Less_than_or_equal"): + filteredArray = valueArray.filter(item => item <= computationFilterPropertyValue); + break; + case ("Unequal"): + filteredArray = valueArray.filter(item => item !== computationFilterPropertyValue); + break; + case ("Contains"): + var computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); + for (let i=0; i item === trimmedElement); + filteredArray = filteredArray.concat(tmp); + } + break; + case ("Range"): + var computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); + filteredArray = valueArray.filter(item => item >= computationFilterPropertyValueArray[0] && item < computationFilterPropertyValueArray[1]); + break; + default: + KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + break; + } + var share = filteredArray.length / valueArray.length * 100; + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, share); + } + else { + KmHelper.log("Indicator was not computed from computation resources because no valid filter has been defined. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + } + } + + + + if(featureIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); + } + } + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js b/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js index 9c6908178..c676cc9d0 100644 --- a/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js +++ b/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -38,7 +34,6 @@ const computationGeoresourceId_name = "compGeoId"; const computationFilterProperty_name = "compFilterProp"; const computationFilterOperator_name = "compFilterOperator"; const computationFilterPropertyValue_name = "compFilterPropVal"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -56,104 +51,95 @@ const computationFilterPropertyValue_name = "compFilterPropVal"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - // compute indicator for targetDate and targetSpatialUnitFeatures - var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters) - // retrieve required baseIndicator using its meaningful name - var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); - // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset - computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); - // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource - var computationFilterProperty; - var computationFilterOperator; - var computationFilterPropertyValue; - var parameter = undefined; - - processParameters.forEach(function(property){ - if(property.name === computationFilterProperty_name){ - parameter = property.value; +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + // compute indicator for targetDate and targetSpatialUnitFeatures + var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters); + // retrieve required baseIndicator using its meaningful name + var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); + // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset + computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); + // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource + var computationFilterProperty; + var computationFilterOperator; + var computationFilterPropertyValue; + var parameter = undefined; + processParameters.forEach(function (property) { + if (property.name === computationFilterProperty_name) { + parameter = property.value; + } + }); + if (parameter === undefined) { + computationFilterProperty = undefined; + computationFilterOperator = undefined; + computationFilterPropertyValue = undefined; + } + else { + computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); + computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); + computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); } - }); - - if(parameter === undefined) { - computationFilterProperty = undefined; - computationFilterOperator = undefined; - computationFilterPropertyValue = undefined; - } - else { - computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); - computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); - computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); - } - -KmHelper.log("calculating spatial within check between points and target spatial unit."); - -// create progress log after each 10th percent of features -var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); - - for (var featureIndex=0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++){ - var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; - // initialize indicatorValue - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); - - var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); - if(pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0){ - if (computationFilterProperty !== undefined) { - var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationFilterProperty); - var filteredArray = []; - switch (computationFilterOperator) { - case ("Equal"): - filteredArray = valueArray.filter(item => item === computationFilterPropertyValue); - break; - case ("Greater_than"): - filteredArray = valueArray.filter(item => item > computationFilterPropertyValue); - break; - case ("Greater_than_or_equal"): - filteredArray = valueArray.filter(item => item >= computationFilterPropertyValue); - break; - case ("Less_than"): - filteredArray = valueArray.filter(item => item < computationFilterPropertyValue); - break; - case ("Less_than_or_equal"): - filteredArray = valueArray.filter(item => item <= computationFilterPropertyValue); - break; - case ("Unequal"): - filteredArray = valueArray.filter(item => item !== computationFilterPropertyValue); - break; - case ("Contains"): - var computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); - for (let i=0; i item === trimmedElement); - filteredArray = filteredArray.concat(tmp); - } - break; - case ("Range"): - var computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); - filteredArray = valueArray.filter(item => item >= computationFilterPropertyValueArray[0] && item < computationFilterPropertyValueArray[1]); - break; - default: - KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); - break; - } - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, filteredArray.length); + KmHelper.log("calculating spatial within check between points and target spatial unit."); + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); + for (var featureIndex = 0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++) { + var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; + // initialize indicatorValue + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); + if (pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0) { + if (computationFilterProperty !== undefined) { + var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationFilterProperty); + var filteredArray = []; + switch (computationFilterOperator) { + case ("Equal"): + filteredArray = valueArray.filter(item => item === computationFilterPropertyValue); + break; + case ("Greater_than"): + filteredArray = valueArray.filter(item => item > computationFilterPropertyValue); + break; + case ("Greater_than_or_equal"): + filteredArray = valueArray.filter(item => item >= computationFilterPropertyValue); + break; + case ("Less_than"): + filteredArray = valueArray.filter(item => item < computationFilterPropertyValue); + break; + case ("Less_than_or_equal"): + filteredArray = valueArray.filter(item => item <= computationFilterPropertyValue); + break; + case ("Unequal"): + filteredArray = valueArray.filter(item => item !== computationFilterPropertyValue); + break; + case ("Contains"): + var computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); + for (let i = 0; i < computationFilterPropertyValueArray.length; i++) { + let trimmedElement = computationFilterPropertyValueArray[i].trim(); + let tmp = valueArray.filter(item => item === trimmedElement); + filteredArray = filteredArray.concat(tmp); + } + break; + case ("Range"): + var computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); + filteredArray = valueArray.filter(item => item >= computationFilterPropertyValueArray[0] && item < computationFilterPropertyValueArray[1]); + break; + default: + KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + break; + } + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, filteredArray.length); + } + else { + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, pointsWithinFeature.features.length); + } + } + if (featureIndex % logProgressIndexSeparator === 0) { + KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); } - else { - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, pointsWithinFeature.features.length); - } - } - - if(featureIndex % logProgressIndexSeparator === 0){ - KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); - } } - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -169,22 +155,22 @@ var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.le * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -195,12 +181,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -214,74 +198,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -295,59 +265,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_georessouce_count_pointsWithinPolygon.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js.map b/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js.map new file mode 100644 index 000000000..7f0e6d42d --- /dev/null +++ b/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_georessouce_count_pointsWithinPolygon.js","sourceRoot":"","sources":["km_georessouce_count_pointsWithinPolygon.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.ts b/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.ts new file mode 100644 index 000000000..9c6908178 --- /dev/null +++ b/app/kommonitor-script-resources/km_georessouce_count_pointsWithinPolygon.ts @@ -0,0 +1,353 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; +const computationGeoresourceId_name = "compGeoId"; +const computationFilterProperty_name = "compFilterProp"; +const computationFilterOperator_name = "compFilterOperator"; +const computationFilterPropertyValue_name = "compFilterPropVal"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + // compute indicator for targetDate and targetSpatialUnitFeatures + var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters) + // retrieve required baseIndicator using its meaningful name + var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); + // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset + computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); + // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource + var computationFilterProperty; + var computationFilterOperator; + var computationFilterPropertyValue; + var parameter = undefined; + + processParameters.forEach(function(property){ + if(property.name === computationFilterProperty_name){ + parameter = property.value; + } + }); + + if(parameter === undefined) { + computationFilterProperty = undefined; + computationFilterOperator = undefined; + computationFilterPropertyValue = undefined; + } + else { + computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); + computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); + computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); + } + +KmHelper.log("calculating spatial within check between points and target spatial unit."); + +// create progress log after each 10th percent of features +var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); + + for (var featureIndex=0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++){ + var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; + // initialize indicatorValue + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + + var pointsWithinFeature = KmHelper.pointsWithinPolygon(computationGeoresource, spatialUnitFeat); + if(pointsWithinFeature && pointsWithinFeature.features && pointsWithinFeature.features.length > 0){ + if (computationFilterProperty !== undefined) { + var valueArray = KmHelper.getPropertyValueArray(pointsWithinFeature, computationFilterProperty); + var filteredArray = []; + switch (computationFilterOperator) { + case ("Equal"): + filteredArray = valueArray.filter(item => item === computationFilterPropertyValue); + break; + case ("Greater_than"): + filteredArray = valueArray.filter(item => item > computationFilterPropertyValue); + break; + case ("Greater_than_or_equal"): + filteredArray = valueArray.filter(item => item >= computationFilterPropertyValue); + break; + case ("Less_than"): + filteredArray = valueArray.filter(item => item < computationFilterPropertyValue); + break; + case ("Less_than_or_equal"): + filteredArray = valueArray.filter(item => item <= computationFilterPropertyValue); + break; + case ("Unequal"): + filteredArray = valueArray.filter(item => item !== computationFilterPropertyValue); + break; + case ("Contains"): + var computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); + for (let i=0; i item === trimmedElement); + filteredArray = filteredArray.concat(tmp); + } + break; + case ("Range"): + var computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); + filteredArray = valueArray.filter(item => item >= computationFilterPropertyValueArray[0] && item < computationFilterPropertyValueArray[1]); + break; + default: + KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + break; + } + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, filteredArray.length); + } + else { + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, pointsWithinFeature.features.length); + } + } + + if(featureIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to point features."); + } + } + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js b/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js index 30310ada6..a125fabce 100644 --- a/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js +++ b/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js @@ -1,22 +1,19 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); const turf = require('@turf/turf'); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -26,7 +23,6 @@ const turf = require('@turf/turf'); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -39,8 +35,6 @@ const computationGeoresourceId_name = "compGeoId"; const computationFilterProperty_name = "compFilterProp"; const computationFilterOperator_name = "compFilterOperator"; const computationFilterPropertyValue_name = "compFilterPropVal"; - - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -58,128 +52,120 @@ const computationFilterPropertyValue_name = "compFilterPropVal"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - // compute indicator for targetDate and targetSpatialUnitFeatures - var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters); - // retrieve required baseIndicator using its meaningful name - var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); - // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset - computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); - // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource - var computationFilterProperty; - var computationFilterOperator; - var computationFilterPropertyValue; - var parameter = undefined; - - processParameters.forEach(function(property){ - if(property.name === computationFilterProperty_name){ - parameter = property.value; +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + // compute indicator for targetDate and targetSpatialUnitFeatures + var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters); + // retrieve required baseIndicator using its meaningful name + var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); + // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset + computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); + // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource + var computationFilterProperty; + var computationFilterOperator; + var computationFilterPropertyValue; + var parameter = undefined; + processParameters.forEach(function (property) { + if (property.name === computationFilterProperty_name) { + parameter = property.value; + } + }); + if (parameter === undefined) { + computationFilterProperty = undefined; + computationFilterOperator = undefined; + computationFilterPropertyValue = undefined; } - }); - - if(parameter === undefined) { - computationFilterProperty = undefined; - computationFilterOperator = undefined; - computationFilterPropertyValue = undefined; - } - else { - computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); - computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); - computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); - } - - KmHelper.log("calculating spatial intersection and within check between lines and target spatial unit."); - - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); - - for (var featureIndex=0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++){ - var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; - // initialize indicatorValue - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); - computationGeoresource = KmHelper.transformMultiLineStringToLineStrings(computationGeoresource); - var linesWithinFeature = KmHelper.intersectLineFeatureCollectionByPolygonFeature(computationGeoresource, spatialUnitFeat); - if(linesWithinFeature && linesWithinFeature.features && linesWithinFeature.features.length > 0){ - var lineSegmentsLengthSum; - if (computationFilterProperty !== undefined) { - var filteredLineFeatures = []; - linesWithinFeature.features.forEach(function (line) { - var computationFilterPropertyValueArray; - switch (computationFilterOperator) { - case ("Equal"): - if (line.properties[computationFilterProperty] === computationFilterPropertyValue) { - filteredLineFeatures.push(line); - } - break; - case ("Greater_than"): - if (line.properties[computationFilterProperty] > computationFilterPropertyValue) { - filteredLineFeatures.push(line); - } - break; - case ("Greater_than_or_equal"): - if (line.properties[computationFilterProperty] >= computationFilterPropertyValue) { - filteredLineFeatures.push(line); - } - break; - case ("Less_than"): - if (line.properties[computationFilterProperty] < computationFilterPropertyValue) { - filteredLineFeatures.push(line); - } - break; - case ("Less_than_or_equal"): - if (line.properties[computationFilterProperty] <= computationFilterPropertyValue) { - filteredLineFeatures.push(line); - } - break; - case ("Unequal"): - if (line.properties[computationFilterProperty] !== computationFilterPropertyValue) { - filteredLineFeatures.push(line); - } - break; - case ("Contains"): - computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); - for (let i = 0; i < computationFilterPropertyValueArray.length; i++) { - let trimmedElement = computationFilterPropertyValueArray[i].trim(); - if (line.properties[computationFilterProperty] === trimmedElement) { - filteredLineFeatures.push(line); - } + else { + computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); + computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); + computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); + } + KmHelper.log("calculating spatial intersection and within check between lines and target spatial unit."); + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); + for (var featureIndex = 0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++) { + var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; + // initialize indicatorValue + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + computationGeoresource = KmHelper.transformMultiLineStringToLineStrings(computationGeoresource); + var linesWithinFeature = KmHelper.intersectLineFeatureCollectionByPolygonFeature(computationGeoresource, spatialUnitFeat); + if (linesWithinFeature && linesWithinFeature.features && linesWithinFeature.features.length > 0) { + var lineSegmentsLengthSum; + if (computationFilterProperty !== undefined) { + var filteredLineFeatures = []; + linesWithinFeature.features.forEach(function (line) { + var computationFilterPropertyValueArray; + switch (computationFilterOperator) { + case ("Equal"): + if (line.properties[computationFilterProperty] === computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Greater_than"): + if (line.properties[computationFilterProperty] > computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Greater_than_or_equal"): + if (line.properties[computationFilterProperty] >= computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Less_than"): + if (line.properties[computationFilterProperty] < computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Less_than_or_equal"): + if (line.properties[computationFilterProperty] <= computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Unequal"): + if (line.properties[computationFilterProperty] !== computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Contains"): + computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); + for (let i = 0; i < computationFilterPropertyValueArray.length; i++) { + let trimmedElement = computationFilterPropertyValueArray[i].trim(); + if (line.properties[computationFilterProperty] === trimmedElement) { + filteredLineFeatures.push(line); + } + } + break; + case ("Range"): + computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); + if (line.properties[computationFilterProperty] >= computationFilterPropertyValueArray[0] && line.properties[computationFilterProperty] < computationFilterPropertyValueArray[1]) { + filteredLineFeatures.push(line); + } + break; + default: + KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + break; + } + }); + if (filteredLineFeatures.length === 0) { + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); } - break; - case ("Range"): - computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); - if (line.properties[computationFilterProperty] >= computationFilterPropertyValueArray[0] && line.properties[computationFilterProperty] < computationFilterPropertyValueArray[1]) { - filteredLineFeatures.push(line); + else { + lineSegmentsLengthSum = KmHelper.summarizeLineSegmentLengths(KmHelper.asFeatureCollection(filteredLineFeatures)); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, lineSegmentsLengthSum); } - break; - default: - KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); - break; } - }); - if (filteredLineFeatures.length === 0) { - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); - } else { - lineSegmentsLengthSum = KmHelper.summarizeLineSegmentLengths(KmHelper.asFeatureCollection(filteredLineFeatures)); - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, lineSegmentsLengthSum); - } - } - else { - lineSegmentsLengthSum = KmHelper.summarizeLineSegmentLengths(linesWithinFeature); - KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, lineSegmentsLengthSum); - } - } - - if(featureIndex % logProgressIndexSeparator === 0){ - KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to line features."); + else { + lineSegmentsLengthSum = KmHelper.summarizeLineSegmentLengths(linesWithinFeature); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, lineSegmentsLengthSum); + } + } + if (featureIndex % logProgressIndexSeparator === 0) { + KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to line features."); + } } - } - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; } - /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -195,22 +181,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -221,12 +207,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -240,74 +224,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -321,58 +291,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_georessouce_length_lineSegmentsWithinPolygon.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js.map b/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js.map new file mode 100644 index 000000000..44155007f --- /dev/null +++ b/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_georessouce_length_lineSegmentsWithinPolygon.js","sourceRoot":"","sources":["km_georessouce_length_lineSegmentsWithinPolygon.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.ts b/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.ts new file mode 100644 index 000000000..30310ada6 --- /dev/null +++ b/app/kommonitor-script-resources/km_georessouce_length_lineSegmentsWithinPolygon.ts @@ -0,0 +1,378 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); +const turf = require('@turf/turf'); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; +const computationGeoresourceId_name = "compGeoId"; +const computationFilterProperty_name = "compFilterProp"; +const computationFilterOperator_name = "compFilterOperator"; +const computationFilterPropertyValue_name = "compFilterPropVal"; + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + // compute indicator for targetDate and targetSpatialUnitFeatures + var computationGeoresourceId = KmHelper.getProcessParameterByName_asString(computationGeoresourceId_name, processParameters); + // retrieve required baseIndicator using its meaningful name + var computationGeoresource = KmHelper.getGeoresourceById(computationGeoresourceId, georesourcesMap); + // create a clone in order to enable object manipulation such as deletion of features without deleting in origin dataset + computationGeoresource = JSON.parse(JSON.stringify(computationGeoresource)); + // OPTIONAL retrieve a property and a respective property value which are then used to filter the georessource + var computationFilterProperty; + var computationFilterOperator; + var computationFilterPropertyValue; + var parameter = undefined; + + processParameters.forEach(function(property){ + if(property.name === computationFilterProperty_name){ + parameter = property.value; + } + }); + + if(parameter === undefined) { + computationFilterProperty = undefined; + computationFilterOperator = undefined; + computationFilterPropertyValue = undefined; + } + else { + computationFilterProperty = KmHelper.getProcessParameterByName_asString(computationFilterProperty_name, processParameters); + computationFilterOperator = KmHelper.getProcessParameterByName_asString(computationFilterOperator_name, processParameters); + computationFilterPropertyValue = KmHelper.getProcessParameterByName_asString(computationFilterPropertyValue_name, processParameters); + } + + KmHelper.log("calculating spatial intersection and within check between lines and target spatial unit."); + + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(targetSpatialUnit_geoJSON.features.length / 100 * 10); + + for (var featureIndex=0; featureIndex < targetSpatialUnit_geoJSON.features.length; featureIndex++){ + var spatialUnitFeat = targetSpatialUnit_geoJSON.features[featureIndex]; + // initialize indicatorValue + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + computationGeoresource = KmHelper.transformMultiLineStringToLineStrings(computationGeoresource); + var linesWithinFeature = KmHelper.intersectLineFeatureCollectionByPolygonFeature(computationGeoresource, spatialUnitFeat); + if(linesWithinFeature && linesWithinFeature.features && linesWithinFeature.features.length > 0){ + var lineSegmentsLengthSum; + if (computationFilterProperty !== undefined) { + var filteredLineFeatures = []; + linesWithinFeature.features.forEach(function (line) { + var computationFilterPropertyValueArray; + switch (computationFilterOperator) { + case ("Equal"): + if (line.properties[computationFilterProperty] === computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Greater_than"): + if (line.properties[computationFilterProperty] > computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Greater_than_or_equal"): + if (line.properties[computationFilterProperty] >= computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Less_than"): + if (line.properties[computationFilterProperty] < computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Less_than_or_equal"): + if (line.properties[computationFilterProperty] <= computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Unequal"): + if (line.properties[computationFilterProperty] !== computationFilterPropertyValue) { + filteredLineFeatures.push(line); + } + break; + case ("Contains"): + computationFilterPropertyValueArray = computationFilterPropertyValue.split(","); + for (let i = 0; i < computationFilterPropertyValueArray.length; i++) { + let trimmedElement = computationFilterPropertyValueArray[i].trim(); + if (line.properties[computationFilterProperty] === trimmedElement) { + filteredLineFeatures.push(line); + } + } + break; + case ("Range"): + computationFilterPropertyValueArray = computationFilterPropertyValue.split("-").map(el => parseInt(el)); + if (line.properties[computationFilterProperty] >= computationFilterPropertyValueArray[0] && line.properties[computationFilterProperty] < computationFilterPropertyValueArray[1]) { + filteredLineFeatures.push(line); + } + break; + default: + KmHelper.log("Indicator was not computed from computation resources because no valid filter could be applied. Indicator value is set to null."); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, null); + break; + } + }); + if (filteredLineFeatures.length === 0) { + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, 0); + } else { + lineSegmentsLengthSum = KmHelper.summarizeLineSegmentLengths(KmHelper.asFeatureCollection(filteredLineFeatures)); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, lineSegmentsLengthSum); + } + } + else { + lineSegmentsLengthSum = KmHelper.summarizeLineSegmentLengths(linesWithinFeature); + KmHelper.setIndicatorValue(spatialUnitFeat, targetDate, lineSegmentsLengthSum); + } + } + + if(featureIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Compared '" + featureIndex + "' of total '" + targetSpatialUnit_geoJSON.features.length + "' spatial units to line features."); + } + } + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +} + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_headline_indicator.js b/app/kommonitor-script-resources/km_headline_indicator.js index c78493303..6526eee52 100644 --- a/app/kommonitor-script-resources/km_headline_indicator.js +++ b/app/kommonitor-script-resources/km_headline_indicator.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,14 +30,10 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorIds = "COMPUTATION_ID_ARRAY"; const parameterName_computationPolarity = "COMPUTATION_POLARITY_ARRAY"; // supported methods: "geomean", "mean", "min" -const parameterName_aggregationMethod = "AGGREGATION_METHOD"; - - - +const parameterName_aggregationMethod = "AGGREGATION_METHOD"; /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -59,71 +51,64 @@ const parameterName_aggregationMethod = "AGGREGATION_METHOD"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorIds, processParameters); var computationPolarity = KmHelper.getProcessParameterByName_asString(parameterName_computationPolarity, processParameters); var aggregationMethod = KmHelper.getProcessParameterByName_asString(parameterName_aggregationMethod, processParameters); - // get an array of the indicator ids - var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationIndicatorIds_array = computationIndicatorIds.split(','); // get an array of the same length including the polarity of each indicator, 'regular' or 'inverted' - var computationPolarity_array = computationPolarity.split(','); - + var computationPolarity_array = computationPolarity.split(','); // get an array of indicators using the indicator ids var geoJSON_array = []; for (const indicatorId of computationIndicatorIds_array) { - geoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorId, baseIndicatorsMap)); - } + geoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorId, baseIndicatorsMap)); + } KmHelper.log("Retrieved required baseIndicators successfully"); - // get an array of map objects with id-value pairs for each featureCollection in the array KmHelper.log("Iterate over array of baseIndicators and create an array of map objects with id-value pairs for each featureCollection"); var indicator_idValueMap_array = []; - geoJSON_array.forEach(function(geoJSON) { - indicator_idValueMap_array.push(KmHelper.getIndicatorIdValueMap(geoJSON, targetDate)); - }); + geoJSON_array.forEach(function (geoJSON) { + indicator_idValueMap_array.push(KmHelper.getIndicatorIdValueMap(geoJSON, targetDate)); + }); KmHelper.log("Retrieved required map objects successfully"); - // get an array of ranked map objects with id-value pairs for each baseIndicator map in the array KmHelper.log("Iterate over array of baseIndicator maps and create an array of ranked map objects"); var rankedIndicator_idValueMap_array = []; - indicator_idValueMap_array.forEach(function(idValueMap) { - rankedIndicator_idValueMap_array.push(KmHelper.rank_fromIdValueMap(idValueMap)); - }); + indicator_idValueMap_array.forEach(function (idValueMap) { + rankedIndicator_idValueMap_array.push(KmHelper.rank_fromIdValueMap(idValueMap)); + }); KmHelper.log("Retrieved ranked map objects successfully"); - // get an array of min-max normalized map objects with id-value pairs for each ranked indicator in the array considering the polarity of the indicator KmHelper.log("Iterate over array ranked map objects and create an array of min-max normalized map objects"); var index; var minMaxNormalizedIndicator_idValueMap_array = []; - for (index = 0; index < rankedIndicator_idValueMap_array.length; index++) { - var polarity = computationPolarity_array[index]; - if (polarity === "regular") { - minMaxNormalizedIndicator_idValueMap_array.push(KmHelper.minMaxNormalization_fromIdValueMap(rankedIndicator_idValueMap_array[index])); - } - else { - minMaxNormalizedIndicator_idValueMap_array.push(KmHelper.minMaxNormalization_inverted_fromIdValueMap(rankedIndicator_idValueMap_array[index])); - } + for (index = 0; index < rankedIndicator_idValueMap_array.length; index++) { + var polarity = computationPolarity_array[index]; + if (polarity === "regular") { + minMaxNormalizedIndicator_idValueMap_array.push(KmHelper.minMaxNormalization_fromIdValueMap(rankedIndicator_idValueMap_array[index])); + } + else { + minMaxNormalizedIndicator_idValueMap_array.push(KmHelper.minMaxNormalization_inverted_fromIdValueMap(rankedIndicator_idValueMap_array[index])); + } } KmHelper.log("Retrieved min-max-normalized map objects successfully"); - // now we compute the new indicator by applying the method chosen by the user var resultMap; if (aggregationMethod === "geomean") { - // apply geometric mean to an array of min-max-normalized map objects - KmHelper.log("Calculate geometric mean"); - resultMap = KmHelper.geomean_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); + // apply geometric mean to an array of min-max-normalized map objects + KmHelper.log("Calculate geometric mean"); + resultMap = KmHelper.geomean_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); } if (aggregationMethod === "mean") { - // apply mean to an array of min-max-normalized map objects - KmHelper.log("Calculate mean"); - resultMap = KmHelper.mean_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); + // apply mean to an array of min-max-normalized map objects + KmHelper.log("Calculate mean"); + resultMap = KmHelper.mean_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); } if (aggregationMethod === "min") { - // apply min to an array of min-max-normalized map objects - KmHelper.log("Calculate min"); - resultMap = KmHelper.min_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); + // apply min to an array of min-max-normalized map objects + KmHelper.log("Calculate min"); + resultMap = KmHelper.min_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); } var numFeatures = targetSpatialUnit_geoJSON.features.length; KmHelper.log("Computed headline indicator for a total amount of " + numFeatures + " features"); @@ -131,7 +116,6 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic KmHelper.log("Computation of headline indicator finished"); return targetSpatialUnit_geoJSON; } - /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -147,22 +131,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -173,12 +157,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -192,74 +174,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -273,59 +241,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_headline_indicator.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_headline_indicator.js.map b/app/kommonitor-script-resources/km_headline_indicator.js.map new file mode 100644 index 000000000..24ae418a5 --- /dev/null +++ b/app/kommonitor-script-resources/km_headline_indicator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_headline_indicator.js","sourceRoot":"","sources":["km_headline_indicator.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_headline_indicator.ts b/app/kommonitor-script-resources/km_headline_indicator.ts new file mode 100644 index 000000000..c78493303 --- /dev/null +++ b/app/kommonitor-script-resources/km_headline_indicator.ts @@ -0,0 +1,331 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorIds = "COMPUTATION_ID_ARRAY"; +const parameterName_computationPolarity = "COMPUTATION_POLARITY_ARRAY"; +// supported methods: "geomean", "mean", "min" +const parameterName_aggregationMethod = "AGGREGATION_METHOD"; + + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorIds, processParameters); + var computationPolarity = KmHelper.getProcessParameterByName_asString(parameterName_computationPolarity, processParameters); + var aggregationMethod = KmHelper.getProcessParameterByName_asString(parameterName_aggregationMethod, processParameters); + + // get an array of the indicator ids + var computationIndicatorIds_array = computationIndicatorIds.split(','); + // get an array of the same length including the polarity of each indicator, 'regular' or 'inverted' + var computationPolarity_array = computationPolarity.split(','); + + // get an array of indicators using the indicator ids + var geoJSON_array = []; + for (const indicatorId of computationIndicatorIds_array) { + geoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorId, baseIndicatorsMap)); + } + KmHelper.log("Retrieved required baseIndicators successfully"); + + // get an array of map objects with id-value pairs for each featureCollection in the array + KmHelper.log("Iterate over array of baseIndicators and create an array of map objects with id-value pairs for each featureCollection"); + var indicator_idValueMap_array = []; + geoJSON_array.forEach(function(geoJSON) { + indicator_idValueMap_array.push(KmHelper.getIndicatorIdValueMap(geoJSON, targetDate)); + }); + KmHelper.log("Retrieved required map objects successfully"); + + // get an array of ranked map objects with id-value pairs for each baseIndicator map in the array + KmHelper.log("Iterate over array of baseIndicator maps and create an array of ranked map objects"); + var rankedIndicator_idValueMap_array = []; + indicator_idValueMap_array.forEach(function(idValueMap) { + rankedIndicator_idValueMap_array.push(KmHelper.rank_fromIdValueMap(idValueMap)); + }); + KmHelper.log("Retrieved ranked map objects successfully"); + + // get an array of min-max normalized map objects with id-value pairs for each ranked indicator in the array considering the polarity of the indicator + KmHelper.log("Iterate over array ranked map objects and create an array of min-max normalized map objects"); + var index; + var minMaxNormalizedIndicator_idValueMap_array = []; + for (index = 0; index < rankedIndicator_idValueMap_array.length; index++) { + var polarity = computationPolarity_array[index]; + if (polarity === "regular") { + minMaxNormalizedIndicator_idValueMap_array.push(KmHelper.minMaxNormalization_fromIdValueMap(rankedIndicator_idValueMap_array[index])); + } + else { + minMaxNormalizedIndicator_idValueMap_array.push(KmHelper.minMaxNormalization_inverted_fromIdValueMap(rankedIndicator_idValueMap_array[index])); + } + } + KmHelper.log("Retrieved min-max-normalized map objects successfully"); + + // now we compute the new indicator by applying the method chosen by the user + var resultMap; + if (aggregationMethod === "geomean") { + // apply geometric mean to an array of min-max-normalized map objects + KmHelper.log("Calculate geometric mean"); + resultMap = KmHelper.geomean_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); + } + if (aggregationMethod === "mean") { + // apply mean to an array of min-max-normalized map objects + KmHelper.log("Calculate mean"); + resultMap = KmHelper.mean_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); + } + if (aggregationMethod === "min") { + // apply min to an array of min-max-normalized map objects + KmHelper.log("Calculate min"); + resultMap = KmHelper.min_fromIdValueMap(minMaxNormalizedIndicator_idValueMap_array); + } + var numFeatures = targetSpatialUnit_geoJSON.features.length; + KmHelper.log("Computed headline indicator for a total amount of " + numFeatures + " features"); + targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); + KmHelper.log("Computation of headline indicator finished"); + return targetSpatialUnit_geoJSON; +} + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js b/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js index 285acf85e..3eea917c9 100644 --- a/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js +++ b/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,16 +30,10 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorId = "COMPUTATION_ID"; - const parameterName_numberOfTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; - // allowed values ['YEARS', 'MONTHS', 'DAYS'] const parameterName_temporalType = "TEMPORAL_TYPE"; - - - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -61,43 +51,36 @@ const parameterName_temporalType = "TEMPORAL_TYPE"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { // get the id to be used for calculations var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); var numberOfTemporalItems = KmHelper.getProcessParameterByName_asNumber(parameterName_numberOfTemporalItems, processParameters); - - // get the indicator using the computationIndicatorId - var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap) - KmHelper.log("Retrieved required computationIndicator successfully."); - + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap); + KmHelper.log("Retrieved required computationIndicator successfully."); // now we compute the new indicator for an absolute change compared to previous year // internally tests are run, e.g. if a previous year is available or not var resultMap = new Map(); - - if(temporalType === "YEARS"){ - resultMap = KmHelper.changeAbsolute_n_years(computationIndicator, targetDate, numberOfTemporalItems); - } - else if(temporalType === "MONTHS"){ - resultMap = KmHelper.changeAbsolute_n_months(computationIndicator, targetDate, numberOfTemporalItems); - } - else if(temporalType === "DAYS"){ - resultMap = KmHelper.changeAbsolute_n_days(computationIndicator, targetDate, numberOfTemporalItems); - } - else{ - KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); - resultMap = KmHelper.changeAbsolute_n_years(computationIndicator, targetDate, numberOfTemporalItems); - } - + if (temporalType === "YEARS") { + resultMap = KmHelper.changeAbsolute_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + else if (temporalType === "MONTHS") { + resultMap = KmHelper.changeAbsolute_n_months(computationIndicator, targetDate, numberOfTemporalItems); + } + else if (temporalType === "DAYS") { + resultMap = KmHelper.changeAbsolute_n_days(computationIndicator, targetDate, numberOfTemporalItems); + } + else { + KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); + resultMap = KmHelper.changeAbsolute_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } var numFeatures = targetSpatialUnit_geoJSON.features.length; KmHelper.log("Computed change indicator for a total amount of " + numFeatures + " features"); targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); KmHelper.log("Computation of absolute change compared to previous year finished"); return targetSpatialUnit_geoJSON; } - /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -113,22 +96,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -139,12 +122,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -158,74 +139,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -239,59 +206,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_absChange_nTemporalItems.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js.map b/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js.map new file mode 100644 index 000000000..bedd63871 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_absChange_nTemporalItems.js","sourceRoot":"","sources":["km_indicator_absChange_nTemporalItems.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.ts b/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.ts new file mode 100644 index 000000000..285acf85e --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_absChange_nTemporalItems.ts @@ -0,0 +1,297 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +const parameterName_numberOfTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + +// allowed values ['YEARS', 'MONTHS', 'DAYS'] +const parameterName_temporalType = "TEMPORAL_TYPE"; + + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + // get the id to be used for calculations + var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); + var numberOfTemporalItems = KmHelper.getProcessParameterByName_asNumber(parameterName_numberOfTemporalItems, processParameters); + + + // get the indicator using the computationIndicatorId + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap) + KmHelper.log("Retrieved required computationIndicator successfully."); + + // now we compute the new indicator for an absolute change compared to previous year + // internally tests are run, e.g. if a previous year is available or not + var resultMap = new Map(); + + if(temporalType === "YEARS"){ + resultMap = KmHelper.changeAbsolute_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + else if(temporalType === "MONTHS"){ + resultMap = KmHelper.changeAbsolute_n_months(computationIndicator, targetDate, numberOfTemporalItems); + } + else if(temporalType === "DAYS"){ + resultMap = KmHelper.changeAbsolute_n_days(computationIndicator, targetDate, numberOfTemporalItems); + } + else{ + KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); + resultMap = KmHelper.changeAbsolute_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + KmHelper.log("Computed change indicator for a total amount of " + numFeatures + " features"); + targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); + KmHelper.log("Computation of absolute change compared to previous year finished"); + return targetSpatialUnit_geoJSON; +} + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_absChange_refDate.js b/app/kommonitor-script-resources/km_indicator_absChange_refDate.js index 903449f12..59ffffc76 100644 --- a/app/kommonitor-script-resources/km_indicator_absChange_refDate.js +++ b/app/kommonitor-script-resources/km_indicator_absChange_refDate.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,13 +30,8 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorId = "COMPUTATION_ID"; - const parameterName_referenceDATE = "REFERENCE_DATE"; - - - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -58,28 +49,23 @@ const parameterName_referenceDATE = "REFERENCE_DATE"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { // get the id to be used for calculations var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); // get reference date var referenceDate = KmHelper.getProcessParameterByName_asString(parameterName_referenceDATE, processParameters); - // get the indicator using the computationIndicatorId - var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap) - KmHelper.log("Retrieved required computationIndicator successfully."); - + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap); + KmHelper.log("Retrieved required computationIndicator successfully."); // now we compute the new indicator for an absolute change compared to previous year // internally tests are run, e.g. if a previous year is available or not var resultMap = KmHelper.changeAbsolute_referenceDate(computationIndicator, targetDate, referenceDate); - var numFeatures = targetSpatialUnit_geoJSON.features.length; KmHelper.log("Computed change indicator for a total amount of " + numFeatures + " features"); targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); KmHelper.log("Computation of absolute change compared to previous year finished"); return targetSpatialUnit_geoJSON; } - /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -95,22 +81,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -121,12 +107,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -140,74 +124,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -221,59 +191,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_absChange_refDate.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_absChange_refDate.js.map b/app/kommonitor-script-resources/km_indicator_absChange_refDate.js.map new file mode 100644 index 000000000..71a03267d --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_absChange_refDate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_absChange_refDate.js","sourceRoot":"","sources":["km_indicator_absChange_refDate.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_absChange_refDate.ts b/app/kommonitor-script-resources/km_indicator_absChange_refDate.ts new file mode 100644 index 000000000..903449f12 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_absChange_refDate.ts @@ -0,0 +1,279 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +const parameterName_referenceDATE = "REFERENCE_DATE"; + + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + // get the id to be used for calculations + var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + // get reference date + var referenceDate = KmHelper.getProcessParameterByName_asString(parameterName_referenceDATE, processParameters); + + // get the indicator using the computationIndicatorId + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap) + KmHelper.log("Retrieved required computationIndicator successfully."); + + // now we compute the new indicator for an absolute change compared to previous year + // internally tests are run, e.g. if a previous year is available or not + var resultMap = KmHelper.changeAbsolute_referenceDate(computationIndicator, targetDate, referenceDate); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + KmHelper.log("Computed change indicator for a total amount of " + numFeatures + " features"); + targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); + KmHelper.log("Computation of absolute change compared to previous year finished"); + return targetSpatialUnit_geoJSON; +} + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js b/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js index 7cb82eabd..0133417ec 100644 --- a/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js +++ b/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,15 +30,10 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorId = "COMPUTATION_ID"; - const parameterName_numberOfTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; - // allowed values ['YEARS', 'MONTHS', 'DAYS'] -const parameterName_temporalType = "TEMPORAL_TYPE" - - +const parameterName_temporalType = "TEMPORAL_TYPE"; /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -60,43 +51,36 @@ const parameterName_temporalType = "TEMPORAL_TYPE" * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { // get the id to be used for calculations var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); - var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); + var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); var numberOfTemporalItems = KmHelper.getProcessParameterByName_asNumber(parameterName_numberOfTemporalItems, processParameters); - // get the indicator using the computationIndicatorId var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap); - KmHelper.log("Retrieved required computationIndicator successfully."); - + KmHelper.log("Retrieved required computationIndicator successfully."); // now we compute the new indicator for the continuity within n consecutive years // internally tests are run, e.g. if n previous years are available or not - - var resultMap = new Map(); - - if(temporalType === "YEARS"){ - resultMap = KmHelper.continuity_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); - } - else if(temporalType === "MONTHS"){ - resultMap = KmHelper.continuity_consecutive_n_months(computationIndicator, targetDate, numberOfTemporalItems); - } - else if(temporalType === "DAYS"){ - resultMap = KmHelper.continuity_consecutive_n_days(computationIndicator, targetDate, numberOfTemporalItems); - } - else{ - KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); - resultMap = KmHelper.continuity_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); - } - + var resultMap = new Map(); + if (temporalType === "YEARS") { + resultMap = KmHelper.continuity_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + else if (temporalType === "MONTHS") { + resultMap = KmHelper.continuity_consecutive_n_months(computationIndicator, targetDate, numberOfTemporalItems); + } + else if (temporalType === "DAYS") { + resultMap = KmHelper.continuity_consecutive_n_days(computationIndicator, targetDate, numberOfTemporalItems); + } + else { + KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); + resultMap = KmHelper.continuity_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } var numFeatures = targetSpatialUnit_geoJSON.features.length; KmHelper.log("Computed continuity indicator for a total amount of " + numFeatures + " features"); targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); KmHelper.log("Computation of the continuity finished"); return targetSpatialUnit_geoJSON; } - /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -112,22 +96,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -138,12 +122,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -157,74 +139,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -238,59 +206,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_continuity_nTemporalItems.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js.map b/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js.map new file mode 100644 index 000000000..3b9d617be --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_continuity_nTemporalItems.js","sourceRoot":"","sources":["km_indicator_continuity_nTemporalItems.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.ts b/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.ts new file mode 100644 index 000000000..7cb82eabd --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_continuity_nTemporalItems.ts @@ -0,0 +1,296 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +const parameterName_numberOfTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + +// allowed values ['YEARS', 'MONTHS', 'DAYS'] +const parameterName_temporalType = "TEMPORAL_TYPE" + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + // get the id to be used for calculations + var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); + var numberOfTemporalItems = KmHelper.getProcessParameterByName_asNumber(parameterName_numberOfTemporalItems, processParameters); + + // get the indicator using the computationIndicatorId + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap); + KmHelper.log("Retrieved required computationIndicator successfully."); + + // now we compute the new indicator for the continuity within n consecutive years + // internally tests are run, e.g. if n previous years are available or not + + var resultMap = new Map(); + + if(temporalType === "YEARS"){ + resultMap = KmHelper.continuity_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + else if(temporalType === "MONTHS"){ + resultMap = KmHelper.continuity_consecutive_n_months(computationIndicator, targetDate, numberOfTemporalItems); + } + else if(temporalType === "DAYS"){ + resultMap = KmHelper.continuity_consecutive_n_days(computationIndicator, targetDate, numberOfTemporalItems); + } + else{ + KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); + resultMap = KmHelper.continuity_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + KmHelper.log("Computed continuity indicator for a total amount of " + numFeatures + " features"); + targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); + KmHelper.log("Computation of the continuity finished"); + return targetSpatialUnit_geoJSON; +} + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_divide.js b/app/kommonitor-script-resources/km_indicator_divide.js index 0d94429c0..060166ec5 100644 --- a/app/kommonitor-script-resources/km_indicator_divide.js +++ b/app/kommonitor-script-resources/km_indicator_divide.js @@ -1,22 +1,19 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -26,7 +23,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -35,10 +31,8 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "MEAN"; - const parameterName_computationIndicatorId_numerator = "COMPUTATION_ID_numerator"; const parameterName_computationIndicatorId_denominator = "COMPUTATION_ID_denominator"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -56,156 +50,128 @@ const parameterName_computationIndicatorId_denominator = "COMPUTATION_ID_denomin * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - - var computationIndicatorId_numerator = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId_numerator, processParameters); - var numeratorGeoJSON = KmHelper.getBaseIndicatorById(computationIndicatorId_numerator, baseIndicatorsMap); - - var computationIndicatorId_denominator = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId_denominator, processParameters); - var denominatorGeoJSON = KmHelper.getBaseIndicatorById(computationIndicatorId_denominator, baseIndicatorsMap); - - - KmHelper.log("Retrieved required baseIndicators successfully"); - - // now we compute the new indicator - KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); - - /** - * create a map to store indicator values for each feature of the target spatial unit - * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator - * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator - */ - var map = new Map(); - - KmHelper.log("Process numerator indicator '" + computationIndicatorId_numerator + "'"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - numeratorGeoJSON.features.forEach(function(feature) { +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + var computationIndicatorId_numerator = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId_numerator, processParameters); + var numeratorGeoJSON = KmHelper.getBaseIndicatorById(computationIndicatorId_numerator, baseIndicatorsMap); + var computationIndicatorId_denominator = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId_denominator, processParameters); + var denominatorGeoJSON = KmHelper.getBaseIndicatorById(computationIndicatorId_denominator, baseIndicatorsMap); + KmHelper.log("Retrieved required baseIndicators successfully"); + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + KmHelper.log("Process numerator indicator '" + computationIndicatorId_numerator + "'"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + numeratorGeoJSON.features.forEach(function (feature) { // get the unique featureID of the spatial unit feature as String var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); // get the time series value of the base indicator feature for the requested target date (with its required prefix!) var numeratorValue = KmHelper.getIndicatorValue(feature, targetDate); - - if(numeratorValue === undefined || numeratorValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); - numeratorValue = 0; - } - // modify map object (i.e. set value initially, or perform calculations and store modified value) + if (numeratorValue === undefined || numeratorValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + numeratorValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) // key should be unique featureId of the spatial unit feature - if (! map.has(featureId)){ + if (!map.has(featureId)) { var mapObject = { featureId: featureId, indicatorValue: undefined, numeratorValue: 0, - denominatorValue: 0 - }; - - map.set(featureId, mapObject); - } + denominatorValue: 0 + }; + map.set(featureId, mapObject); + } var mapEntry = map.get(featureId); - mapEntry.numeratorValue = numeratorValue; + mapEntry.numeratorValue = numeratorValue; map.set(featureId, mapEntry); - }); - - KmHelper.log("Process denominator indicator"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - denominatorGeoJSON.features.forEach(function(feature) { + }); + KmHelper.log("Process denominator indicator"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + denominatorGeoJSON.features.forEach(function (feature) { // get the unique featureID of the spatial unit feature as String var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); // get the time series value of the base indicator feature for the requested target date (with its required prefix!) var denominatorValue = KmHelper.getIndicatorValue(feature, targetDate); - - // modify map object (i.e. set value initially, or perform calculations and store modified value) + // modify map object (i.e. set value initially, or perform calculations and store modified value) // key should be unique featureId of the spatial unit feature - if(denominatorValue === undefined || denominatorValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); - denominatorValue = 0; - } - - if (! map.has(featureId)){ - KmHelper.log("numeratorValue Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set denominatorValue to null."); - var mapObject = { - featureId: featureId, - indicatorValue: undefined, - numeratorValue: 0, - denominatorValue: 0 - }; - - map.set(featureId, mapObject); + if (denominatorValue === undefined || denominatorValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + denominatorValue = 0; + } + if (!map.has(featureId)) { + KmHelper.log("numeratorValue Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set denominatorValue to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + numeratorValue: 0, + denominatorValue: 0 + }; + map.set(featureId, mapObject); } - - var mapEntry = map.get(featureId); - mapEntry.denominatorValue = denominatorValue; - + var mapEntry = map.get(featureId); + mapEntry.denominatorValue = denominatorValue; map.set(featureId, mapEntry); - }); - - var numFeatures = targetSpatialUnit_geoJSON.features.length; - - // now we compute the new indicator - KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); - - // iterate once over target spatial unit features and compute indicator utilizing map entries - var spatialUnitIndex = 0; - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); - targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { - + }); + var numFeatures = targetSpatialUnit_geoJSON.features.length; + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function (spatialUnitFeature) { // get spatialUnit feature id as string --> use it to get associated map entry var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); - - if (! map.has(spatialUnitFeatureId)){ - KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set nominator and denominator values to null."); - var mapObject = { - featureId: spatialUnitFeatureId, - indicatorValue: undefined, - numeratorValue: null, - denominatorValue: null + if (!map.has(spatialUnitFeatureId)) { + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set nominator and denominator values to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + numeratorValue: null, + denominatorValue: null }; - - map.set(spatialUnitFeatureId, mapObject); - } - + map.set(spatialUnitFeatureId, mapObject); + } var mapEntry = map.get(spatialUnitFeatureId); - var indicatorValue = null; - - if(mapEntry.numeratorValue === undefined || mapEntry.numeratorValue === null || mapEntry.denominatorValue === undefined || mapEntry.denominatorValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("INFO: indicator value is set to null"); - indicatorValue = null; - } else if(mapEntry.denominatorValue === 0) { - indicatorValue = 0; - KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); - KmHelper.log("INFO: indicator value is set to 0"); - } else { - indicatorValue = mapEntry.numeratorValue / mapEntry.denominatorValue; - } - + var indicatorValue = null; + if (mapEntry.numeratorValue === undefined || mapEntry.numeratorValue === null || mapEntry.denominatorValue === undefined || mapEntry.denominatorValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to null"); + indicatorValue = null; + } + else if (mapEntry.denominatorValue === 0) { + indicatorValue = 0; + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to 0"); + } + else { + indicatorValue = mapEntry.numeratorValue / mapEntry.denominatorValue; + } // set indicator value for spatialUnitFeature spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); - - spatialUnitIndex ++; - + spatialUnitIndex++; // only log after certain progress - if(spatialUnitIndex % logProgressIndexSeparator === 0){ + if (spatialUnitIndex % logProgressIndexSeparator === 0) { KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); } - }); - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + }); + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -221,22 +187,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -247,12 +213,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -266,74 +230,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -347,60 +297,48 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; - // \ No newline at end of file +// +//# sourceMappingURL=km_indicator_divide.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_divide.js.map b/app/kommonitor-script-resources/km_indicator_divide.js.map new file mode 100644 index 000000000..14108f9aa --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_divide.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_divide.js","sourceRoot":"","sources":["km_indicator_divide.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_divide.ts b/app/kommonitor-script-resources/km_indicator_divide.ts new file mode 100644 index 000000000..0d94429c0 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_divide.ts @@ -0,0 +1,406 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "MEAN"; + +const parameterName_computationIndicatorId_numerator = "COMPUTATION_ID_numerator"; +const parameterName_computationIndicatorId_denominator = "COMPUTATION_ID_denominator"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + var computationIndicatorId_numerator = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId_numerator, processParameters); + var numeratorGeoJSON = KmHelper.getBaseIndicatorById(computationIndicatorId_numerator, baseIndicatorsMap); + + var computationIndicatorId_denominator = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId_denominator, processParameters); + var denominatorGeoJSON = KmHelper.getBaseIndicatorById(computationIndicatorId_denominator, baseIndicatorsMap); + + + KmHelper.log("Retrieved required baseIndicators successfully"); + + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + + KmHelper.log("Process numerator indicator '" + computationIndicatorId_numerator + "'"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + numeratorGeoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var numeratorValue = KmHelper.getIndicatorValue(feature, targetDate); + + if(numeratorValue === undefined || numeratorValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + numeratorValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (! map.has(featureId)){ + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + numeratorValue: 0, + denominatorValue: 0 + }; + + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.numeratorValue = numeratorValue; + map.set(featureId, mapEntry); + }); + + KmHelper.log("Process denominator indicator"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + denominatorGeoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var denominatorValue = KmHelper.getIndicatorValue(feature, targetDate); + + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if(denominatorValue === undefined || denominatorValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + denominatorValue = 0; + } + + if (! map.has(featureId)){ + KmHelper.log("numeratorValue Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set denominatorValue to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + numeratorValue: 0, + denominatorValue: 0 + }; + + map.set(featureId, mapObject); + } + + var mapEntry = map.get(featureId); + mapEntry.denominatorValue = denominatorValue; + + map.set(featureId, mapEntry); + }); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { + + // get spatialUnit feature id as string --> use it to get associated map entry + var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); + + if (! map.has(spatialUnitFeatureId)){ + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set nominator and denominator values to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + numeratorValue: null, + denominatorValue: null + }; + + map.set(spatialUnitFeatureId, mapObject); + } + + var mapEntry = map.get(spatialUnitFeatureId); + var indicatorValue = null; + + if(mapEntry.numeratorValue === undefined || mapEntry.numeratorValue === null || mapEntry.denominatorValue === undefined || mapEntry.denominatorValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to null"); + indicatorValue = null; + } else if(mapEntry.denominatorValue === 0) { + indicatorValue = 0; + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to 0"); + } else { + indicatorValue = mapEntry.numeratorValue / mapEntry.denominatorValue; + } + + // set indicator value for spatialUnitFeature + spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); + + spatialUnitIndex ++; + + // only log after certain progress + if(spatialUnitIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); + } + }); + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; + // \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_multiply.js b/app/kommonitor-script-resources/km_indicator_multiply.js index d9bbc461a..d0b8b9aff 100644 --- a/app/kommonitor-script-resources/km_indicator_multiply.js +++ b/app/kommonitor-script-resources/km_indicator_multiply.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,9 +30,7 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorId = "COMPUTATION_ID"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -54,108 +48,89 @@ const parameterName_computationIndicatorId = "COMPUTATION_ID"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - - var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); - var computationIndicatorIds_array = computationIndicatorIds.split(','); - var computationGeoJSON_array = []; - for (const indicatorID of computationIndicatorIds_array){ - computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; - - KmHelper.log("Retrieved required baseIndicators successfully"); - - // now we compute the new indicator - KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); - - /** - * create a map to store indicator values for each feature of the target spatial unit - * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator - * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator - */ - var map = new Map(); - - KmHelper.log("Process computation indicator"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - computationGeoJSON_array.forEach(function(geoJSON) { - - geoJSON.features.forEach(function(feature) { - // get the unique featureID of the spatial unit feature as String - var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); - // get the time series value of the base indicator feature for the requested target date (with its required prefix!) - var partValue = KmHelper.getIndicatorValue(feature, targetDate); - if(partValue === undefined || partValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); - partValue = 0; - } - // modify map object (i.e. set value initially, or perform calculations and store modified value) - // key should be unique featureId of the spatial unit feature - if (! map.has(featureId)){ - var mapObject = { - featureId: featureId, - indicatorValue: undefined, - intermediateValue: 1 - }; - map.set(featureId, mapObject); - } - var mapEntry = map.get(featureId); - mapEntry.intermediateValue = mapEntry.intermediateValue * partValue; - map.set(featureId, mapEntry); - }); - }); - - var numFeatures = targetSpatialUnit_geoJSON.features.length; - - // now we compute the new indicator - KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); - - // iterate once over target spatial unit features and compute indicator utilizing map entries - var spatialUnitIndex = 0; - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); - targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array) { + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap)); + } + ; + KmHelper.log("Retrieved required baseIndicators successfully"); + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + KmHelper.log("Process computation indicator"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function (geoJSON) { + geoJSON.features.forEach(function (feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if (partValue === undefined || partValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (!map.has(featureId)) { + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + intermediateValue: 1 + }; + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue * partValue; + map.set(featureId, mapEntry); + }); + }); + var numFeatures = targetSpatialUnit_geoJSON.features.length; + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function (spatialUnitFeature) { // get spatialUnit feature id as string --> use it to get associated map entry var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); - - if (! map.has(spatialUnitFeatureId)){ - KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); - var mapObject = { - featureId: spatialUnitFeatureId, - indicatorValue: null, - intermediateValue: null - }; - map.set(spatialUnitFeatureId, mapObject); - } - + if (!map.has(spatialUnitFeatureId)) { + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: null, + intermediateValue: null + }; + map.set(spatialUnitFeatureId, mapObject); + } var mapEntry = map.get(spatialUnitFeatureId); - - var indicatorValue = mapEntry.intermediateValue; - // set aggregationWeight as number of citizens KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); - // set indicator value for spatialUnitFeature spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); - - spatialUnitIndex ++; - + spatialUnitIndex++; // only log after certain progress - if(spatialUnitIndex % logProgressIndexSeparator === 0){ + if (spatialUnitIndex % logProgressIndexSeparator === 0) { KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); } - }); - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + }); + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -171,22 +146,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -197,12 +172,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -216,74 +189,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -297,59 +256,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_multiply.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_multiply.js.map b/app/kommonitor-script-resources/km_indicator_multiply.js.map new file mode 100644 index 000000000..428af5582 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_multiply.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_multiply.js","sourceRoot":"","sources":["km_indicator_multiply.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_multiply.ts b/app/kommonitor-script-resources/km_indicator_multiply.ts new file mode 100644 index 000000000..d9bbc461a --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_multiply.ts @@ -0,0 +1,355 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array){ + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; + + KmHelper.log("Retrieved required baseIndicators successfully"); + + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + + KmHelper.log("Process computation indicator"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function(geoJSON) { + + geoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if(partValue === undefined || partValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (! map.has(featureId)){ + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + intermediateValue: 1 + }; + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue * partValue; + map.set(featureId, mapEntry); + }); + }); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { + + // get spatialUnit feature id as string --> use it to get associated map entry + var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); + + if (! map.has(spatialUnitFeatureId)){ + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: null, + intermediateValue: null + }; + map.set(spatialUnitFeatureId, mapObject); + } + + var mapEntry = map.get(spatialUnitFeatureId); + + + var indicatorValue = mapEntry.intermediateValue; + + // set aggregationWeight as number of citizens + KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); + + // set indicator value for spatialUnitFeature + spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); + + spatialUnitIndex ++; + + // only log after certain progress + if(spatialUnitIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); + } + }); + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_percentage.js b/app/kommonitor-script-resources/km_indicator_percentage.js index 75c4e495a..ebf53f951 100644 --- a/app/kommonitor-script-resources/km_indicator_percentage.js +++ b/app/kommonitor-script-resources/km_indicator_percentage.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,10 +30,8 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "AVERAGE"; - const parameterName_referenceIndicatorId = "REFERENCE_ID"; const parameterName_computationIndicatorId = "COMPUTATION_ID"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -55,162 +49,137 @@ const parameterName_computationIndicatorId = "COMPUTATION_ID"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - - var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); - var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); - - var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); - var computationIndicatorIds_array = computationIndicatorIds.split(','); - var computationGeoJSON_array = []; - for (const indicatorID of computationIndicatorIds_array){ - computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; - - KmHelper.log("Retrieved required baseIndicators successfully"); - - // now we compute the new indicator - KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); - - /** - * create a map to store indicator values for each feature of the target spatial unit - * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator - * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator - */ - var map = new Map(); - - KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - referenceGeoJSON.features.forEach(function(feature) { +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); + var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array) { + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap)); + } + ; + KmHelper.log("Retrieved required baseIndicators successfully"); + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + referenceGeoJSON.features.forEach(function (feature) { // get the unique featureID of the spatial unit feature as String var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); // get the time series value of the base indicator feature for the requested target date (with its required prefix!) var referenceValue = KmHelper.getIndicatorValue(feature, targetDate); - - if(referenceValue === undefined || referenceValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: process will return"); - referenceValue = 0; + if (referenceValue === undefined || referenceValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: process will return"); + referenceValue = 0; } - // modify map object (i.e. set value initially, or perform calculations and store modified value) + // modify map object (i.e. set value initially, or perform calculations and store modified value) // key should be unique featureId of the spatial unit feature - if (! map.has(featureId)){ + if (!map.has(featureId)) { var mapObject = { featureId: featureId, indicatorValue: undefined, refValue: 0, - intermediateValue: 0 - }; - - map.set(featureId, mapObject); + intermediateValue: 0 + }; + map.set(featureId, mapObject); } - var mapEntry = map.get(featureId); - mapEntry.refValue = referenceValue; + var mapEntry = map.get(featureId); + mapEntry.refValue = referenceValue; map.set(featureId, mapEntry); - }); - - KmHelper.log("Process computation indicator"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - computationGeoJSON_array.forEach(function(geoJSON) { - - geoJSON.features.forEach(function(feature) { - // get the unique featureID of the spatial unit feature as String - var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); - // get the time series value of the base indicator feature for the requested target date (with its required prefix!) - var partValue = KmHelper.getIndicatorValue(feature, targetDate); - if(partValue === undefined || partValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); - partValue = 0; - } - // modify map object (i.e. set value initially, or perform calculations and store modified value) - // key should be unique featureId of the spatial unit feature - - if (! map.has(featureId)){ - KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); - var mapObject = { - featureId: featureId, - indicatorValue: undefined, - refValue: null, - intermediateValue: 0 + }); + KmHelper.log("Process computation indicator"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function (geoJSON) { + geoJSON.features.forEach(function (feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if (partValue === undefined || partValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (!map.has(featureId)) { + KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: 0 }; - - map.set(featureId, mapObject); - } - - var mapEntry = map.get(featureId); - mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; - map.set(featureId, mapEntry); - }); - }); - - var numFeatures = targetSpatialUnit_geoJSON.features.length; - - // now we compute the new indicator - KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); - - // iterate once over target spatial unit features and compute indicator utilizing map entries - var spatialUnitIndex = 0; - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); - targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { - + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + var numFeatures = targetSpatialUnit_geoJSON.features.length; + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function (spatialUnitFeature) { // get spatialUnit feature id as string --> use it to get associated map entry var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); - - if (! map.has(spatialUnitFeatureId)){ - KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); - var mapObject = { - featureId: spatialUnitFeatureId, - indicatorValue: undefined, - refValue: null, - intermediateValue: null - }; - - map.set(spatialUnitFeatureId, mapObject); - } - + if (!map.has(spatialUnitFeatureId)) { + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: null + }; + map.set(spatialUnitFeatureId, mapObject); + } var mapEntry = map.get(spatialUnitFeatureId); - - var indicatorValue = null; - if(mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("INFO: indicator value is set to null"); - indicatorValue = null; - } else if(mapEntry.refValue === 0) { - indicatorValue = 0; - KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); - KmHelper.log("INFO: indicator value is set to 0"); - } else { - indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue) * 100; - } - + var indicatorValue = null; + if (mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to null"); + indicatorValue = null; + } + else if (mapEntry.refValue === 0) { + indicatorValue = 0; + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to 0"); + } + else { + indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue) * 100; + } // set aggregationWeight as number of citizens KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); - // set indicator value for spatialUnitFeature spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); - - spatialUnitIndex ++; - + spatialUnitIndex++; // only log after certain progress - if(spatialUnitIndex % logProgressIndexSeparator === 0){ + if (spatialUnitIndex % logProgressIndexSeparator === 0) { KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); } - }); - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + }); + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -226,22 +195,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -252,12 +221,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -271,74 +238,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -352,59 +305,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_percentage.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_percentage.js.map b/app/kommonitor-script-resources/km_indicator_percentage.js.map new file mode 100644 index 000000000..98394ffa5 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_percentage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_percentage.js","sourceRoot":"","sources":["km_indicator_percentage.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_percentage.ts b/app/kommonitor-script-resources/km_indicator_percentage.ts new file mode 100644 index 000000000..75c4e495a --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_percentage.ts @@ -0,0 +1,410 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "AVERAGE"; + +const parameterName_referenceIndicatorId = "REFERENCE_ID"; +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); + var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); + + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array){ + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; + + KmHelper.log("Retrieved required baseIndicators successfully"); + + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + + KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + referenceGeoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var referenceValue = KmHelper.getIndicatorValue(feature, targetDate); + + if(referenceValue === undefined || referenceValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: process will return"); + referenceValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (! map.has(featureId)){ + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: 0, + intermediateValue: 0 + }; + + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.refValue = referenceValue; + map.set(featureId, mapEntry); + }); + + KmHelper.log("Process computation indicator"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function(geoJSON) { + + geoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if(partValue === undefined || partValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + + if (! map.has(featureId)){ + KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: 0 + }; + + map.set(featureId, mapObject); + } + + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { + + // get spatialUnit feature id as string --> use it to get associated map entry + var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); + + if (! map.has(spatialUnitFeatureId)){ + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: null + }; + + map.set(spatialUnitFeatureId, mapObject); + } + + var mapEntry = map.get(spatialUnitFeatureId); + + var indicatorValue = null; + if(mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to null"); + indicatorValue = null; + } else if(mapEntry.refValue === 0) { + indicatorValue = 0; + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to 0"); + } else { + indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue) * 100; + } + + // set aggregationWeight as number of citizens + KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); + + // set indicator value for spatialUnitFeature + spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); + + spatialUnitIndex ++; + + // only log after certain progress + if(spatialUnitIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); + } + }); + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_promille.js b/app/kommonitor-script-resources/km_indicator_promille.js index f0fe33cd5..b564256a9 100644 --- a/app/kommonitor-script-resources/km_indicator_promille.js +++ b/app/kommonitor-script-resources/km_indicator_promille.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,10 +30,8 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "AVERAGE"; - const parameterName_referenceIndicatorId = "REFERENCE_ID"; const parameterName_computationIndicatorId = "COMPUTATION_ID"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -55,162 +49,137 @@ const parameterName_computationIndicatorId = "COMPUTATION_ID"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - - var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); - var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); - - var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); - var computationIndicatorIds_array = computationIndicatorIds.split(','); - var computationGeoJSON_array = []; - for (const indicatorID of computationIndicatorIds_array){ - computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; - - KmHelper.log("Retrieved required baseIndicators successfully"); - - // now we compute the new indicator - KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); - - /** - * create a map to store indicator values for each feature of the target spatial unit - * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator - * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator - */ - var map = new Map(); - - KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - referenceGeoJSON.features.forEach(function(feature) { +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); + var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array) { + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap)); + } + ; + KmHelper.log("Retrieved required baseIndicators successfully"); + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + referenceGeoJSON.features.forEach(function (feature) { // get the unique featureID of the spatial unit feature as String var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); // get the time series value of the base indicator feature for the requested target date (with its required prefix!) var referenceValue = KmHelper.getIndicatorValue(feature, targetDate); - - if(referenceValue === undefined || referenceValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: process will return"); - referenceValue = 0; + if (referenceValue === undefined || referenceValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: process will return"); + referenceValue = 0; } - // modify map object (i.e. set value initially, or perform calculations and store modified value) + // modify map object (i.e. set value initially, or perform calculations and store modified value) // key should be unique featureId of the spatial unit feature - if (! map.has(featureId)){ + if (!map.has(featureId)) { var mapObject = { featureId: featureId, indicatorValue: undefined, refValue: 0, intermediateValue: 0 - }; - - map.set(featureId, mapObject); + }; + map.set(featureId, mapObject); } - var mapEntry = map.get(featureId); - mapEntry.refValue = referenceValue; + var mapEntry = map.get(featureId); + mapEntry.refValue = referenceValue; map.set(featureId, mapEntry); - }); - - KmHelper.log("Process computation indicator"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - computationGeoJSON_array.forEach(function(geoJSON) { - - geoJSON.features.forEach(function(feature) { - // get the unique featureID of the spatial unit feature as String - var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); - // get the time series value of the base indicator feature for the requested target date (with its required prefix!) - var partValue = KmHelper.getIndicatorValue(feature, targetDate); - if(partValue === undefined || partValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); - partValue = 0; - } - // modify map object (i.e. set value initially, or perform calculations and store modified value) - // key should be unique featureId of the spatial unit feature - - if (! map.has(featureId)){ - KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); - var mapObject = { - featureId: featureId, - indicatorValue: undefined, - refValue: null, - intermediateValue: 0 + }); + KmHelper.log("Process computation indicator"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function (geoJSON) { + geoJSON.features.forEach(function (feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if (partValue === undefined || partValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (!map.has(featureId)) { + KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: 0 }; - - map.set(featureId, mapObject); - } - - var mapEntry = map.get(featureId); - mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; - map.set(featureId, mapEntry); - }); - }); - - var numFeatures = targetSpatialUnit_geoJSON.features.length; - - // now we compute the new indicator - KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); - - // iterate once over target spatial unit features and compute indicator utilizing map entries - var spatialUnitIndex = 0; - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); - targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { - + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + var numFeatures = targetSpatialUnit_geoJSON.features.length; + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function (spatialUnitFeature) { // get spatialUnit feature id as string --> use it to get associated map entry var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); - - if (! map.has(spatialUnitFeatureId)){ - KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); - var mapObject = { - featureId: spatialUnitFeatureId, - indicatorValue: undefined, - refValue: null, - intermediateValue: null - }; - - map.set(spatialUnitFeatureId, mapObject); - } - + if (!map.has(spatialUnitFeatureId)) { + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: null + }; + map.set(spatialUnitFeatureId, mapObject); + } var mapEntry = map.get(spatialUnitFeatureId); - - var indicatorValue = null; - if(mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("INFO: indicator value is set to null"); - indicatorValue = null; - } else if(mapEntry.refValue === 0) { - indicatorValue = 0; - KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); - KmHelper.log("INFO: indicator value is set to 0"); - } else { - indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue) * 1000; - } - + var indicatorValue = null; + if (mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to null"); + indicatorValue = null; + } + else if (mapEntry.refValue === 0) { + indicatorValue = 0; + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to 0"); + } + else { + indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue) * 1000; + } // set aggregationWeight as number of citizens KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); - // set indicator value for spatialUnitFeature spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); - - spatialUnitIndex ++; - + spatialUnitIndex++; // only log after certain progress - if(spatialUnitIndex % logProgressIndexSeparator === 0){ + if (spatialUnitIndex % logProgressIndexSeparator === 0) { KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); } - }); - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + }); + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -226,22 +195,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -252,12 +221,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -271,74 +238,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -352,59 +305,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_promille.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_promille.js.map b/app/kommonitor-script-resources/km_indicator_promille.js.map new file mode 100644 index 000000000..5c0f46d03 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_promille.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_promille.js","sourceRoot":"","sources":["km_indicator_promille.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_promille.ts b/app/kommonitor-script-resources/km_indicator_promille.ts new file mode 100644 index 000000000..f0fe33cd5 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_promille.ts @@ -0,0 +1,410 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "AVERAGE"; + +const parameterName_referenceIndicatorId = "REFERENCE_ID"; +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); + var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); + + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array){ + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; + + KmHelper.log("Retrieved required baseIndicators successfully"); + + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + + KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + referenceGeoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var referenceValue = KmHelper.getIndicatorValue(feature, targetDate); + + if(referenceValue === undefined || referenceValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: process will return"); + referenceValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (! map.has(featureId)){ + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: 0, + intermediateValue: 0 + }; + + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.refValue = referenceValue; + map.set(featureId, mapEntry); + }); + + KmHelper.log("Process computation indicator"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function(geoJSON) { + + geoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if(partValue === undefined || partValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + + if (! map.has(featureId)){ + KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: 0 + }; + + map.set(featureId, mapObject); + } + + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { + + // get spatialUnit feature id as string --> use it to get associated map entry + var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); + + if (! map.has(spatialUnitFeatureId)){ + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: null + }; + + map.set(spatialUnitFeatureId, mapObject); + } + + var mapEntry = map.get(spatialUnitFeatureId); + + var indicatorValue = null; + if(mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to null"); + indicatorValue = null; + } else if(mapEntry.refValue === 0) { + indicatorValue = 0; + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to 0"); + } else { + indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue) * 1000; + } + + // set aggregationWeight as number of citizens + KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); + + // set indicator value for spatialUnitFeature + spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); + + spatialUnitIndex ++; + + // only log after certain progress + if(spatialUnitIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); + } + }); + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js b/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js index b1111251f..ec9321536 100644 --- a/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js +++ b/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,15 +30,10 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorId = "COMPUTATION_ID"; - const parameterName_numberOfTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; - // allowed values ['YEARS', 'MONTHS', 'DAYS'] -const parameterName_temporalType = "TEMPORAL_TYPE" - - +const parameterName_temporalType = "TEMPORAL_TYPE"; /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -60,44 +51,36 @@ const parameterName_temporalType = "TEMPORAL_TYPE" * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { // get the id to be used for calculations var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); var numberOfTemporalItems = KmHelper.getProcessParameterByName_asNumber(parameterName_numberOfTemporalItems, processParameters); - - // get the indicator using the computationIndicatorId - var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap) - KmHelper.log("Retrieved required computationIndicator successfully."); - + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap); + KmHelper.log("Retrieved required computationIndicator successfully."); // now we compute the new indicator for a relative change compared to previous year // internally tests are run, e.g. if a previous year is available or not var resultMap = new Map(); - - if(temporalType === "YEARS"){ - resultMap = KmHelper.changeRelative_n_years_percent(computationIndicator, targetDate, numberOfTemporalItems); - } - else if(temporalType === "MONTHS"){ - resultMap = KmHelper.changeRelative_n_months_percent(computationIndicator, targetDate, numberOfTemporalItems); - } - else if(temporalType === "DAYS"){ - resultMap = KmHelper.changeRelative_n_days_percent(computationIndicator, targetDate, numberOfTemporalItems); - } - else{ - KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); - resultMap = KmHelper.changeRelative_n_years_percent(computationIndicator, targetDate, numberOfTemporalItems); - } - - + if (temporalType === "YEARS") { + resultMap = KmHelper.changeRelative_n_years_percent(computationIndicator, targetDate, numberOfTemporalItems); + } + else if (temporalType === "MONTHS") { + resultMap = KmHelper.changeRelative_n_months_percent(computationIndicator, targetDate, numberOfTemporalItems); + } + else if (temporalType === "DAYS") { + resultMap = KmHelper.changeRelative_n_days_percent(computationIndicator, targetDate, numberOfTemporalItems); + } + else { + KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); + resultMap = KmHelper.changeRelative_n_years_percent(computationIndicator, targetDate, numberOfTemporalItems); + } var numFeatures = targetSpatialUnit_geoJSON.features.length; KmHelper.log("Computed change indicator for a total amount of " + numFeatures + " features"); targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); KmHelper.log("Computation of relative change compared to previous year finished"); return targetSpatialUnit_geoJSON; } - /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -113,22 +96,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -139,12 +122,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -158,74 +139,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -239,59 +206,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_relChange_nTemporalItems.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js.map b/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js.map new file mode 100644 index 000000000..2461af25e --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_relChange_nTemporalItems.js","sourceRoot":"","sources":["km_indicator_relChange_nTemporalItems.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.ts b/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.ts new file mode 100644 index 000000000..b1111251f --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_relChange_nTemporalItems.ts @@ -0,0 +1,297 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +const parameterName_numberOfTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + +// allowed values ['YEARS', 'MONTHS', 'DAYS'] +const parameterName_temporalType = "TEMPORAL_TYPE" + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + // get the id to be used for calculations + var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); + var numberOfTemporalItems = KmHelper.getProcessParameterByName_asNumber(parameterName_numberOfTemporalItems, processParameters); + + + // get the indicator using the computationIndicatorId + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap) + KmHelper.log("Retrieved required computationIndicator successfully."); + + // now we compute the new indicator for a relative change compared to previous year + // internally tests are run, e.g. if a previous year is available or not + var resultMap = new Map(); + + if(temporalType === "YEARS"){ + resultMap = KmHelper.changeRelative_n_years_percent(computationIndicator, targetDate, numberOfTemporalItems); + } + else if(temporalType === "MONTHS"){ + resultMap = KmHelper.changeRelative_n_months_percent(computationIndicator, targetDate, numberOfTemporalItems); + } + else if(temporalType === "DAYS"){ + resultMap = KmHelper.changeRelative_n_days_percent(computationIndicator, targetDate, numberOfTemporalItems); + } + else{ + KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); + resultMap = KmHelper.changeRelative_n_years_percent(computationIndicator, targetDate, numberOfTemporalItems); + } + + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + KmHelper.log("Computed change indicator for a total amount of " + numFeatures + " features"); + targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); + KmHelper.log("Computation of relative change compared to previous year finished"); + return targetSpatialUnit_geoJSON; +} + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_relChange_refDate.js b/app/kommonitor-script-resources/km_indicator_relChange_refDate.js index 1db67d3c2..ae7dcdcb7 100644 --- a/app/kommonitor-script-resources/km_indicator_relChange_refDate.js +++ b/app/kommonitor-script-resources/km_indicator_relChange_refDate.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,13 +30,8 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorId = "COMPUTATION_ID"; - const parameterName_referenceDATE = "REFERENCE_DATE"; - - - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -58,28 +49,23 @@ const parameterName_referenceDATE = "REFERENCE_DATE"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { // get the id to be used for calculations var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); // get reference date var referenceDate = KmHelper.getProcessParameterByName_asString(parameterName_referenceDATE, processParameters); - // get the indicator using the computationIndicatorId - var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap) - KmHelper.log("Retrieved required computationIndicator successfully."); - + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap); + KmHelper.log("Retrieved required computationIndicator successfully."); // now we compute the new indicator for an absolute change compared to previous year // internally tests are run, e.g. if a previous year is available or not var resultMap = KmHelper.changeRelative_referenceDate_percent(computationIndicator, targetDate, referenceDate); - var numFeatures = targetSpatialUnit_geoJSON.features.length; KmHelper.log("Computed change indicator for a total amount of " + numFeatures + " features"); targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); KmHelper.log("Computation of absolute change compared to previous year finished"); return targetSpatialUnit_geoJSON; } - /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -95,22 +81,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -121,12 +107,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -140,74 +124,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -221,59 +191,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_relChange_refDate.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_relChange_refDate.js.map b/app/kommonitor-script-resources/km_indicator_relChange_refDate.js.map new file mode 100644 index 000000000..e5c3196dc --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_relChange_refDate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_relChange_refDate.js","sourceRoot":"","sources":["km_indicator_relChange_refDate.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_relChange_refDate.ts b/app/kommonitor-script-resources/km_indicator_relChange_refDate.ts new file mode 100644 index 000000000..1db67d3c2 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_relChange_refDate.ts @@ -0,0 +1,279 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +const parameterName_referenceDATE = "REFERENCE_DATE"; + + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + // get the id to be used for calculations + var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + // get reference date + var referenceDate = KmHelper.getProcessParameterByName_asString(parameterName_referenceDATE, processParameters); + + // get the indicator using the computationIndicatorId + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap) + KmHelper.log("Retrieved required computationIndicator successfully."); + + // now we compute the new indicator for an absolute change compared to previous year + // internally tests are run, e.g. if a previous year is available or not + var resultMap = KmHelper.changeRelative_referenceDate_percent(computationIndicator, targetDate, referenceDate); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + KmHelper.log("Computed change indicator for a total amount of " + numFeatures + " features"); + targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); + KmHelper.log("Computation of absolute change compared to previous year finished"); + return targetSpatialUnit_geoJSON; +} + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_share.js b/app/kommonitor-script-resources/km_indicator_share.js index ba82ba24b..4a0006370 100644 --- a/app/kommonitor-script-resources/km_indicator_share.js +++ b/app/kommonitor-script-resources/km_indicator_share.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,10 +30,8 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "AVERAGE"; - const parameterName_referenceIndicatorId = "REFERENCE_ID"; const parameterName_computationIndicatorId = "COMPUTATION_ID"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -55,162 +49,137 @@ const parameterName_computationIndicatorId = "COMPUTATION_ID"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - - var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); - var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); - - var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); - var computationIndicatorIds_array = computationIndicatorIds.split(','); - var computationGeoJSON_array = []; - for (const indicatorID of computationIndicatorIds_array){ - computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; - - KmHelper.log("Retrieved required baseIndicators successfully"); - - // now we compute the new indicator - KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); - - /** - * create a map to store indicator values for each feature of the target spatial unit - * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator - * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator - */ - var map = new Map(); - - KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - referenceGeoJSON.features.forEach(function(feature) { +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); + var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array) { + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap)); + } + ; + KmHelper.log("Retrieved required baseIndicators successfully"); + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + referenceGeoJSON.features.forEach(function (feature) { // get the unique featureID of the spatial unit feature as String var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); // get the time series value of the base indicator feature for the requested target date (with its required prefix!) var referenceValue = KmHelper.getIndicatorValue(feature, targetDate); - - if(referenceValue === undefined || referenceValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: process will return"); - referenceValue = 0; + if (referenceValue === undefined || referenceValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: process will return"); + referenceValue = 0; } - // modify map object (i.e. set value initially, or perform calculations and store modified value) + // modify map object (i.e. set value initially, or perform calculations and store modified value) // key should be unique featureId of the spatial unit feature - if (! map.has(featureId)){ + if (!map.has(featureId)) { var mapObject = { featureId: featureId, indicatorValue: undefined, refValue: 0, - intermediateValue: 0 - }; - - map.set(featureId, mapObject); + intermediateValue: 0 + }; + map.set(featureId, mapObject); } - var mapEntry = map.get(featureId); - mapEntry.refValue = referenceValue; + var mapEntry = map.get(featureId); + mapEntry.refValue = referenceValue; map.set(featureId, mapEntry); - }); - - KmHelper.log("Process computation indicator"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - computationGeoJSON_array.forEach(function(geoJSON) { - - geoJSON.features.forEach(function(feature) { - // get the unique featureID of the spatial unit feature as String - var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); - // get the time series value of the base indicator feature for the requested target date (with its required prefix!) - var partValue = KmHelper.getIndicatorValue(feature, targetDate); - if(partValue === undefined || partValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); - partValue = 0; - } - // modify map object (i.e. set value initially, or perform calculations and store modified value) - // key should be unique featureId of the spatial unit feature - - if (! map.has(featureId)){ - KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); - var mapObject = { - featureId: featureId, - indicatorValue: undefined, - refValue: null, - intermediateValue: 0 + }); + KmHelper.log("Process computation indicator"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function (geoJSON) { + geoJSON.features.forEach(function (feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if (partValue === undefined || partValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (!map.has(featureId)) { + KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: 0 }; - - map.set(featureId, mapObject); - } - - var mapEntry = map.get(featureId); - mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; - map.set(featureId, mapEntry); - }); - }); - - var numFeatures = targetSpatialUnit_geoJSON.features.length; - - // now we compute the new indicator - KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); - - // iterate once over target spatial unit features and compute indicator utilizing map entries - var spatialUnitIndex = 0; - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); - targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { - + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + var numFeatures = targetSpatialUnit_geoJSON.features.length; + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function (spatialUnitFeature) { // get spatialUnit feature id as string --> use it to get associated map entry var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); - - if (! map.has(spatialUnitFeatureId)){ - KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); - var mapObject = { - featureId: spatialUnitFeatureId, - indicatorValue: undefined, - refValue: null, - intermediateValue: null - }; - - map.set(spatialUnitFeatureId, mapObject); - } - - var mapEntry = map.get(spatialUnitFeatureId); - - var indicatorValue = null; - if(mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("INFO: indicator value is set to null"); - indicatorValue = null; - } else if(mapEntry.refValue === 0) { - indicatorValue = 0; - KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); - KmHelper.log("INFO: indicator value is set to 0"); - } else { - indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue); - } - + if (!map.has(spatialUnitFeatureId)) { + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: null + }; + map.set(spatialUnitFeatureId, mapObject); + } + var mapEntry = map.get(spatialUnitFeatureId); + var indicatorValue = null; + if (mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to null"); + indicatorValue = null; + } + else if (mapEntry.refValue === 0) { + indicatorValue = 0; + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to 0"); + } + else { + indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue); + } // set aggregationWeight as number of citizens KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); - // set indicator value for spatialUnitFeature spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); - - spatialUnitIndex ++; - + spatialUnitIndex++; // only log after certain progress - if(spatialUnitIndex % logProgressIndexSeparator === 0){ + if (spatialUnitIndex % logProgressIndexSeparator === 0) { KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); } - }); - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + }); + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -226,22 +195,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -252,12 +221,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -271,74 +238,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -352,59 +305,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_share.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_share.js.map b/app/kommonitor-script-resources/km_indicator_share.js.map new file mode 100644 index 000000000..2664c97d0 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_share.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_share.js","sourceRoot":"","sources":["km_indicator_share.ts"],"names":[],"mappings":";AAAA,8JAA8J;AAC9J,yRAAyR;AACzR,8JAA8J;AAC9J,4GAA4G;AAC5G,8JAA8J;AAE9J;;;EAGE;AACF,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAGrC,8JAA8J;AAC9J,8JAA8J;AAC9J,6OAA6O;AAC7O,8JAA8J;AAE9J;;;;;;;EAOE;AACF,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAE/C;;;;;;EAME;AACF,MAAM,eAAe,GAAG,SAAS,CAAC;AAElC,MAAM,kCAAkC,GAAG,cAAc,CAAC;AAC1D,MAAM,oCAAoC,GAAG,gBAAgB,CAAC;AAE9D;;;;;;;;;;;;;;;;EAgBE;AACF,KAAK,UAAU,gBAAgB,CAAC,UAAU,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB;IAEzH,IAAI,oBAAoB,GAAG,QAAQ,CAAC,kCAAkC,CAAC,kCAAkC,EAAE,iBAAiB,CAAC,CAAC;IAC9H,IAAI,gBAAgB,GAAG,QAAQ,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;IAE3F,IAAI,uBAAuB,GAAG,QAAQ,CAAC,kCAAkC,CAAC,oCAAoC,EAAE,iBAAiB,CAAC,CAAC;IACtI,IAAI,6BAA6B,GAAG,uBAAuB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvE,IAAI,wBAAwB,GAAG,EAAE,CAAC;IAClC,KAAK,MAAM,WAAW,IAAI,6BAA6B,EAAC;QACzD,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAA;KAAC;IAAA,CAAC;IAE1F,QAAQ,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAE/D,mCAAmC;IACnC,QAAQ,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;IAE9F;;;;MAIE;IACF,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAEpB,QAAQ,CAAC,GAAG,CAAC,+BAA+B,GAAG,oBAAoB,GAAG,GAAG,CAAC,CAAC;IAE3E;;;MAGE;IACF,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAS,OAAO;QAChD,iEAAiE;QACjE,IAAI,SAAS,GAAG,QAAQ,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAC/D,oHAAoH;QACpH,IAAI,cAAc,GAAG,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAErE,IAAG,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,EAAC;YACzD,QAAQ,CAAC,GAAG,CAAC,uCAAuC,GAAG,SAAS,GAAG,yDAAyD,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC;YACjJ,QAAQ,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC7C,cAAc,GAAG,CAAC,CAAC;SACpB;QACP,iGAAiG;QAC3F,6DAA6D;QAC7D,IAAI,CAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAC;YACrB,IAAI,SAAS,GAAG;gBACZ,SAAS,EAAE,SAAS;gBACpB,cAAc,EAAE,SAAS;gBACzB,QAAQ,EAAE,CAAC;gBACvB,iBAAiB,EAAE,CAAC;aACP,CAAC;YAEN,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;SACjC;QACP,IAAI,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClC,QAAQ,CAAC,QAAQ,GAAG,cAAc,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEL,QAAQ,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE9C;;;MAGE;IACL,wBAAwB,CAAC,OAAO,CAAC,UAAS,OAAO;QAEhD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAS,OAAO;YACxC,iEAAiE;YACjE,IAAI,SAAS,GAAG,QAAQ,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;YAC/D,oHAAoH;YACpH,IAAI,SAAS,GAAG,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAChE,IAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAC;gBAChD,QAAQ,CAAC,GAAG,CAAC,uCAAuC,GAAG,SAAS,GAAG,yDAAyD,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC;gBACjJ,QAAQ,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;gBACjG,SAAS,GAAG,CAAC,CAAC;aACb;YACD,iGAAiG;YAC7F,6DAA6D;YAE7D,IAAI,CAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAC;gBACvB,QAAQ,CAAC,GAAG,CAAC,yCAAyC,GAAG,SAAS,GAAG,4EAA4E,CAAC,CAAC;gBACnJ,IAAI,SAAS,GAAG;oBACZ,SAAS,EAAE,SAAS;oBACpB,cAAc,EAAE,SAAS;oBACzB,QAAQ,EAAE,IAAI;oBAClB,iBAAiB,EAAE,CAAC;iBACf,CAAC;gBAEN,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACjC;YAEH,IAAI,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClC,QAAQ,CAAC,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACpE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,GAAG,yBAAyB,CAAC,QAAQ,CAAC,MAAM,CAAC;IAE5D,mCAAmC;IACnC,QAAQ,CAAC,GAAG,CAAC,0CAA0C,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;IAErF,6FAA6F;IAC7F,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,0DAA0D;IAC1D,IAAI,yBAAyB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;IACnE,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAS,kBAAkB;QAEpE,8EAA8E;QAC9E,IAAI,oBAAoB,GAAG,QAAQ,CAAC,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;QAErF,IAAI,CAAE,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,uCAAuC,GAAG,oBAAoB,GAAG,kFAAkF,CAAC,CAAC;YACtK,IAAI,SAAS,GAAG;gBACR,SAAS,EAAE,oBAAoB;gBAC/B,cAAc,EAAE,SAAS;gBACzB,QAAQ,EAAE,IAAI;gBACd,iBAAiB,EAAE,IAAI;aACtB,CAAC;YAEN,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;SAC5C;QAEC,IAAI,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAEnD,IAAI,cAAc,GAAG,IAAI,CAAC;QACpB,IAAG,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,iBAAiB,KAAK,IAAI,EAAC;YACzI,QAAQ,CAAC,GAAG,CAAC,uCAAuC,GAAG,oBAAoB,GAAG,yDAAyD,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC;YAC5J,QAAQ,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACrD,cAAc,GAAG,IAAI,CAAC;SAC3B;aAAM,IAAG,QAAQ,CAAC,QAAQ,KAAK,CAAC,EAAE;YAClC,cAAc,GAAG,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,uCAAuC,GAAG,oBAAoB,GAAG,qDAAqD,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC;YACxJ,QAAQ,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;SACjD;aAAM;YACN,cAAc,GAAG,CAAC,QAAQ,CAAC,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;SAClE;QAEE,8CAA8C;QAC9C,QAAQ,CAAC,oBAAoB,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QAElE,6CAA6C;QAC7C,kBAAkB,GAAG,QAAQ,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;QAEhG,gBAAgB,EAAG,CAAC;QAEpB,kCAAkC;QAClC,IAAG,gBAAgB,GAAG,yBAAyB,KAAK,CAAC,EAAC;YAClD,QAAQ,CAAC,GAAG,CAAC,sBAAsB,GAAG,gBAAgB,GAAG,cAAc,GAAG,WAAW,GAAG,aAAa,CAAC,CAAC;SAC1G;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAElD,OAAO,yBAAyB,CAAC;AACvC,CAAC;AAAA,CAAC;AAEF;;;;;;;;;;;;;;EAcE;AACF,SAAS,kBAAkB,CAAC,UAAU,EAAE,yBAAyB,EAAE,iBAAiB;IAClF,sBAAsB;IACtB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAC;QACjD,OAAO,CAAC,GAAG,CAAC,0GAA0G,GAAG,eAAe;YACtI,yBAAyB,GAAG,mBAAmB,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,iBAAiB,CAAC,UAAU,EAAE,yBAAyB,EAAE,iBAAiB,CAAC,CAAC;KACpF;SACI,IAAG,eAAe,KAAK,KAAK,EAAC;QAChC,OAAO,aAAa,CAAC,UAAU,EAAE,yBAAyB,EAAE,iBAAiB,CAAC,CAAC;KAChF;SACI;QACH,OAAO,iBAAiB,CAAC,UAAU,EAAE,yBAAyB,EAAE,iBAAiB,CAAC,CAAC;KACpF;AACH,CAAC;AAAA,CAAC;AAEF;;;;;;;;;EASE;AACF,SAAS,qBAAqB,CAAC,UAAU,EAAE,yBAAyB,EAAE,iBAAiB;IACrF,yBAAyB;AAE3B,CAAC;AAAA,CAAC;AAGF;;;;;;;;;;;;EAYE;AACF,SAAS,iBAAiB,CAAC,UAAU,EAAE,yBAAyB,EAAE,iBAAiB;IACjF,sBAAsB;IAEtB,IAAI,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC;IAEnD,QAAQ,CAAC,GAAG,CAAC,qCAAqC,GAAG,UAAU,GAAG,yBAAyB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,MAAM,GAAG,6CAA6C,CAAC,CAAC;IACzL,QAAQ,CAAC,GAAG,CAAC,mCAAmC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;IACxG,QAAQ,CAAC,GAAG,CAAC,+KAA+K,CAAC,CAAC;IAE9L,UAAU,GAAG,QAAQ,CAAC,+BAA+B,CAAC,UAAU,CAAC,CAAC;IAClE,QAAQ,CAAC,GAAG,CAAC,2BAA2B,GAAG,UAAU,CAAC,CAAC;IAEvD,mEAAmE;IACnE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAC;QAC5D,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAE5D,gBAAgB,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;KAClD;IAED,oCAAoC;IACpC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAS,aAAa;QAEhE,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,wBAAwB,GAAG,CAAC,CAAC;QAChC,IAAI,cAAc,GAAG,CAAC,CAAC;QAExB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAC;YAC7D,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAG,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,EAAC;gBACrD,wCAAwC;gBACxC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAChC,KAAK,EAAE,CAAC;gBACR,cAAc,EAAE,CAAC;gBAEjB,4GAA4G;gBAC1G,IAAG,CAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,SAAS,EAAC;oBACtK,uGAAuG;oBACvG,sEAAsE;oBACtE,IAAI,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;oBAE7D,2CAA2C;oBAC3C,wBAAwB,IAAI,MAAM,CAAC;oBACnC,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC;iBAClG;aACN;SACD;QAED,4BAA4B;QAC3B,IAAG,wBAAwB,KAAK,CAAC,EAAC;YAChC,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;SACnD;aACI;YACD,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,wBAAwB,CAAC,CAAC;SAC5G;QACD,sFAAsF;IACxF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAErC,IAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,mDAAmD,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC9F,MAAM,KAAK,CAAC,6DAA6D,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;KACvG;IAED,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAAA,CAAC;AAEF;;;;;;;;;;;;EAYE;AACF,SAAS,aAAa,CAAC,UAAU,EAAE,yBAAyB,EAAE,iBAAiB;IAC7E,sBAAsB;IAEtB,IAAI,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC;IAEnD,QAAQ,CAAC,GAAG,CAAC,qCAAqC,GAAG,UAAU,GAAG,yBAAyB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,MAAM,GAAG,yCAAyC,CAAC,CAAC;IACrL,QAAQ,CAAC,GAAG,CAAC,mCAAmC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;IACxG,QAAQ,CAAC,GAAG,CAAC,mGAAmG,CAAC,CAAC;IAElH,UAAU,GAAG,QAAQ,CAAC,+BAA+B,CAAC,UAAU,CAAC,CAAC;IAClE,QAAQ,CAAC,GAAG,CAAC,2BAA2B,GAAG,UAAU,CAAC,CAAC;IAEvD,IAAI,gCAAgC,GAAG,CAAC,CAAC;IAEzC,mEAAmE;IACnE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAC;QAC5D,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAE5D,gBAAgB,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;KAClD;IAED,uCAAuC;IACvC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAS,aAAa;QAEhE,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,4CAA4C,GAAG,CAAC,CAAC;QAErD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAC;YAC7D,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAG,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,EAAC;gBACrD,wCAAwC;gBACxC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAChC,KAAK,EAAE,CAAC;gBACX,4CAA4C,EAAE,CAAC;gBAC/C,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;aACxF;SACD;QACA,gCAAgC,IAAI,4CAA4C,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACrC,QAAQ,CAAC,GAAG,CAAC,gCAAgC,GAAG,+BAA+B,GAAG,yBAAyB,CAAC,QAAQ,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;IAEjJ,IAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,mDAAmD,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC9F,MAAM,KAAK,CAAC,6DAA6D,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;KACvG;IAED,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAAA,CAAC;AAGF,MAAM,CAAC,OAAO,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;AACnD,MAAM,CAAC,OAAO,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AACvD,MAAM,CAAC,OAAO,CAAC,qBAAqB,GAAG,qBAAqB,CAAC"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_share.ts b/app/kommonitor-script-resources/km_indicator_share.ts new file mode 100644 index 000000000..ba82ba24b --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_share.ts @@ -0,0 +1,410 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "AVERAGE"; + +const parameterName_referenceIndicatorId = "REFERENCE_ID"; +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); + var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); + + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array){ + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; + + KmHelper.log("Retrieved required baseIndicators successfully"); + + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + + KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + referenceGeoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var referenceValue = KmHelper.getIndicatorValue(feature, targetDate); + + if(referenceValue === undefined || referenceValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: process will return"); + referenceValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (! map.has(featureId)){ + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: 0, + intermediateValue: 0 + }; + + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.refValue = referenceValue; + map.set(featureId, mapEntry); + }); + + KmHelper.log("Process computation indicator"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function(geoJSON) { + + geoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if(partValue === undefined || partValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + + if (! map.has(featureId)){ + KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: 0 + }; + + map.set(featureId, mapObject); + } + + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { + + // get spatialUnit feature id as string --> use it to get associated map entry + var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); + + if (! map.has(spatialUnitFeatureId)){ + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: null + }; + + map.set(spatialUnitFeatureId, mapObject); + } + + var mapEntry = map.get(spatialUnitFeatureId); + + var indicatorValue = null; + if(mapEntry.refValue === undefined || mapEntry.refValue === null || mapEntry.refValue === undefined || mapEntry.intermediateValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to null"); + indicatorValue = null; + } else if(mapEntry.refValue === 0) { + indicatorValue = 0; + KmHelper.log("WARNING: the feature with featureID '" + spatialUnitFeatureId + "' cotains a '0' as numerator value for targetDate '" + targetDate + "'"); + KmHelper.log("INFO: indicator value is set to 0"); + } else { + indicatorValue = (mapEntry.intermediateValue / mapEntry.refValue); + } + + // set aggregationWeight as number of citizens + KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); + + // set indicator value for spatialUnitFeature + spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); + + spatialUnitIndex ++; + + // only log after certain progress + if(spatialUnitIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); + } + }); + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_subtract.js b/app/kommonitor-script-resources/km_indicator_subtract.js index 3e9018f5f..dff5e54cd 100644 --- a/app/kommonitor-script-resources/km_indicator_subtract.js +++ b/app/kommonitor-script-resources/km_indicator_subtract.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,10 +30,8 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_referenceIndicatorId = "REFERENCE_ID"; const parameterName_computationIndicatorId = "COMPUTATION_ID"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -55,156 +49,126 @@ const parameterName_computationIndicatorId = "COMPUTATION_ID"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - - var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); - var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); - - var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); - var computationIndicatorIds_array = computationIndicatorIds.split(','); - var computationGeoJSON_array = []; - for (const indicatorID of computationIndicatorIds_array){ - computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; - - KmHelper.log("Retrieved required baseIndicators successfully"); - - // now we compute the new indicator - KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); - - /** - * create a map to store indicator values for each feature of the target spatial unit - * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator - * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator - */ - var map = new Map(); - - KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - referenceGeoJSON.features.forEach(function(feature) { +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); + var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array) { + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap)); + } + ; + KmHelper.log("Retrieved required baseIndicators successfully"); + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + referenceGeoJSON.features.forEach(function (feature) { // get the unique featureID of the spatial unit feature as String var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); // get the time series value of the base indicator feature for the requested target date (with its required prefix!) var referenceValue = KmHelper.getIndicatorValue(feature, targetDate); - - if(referenceValue === undefined || referenceValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - referenceValue = 0; + if (referenceValue === undefined || referenceValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + referenceValue = 0; } - // modify map object (i.e. set value initially, or perform calculations and store modified value) + // modify map object (i.e. set value initially, or perform calculations and store modified value) // key should be unique featureId of the spatial unit feature - if (! map.has(featureId)){ + if (!map.has(featureId)) { var mapObject = { featureId: featureId, indicatorValue: undefined, refValue: 0, - intermediateValue: 0 - }; - - map.set(featureId, mapObject); + intermediateValue: 0 + }; + map.set(featureId, mapObject); } - var mapEntry = map.get(featureId); - mapEntry.refValue = referenceValue; - map.set(featureId, mapEntry); - }); - - KmHelper.log("Process computation indicator"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - computationGeoJSON_array.forEach(function(geoJSON) { - - geoJSON.features.forEach(function(feature) { - // get the unique featureID of the spatial unit feature as String - var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); - // get the time series value of the base indicator feature for the requested target date (with its required prefix!) - var partValue = KmHelper.getIndicatorValue(feature, targetDate); - if(partValue === undefined || partValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); - partValue = 0; - } - - if (! map.has(featureId)){ - KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); - var mapObject = { - featureId: featureId, - indicatorValue: undefined, - refValue: null, - intermediateValue: 0 - }; - - map.set(featureId, mapObject); - } - - // modify map object (i.e. set value initially, or perform calculations and store modified value) - // key should be unique featureId of the spatial unit feature var mapEntry = map.get(featureId); - - mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; - + mapEntry.refValue = referenceValue; map.set(featureId, mapEntry); - }); - }); - - var numFeatures = targetSpatialUnit_geoJSON.features.length; - - // now we compute the new indicator - KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); - - // iterate once over target spatial unit features and compute indicator utilizing map entries - var spatialUnitIndex = 0; - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); - targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { - + }); + KmHelper.log("Process computation indicator"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function (geoJSON) { + geoJSON.features.forEach(function (feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if (partValue === undefined || partValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + if (!map.has(featureId)) { + KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: 0 + }; + map.set(featureId, mapObject); + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + var numFeatures = targetSpatialUnit_geoJSON.features.length; + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function (spatialUnitFeature) { // get spatialUnit feature id as string --> use it to get associated map entry var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); - - if (! map.has(spatialUnitFeatureId)){ - KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); - var mapObject = { - featureId: spatialUnitFeatureId, - indicatorValue: undefined, - refValue: null, - intermediateValue: null - }; - - map.set(spatialUnitFeatureId, mapObject); - } - + if (!map.has(spatialUnitFeatureId)) { + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: null + }; + map.set(spatialUnitFeatureId, mapObject); + } var mapEntry = map.get(spatialUnitFeatureId); - var indicatorValue = null; - - if(mapEntry && mapEntry.refValue != null && mapEntry.intermediateValue != null){ - indicatorValue = mapEntry.refValue - mapEntry.intermediateValue; + if (mapEntry && mapEntry.refValue != null && mapEntry.intermediateValue != null) { + indicatorValue = mapEntry.refValue - mapEntry.intermediateValue; } - // set aggregationWeight as number of citizens KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); - // set indicator value for spatialUnitFeature spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); - - spatialUnitIndex ++; - + spatialUnitIndex++; // only log after certain progress - if(spatialUnitIndex % logProgressIndexSeparator === 0){ + if (spatialUnitIndex % logProgressIndexSeparator === 0) { KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); } - }); - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + }); + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -220,22 +184,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -246,12 +210,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -265,74 +227,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -346,59 +294,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_subtract.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_subtract.js.map b/app/kommonitor-script-resources/km_indicator_subtract.js.map new file mode 100644 index 000000000..c25cf17f7 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_subtract.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_subtract.js","sourceRoot":"","sources":["km_indicator_subtract.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_subtract.ts b/app/kommonitor-script-resources/km_indicator_subtract.ts new file mode 100644 index 000000000..3e9018f5f --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_subtract.ts @@ -0,0 +1,404 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_referenceIndicatorId = "REFERENCE_ID"; +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + var referenceIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_referenceIndicatorId, processParameters); + var referenceGeoJSON = KmHelper.getBaseIndicatorById(referenceIndicatorId, baseIndicatorsMap); + + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array){ + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; + + KmHelper.log("Retrieved required baseIndicators successfully"); + + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + + KmHelper.log("Process reference indicator '" + referenceIndicatorId + "'"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + referenceGeoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var referenceValue = KmHelper.getIndicatorValue(feature, targetDate); + + if(referenceValue === undefined || referenceValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + referenceValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (! map.has(featureId)){ + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: 0, + intermediateValue: 0 + }; + + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.refValue = referenceValue; + map.set(featureId, mapEntry); + }); + + KmHelper.log("Process computation indicator"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function(geoJSON) { + + geoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if(partValue === undefined || partValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + + if (! map.has(featureId)){ + KmHelper.log("Computation Indicator feature with id '" + featureId + "' was not computed from computation resources. Will set ref value to null."); + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: 0 + }; + + map.set(featureId, mapObject); + } + + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + var mapEntry = map.get(featureId); + + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + + map.set(featureId, mapEntry); + }); + }); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { + + // get spatialUnit feature id as string --> use it to get associated map entry + var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); + + if (! map.has(spatialUnitFeatureId)){ + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: undefined, + refValue: null, + intermediateValue: null + }; + + map.set(spatialUnitFeatureId, mapObject); + } + + var mapEntry = map.get(spatialUnitFeatureId); + + var indicatorValue = null; + + if(mapEntry && mapEntry.refValue != null && mapEntry.intermediateValue != null){ + indicatorValue = mapEntry.refValue - mapEntry.intermediateValue; + } + + // set aggregationWeight as number of citizens + KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); + + // set indicator value for spatialUnitFeature + spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); + + spatialUnitIndex ++; + + // only log after certain progress + if(spatialUnitIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); + } + }); + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_sum.js b/app/kommonitor-script-resources/km_indicator_sum.js index 0d14e7d51..68123e54e 100644 --- a/app/kommonitor-script-resources/km_indicator_sum.js +++ b/app/kommonitor-script-resources/km_indicator_sum.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,9 +30,7 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorId = "COMPUTATION_ID"; - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -54,108 +48,89 @@ const parameterName_computationIndicatorId = "COMPUTATION_ID"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - - var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); - var computationIndicatorIds_array = computationIndicatorIds.split(','); - var computationGeoJSON_array = []; - for (const indicatorID of computationIndicatorIds_array){ - computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; - - KmHelper.log("Retrieved required baseIndicators successfully"); - - // now we compute the new indicator - KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); - - /** - * create a map to store indicator values for each feature of the target spatial unit - * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator - * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator - */ - var map = new Map(); - - KmHelper.log("Process computation indicator"); - - /** - * iterate over each feature of the baseIndicator and use its indicator value to modify map object - * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! - */ - computationGeoJSON_array.forEach(function(geoJSON) { - - geoJSON.features.forEach(function(feature) { - // get the unique featureID of the spatial unit feature as String - var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); - // get the time series value of the base indicator feature for the requested target date (with its required prefix!) - var partValue = KmHelper.getIndicatorValue(feature, targetDate); - if(partValue === undefined || partValue === null){ - KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); - KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); - partValue = 0; - } - // modify map object (i.e. set value initially, or perform calculations and store modified value) - // key should be unique featureId of the spatial unit feature - if (! map.has(featureId)){ - var mapObject = { - featureId: featureId, - indicatorValue: undefined, - intermediateValue: 0 - }; - map.set(featureId, mapObject); - } - var mapEntry = map.get(featureId); - mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; - map.set(featureId, mapEntry); - }); - }); - - var numFeatures = targetSpatialUnit_geoJSON.features.length; - - // now we compute the new indicator - KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); - - // iterate once over target spatial unit features and compute indicator utilizing map entries - var spatialUnitIndex = 0; - // create progress log after each 10th percent of features - var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); - targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array) { + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap)); + } + ; + KmHelper.log("Retrieved required baseIndicators successfully"); + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + KmHelper.log("Process computation indicator"); + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function (geoJSON) { + geoJSON.features.forEach(function (feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if (partValue === undefined || partValue === null) { + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (!map.has(featureId)) { + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + intermediateValue: 0 + }; + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + var numFeatures = targetSpatialUnit_geoJSON.features.length; + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function (spatialUnitFeature) { // get spatialUnit feature id as string --> use it to get associated map entry var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); - - if (! map.has(spatialUnitFeatureId)){ - KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); - var mapObject = { - featureId: spatialUnitFeatureId, - indicatorValue: null, - intermediateValue: null - }; - map.set(spatialUnitFeatureId, mapObject); - } - + if (!map.has(spatialUnitFeatureId)) { + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: null, + intermediateValue: null + }; + map.set(spatialUnitFeatureId, mapObject); + } var mapEntry = map.get(spatialUnitFeatureId); - - var indicatorValue = mapEntry.intermediateValue; - // set aggregationWeight as number of citizens KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); - // set indicator value for spatialUnitFeature spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); - - spatialUnitIndex ++; - + spatialUnitIndex++; // only log after certain progress - if(spatialUnitIndex % logProgressIndexSeparator === 0){ + if (spatialUnitIndex % logProgressIndexSeparator === 0) { KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); } - }); - - KmHelper.log("Computation of indicator finished"); - - return targetSpatialUnit_geoJSON; -}; - + }); + KmHelper.log("Computation of indicator finished"); + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -171,22 +146,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -197,12 +172,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -216,74 +189,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -297,59 +256,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_sum.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_sum.js.map b/app/kommonitor-script-resources/km_indicator_sum.js.map new file mode 100644 index 000000000..907fe97f3 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_sum.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_sum.js","sourceRoot":"","sources":["km_indicator_sum.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_sum.ts b/app/kommonitor-script-resources/km_indicator_sum.ts new file mode 100644 index 000000000..0d14e7d51 --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_sum.ts @@ -0,0 +1,355 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + var computationIndicatorIds = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var computationIndicatorIds_array = computationIndicatorIds.split(','); + var computationGeoJSON_array = []; + for (const indicatorID of computationIndicatorIds_array){ + computationGeoJSON_array.push(KmHelper.getBaseIndicatorById(indicatorID, baseIndicatorsMap))}; + + KmHelper.log("Retrieved required baseIndicators successfully"); + + // now we compute the new indicator + KmHelper.log("Iterate over base indicators and save intermediate values within a map object"); + + /** + * create a map to store indicator values for each feature of the target spatial unit + * by using such a map object, we can ensure, that we only iterate ONCE over each bease indicator + * and also can only iterate ONCE over each target spatial unit feature at the end to compute the indicator + */ + var map = new Map(); + + KmHelper.log("Process computation indicator"); + + /** + * iterate over each feature of the baseIndicator and use its indicator value to modify map object + * NOTE use spatialUnitFeatureId as key to be able to identify entries by their unique feature id! + */ + computationGeoJSON_array.forEach(function(geoJSON) { + + geoJSON.features.forEach(function(feature) { + // get the unique featureID of the spatial unit feature as String + var featureId = KmHelper.getSpatialUnitFeatureIdValue(feature); + // get the time series value of the base indicator feature for the requested target date (with its required prefix!) + var partValue = KmHelper.getIndicatorValue(feature, targetDate); + if(partValue === undefined || partValue === null){ + KmHelper.log("WARNING: the feature with featureID '" + featureId + "' does not contain a time series value for targetDate '" + targetDate + "'"); + KmHelper.log("WARNING: the feature value will thus be set to '0' and computation will continue"); + partValue = 0; + } + // modify map object (i.e. set value initially, or perform calculations and store modified value) + // key should be unique featureId of the spatial unit feature + if (! map.has(featureId)){ + var mapObject = { + featureId: featureId, + indicatorValue: undefined, + intermediateValue: 0 + }; + map.set(featureId, mapObject); + } + var mapEntry = map.get(featureId); + mapEntry.intermediateValue = mapEntry.intermediateValue + partValue; + map.set(featureId, mapEntry); + }); + }); + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + + // now we compute the new indicator + KmHelper.log("Compute indicator for a total amount of " + numFeatures + " features"); + + // iterate once over target spatial unit features and compute indicator utilizing map entries + var spatialUnitIndex = 0; + // create progress log after each 10th percent of features + var logProgressIndexSeparator = Math.round(numFeatures / 100 * 10); + targetSpatialUnit_geoJSON.features.forEach(function(spatialUnitFeature) { + + // get spatialUnit feature id as string --> use it to get associated map entry + var spatialUnitFeatureId = KmHelper.getSpatialUnitFeatureIdValue(spatialUnitFeature); + + if (! map.has(spatialUnitFeatureId)){ + KmHelper.log("Target spatial unit feature with id '" + spatialUnitFeatureId + "' was not computed from computation resources. Will set indicator value to null."); + var mapObject = { + featureId: spatialUnitFeatureId, + indicatorValue: null, + intermediateValue: null + }; + map.set(spatialUnitFeatureId, mapObject); + } + + var mapEntry = map.get(spatialUnitFeatureId); + + + var indicatorValue = mapEntry.intermediateValue; + + // set aggregationWeight as number of citizens + KmHelper.setAggregationWeight(spatialUnitFeature, indicatorValue); + + // set indicator value for spatialUnitFeature + spatialUnitFeature = KmHelper.setIndicatorValue(spatialUnitFeature, targetDate, indicatorValue); + + spatialUnitIndex ++; + + // only log after certain progress + if(spatialUnitIndex % logProgressIndexSeparator === 0){ + KmHelper.log("PROGRESS: Computed '" + spatialUnitIndex + "' of total '" + numFeatures + "' features."); + } + }); + + KmHelper.log("Computation of indicator finished"); + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.js b/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.js index ed933875f..1e1b2ef05 100644 --- a/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.js +++ b/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.js @@ -1,21 +1,18 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -25,7 +22,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -34,15 +30,10 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "SUM"; - const parameterName_computationIndicatorId = "COMPUTATION_ID"; - const parameterName_numberOfTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; - // allowed values ['YEARS', 'MONTHS', 'DAYS'] const parameterName_temporalType = "TEMPORAL_TYPE"; - - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -60,43 +51,36 @@ const parameterName_temporalType = "TEMPORAL_TYPE"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { // get the id to be used for calculations var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); - var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); + var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); var numberOfTemporalItems = KmHelper.getProcessParameterByName_asNumber(parameterName_numberOfTemporalItems, processParameters); - // get the indicator using the computationIndicatorId var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap); - KmHelper.log("Retrieved required computationIndicator successfully."); - + KmHelper.log("Retrieved required computationIndicator successfully."); // now we compute the new indicator for the trend within n consecutive years // internally tests are run, e.g. if n previous years are available or not - - var resultMap = new Map(); - - if(temporalType === "YEARS"){ - resultMap = KmHelper.trend_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); - } - else if(temporalType === "MONTHS"){ - resultMap = KmHelper.trend_consecutive_n_months(computationIndicator, targetDate, numberOfTemporalItems); - } - else if(temporalType === "DAYS"){ - resultMap = KmHelper.trend_consecutive_n_days(computationIndicator, targetDate, numberOfTemporalItems); - } - else{ - KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); - resultMap = KmHelper.trend_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); - } - + var resultMap = new Map(); + if (temporalType === "YEARS") { + resultMap = KmHelper.trend_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + else if (temporalType === "MONTHS") { + resultMap = KmHelper.trend_consecutive_n_months(computationIndicator, targetDate, numberOfTemporalItems); + } + else if (temporalType === "DAYS") { + resultMap = KmHelper.trend_consecutive_n_days(computationIndicator, targetDate, numberOfTemporalItems); + } + else { + KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); + resultMap = KmHelper.trend_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } var numFeatures = targetSpatialUnit_geoJSON.features.length; KmHelper.log("Computed trend indicator for a total amount of " + numFeatures + " features"); targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); KmHelper.log("Computation of the trend finished"); return targetSpatialUnit_geoJSON; } - /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -112,22 +96,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -138,12 +122,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -157,74 +139,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -238,59 +206,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=km_indicator_trend_nTemporalItems.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.js.map b/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.js.map new file mode 100644 index 000000000..1f97804fe --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.js.map @@ -0,0 +1 @@ +{"version":3,"file":"km_indicator_trend_nTemporalItems.js","sourceRoot":"","sources":["km_indicator_trend_nTemporalItems.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.ts b/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.ts new file mode 100644 index 000000000..ed933875f --- /dev/null +++ b/app/kommonitor-script-resources/km_indicator_trend_nTemporalItems.ts @@ -0,0 +1,296 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "SUM"; + +const parameterName_computationIndicatorId = "COMPUTATION_ID"; + +const parameterName_numberOfTemporalItems = "NUMBER_OF_TEMPORAL_ITEMS"; + +// allowed values ['YEARS', 'MONTHS', 'DAYS'] +const parameterName_temporalType = "TEMPORAL_TYPE"; + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + + // get the id to be used for calculations + var computationIndicatorId = KmHelper.getProcessParameterByName_asString(parameterName_computationIndicatorId, processParameters); + var temporalType = KmHelper.getProcessParameterByName_asString(parameterName_temporalType, processParameters); + var numberOfTemporalItems = KmHelper.getProcessParameterByName_asNumber(parameterName_numberOfTemporalItems, processParameters); + + // get the indicator using the computationIndicatorId + var computationIndicator = KmHelper.getBaseIndicatorById(computationIndicatorId, baseIndicatorsMap); + KmHelper.log("Retrieved required computationIndicator successfully."); + + // now we compute the new indicator for the trend within n consecutive years + // internally tests are run, e.g. if n previous years are available or not + + var resultMap = new Map(); + + if(temporalType === "YEARS"){ + resultMap = KmHelper.trend_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + else if(temporalType === "MONTHS"){ + resultMap = KmHelper.trend_consecutive_n_months(computationIndicator, targetDate, numberOfTemporalItems); + } + else if(temporalType === "DAYS"){ + resultMap = KmHelper.trend_consecutive_n_days(computationIndicator, targetDate, numberOfTemporalItems); + } + else{ + KmHelper.log("WARNING: parameter '" + parameterName_temporalType + "' with allowed values ['YEARS', 'MONTHS', 'DAYS'] has unknown value '" + temporalType + "'. Will use YEARS as default"); + resultMap = KmHelper.trend_consecutive_n_years(computationIndicator, targetDate, numberOfTemporalItems); + } + + var numFeatures = targetSpatialUnit_geoJSON.features.length; + KmHelper.log("Computed trend indicator for a total amount of " + numFeatures + " features"); + targetSpatialUnit_geoJSON = KmHelper.setIndicatorValues_fromIdValueMap(targetSpatialUnit_geoJSON, targetDate, resultMap); + KmHelper.log("Computation of the trend finished"); + return targetSpatialUnit_geoJSON; +} + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/kommonitor-script-resources/kommonitor-script-template.js b/app/kommonitor-script-resources/kommonitor-script-template.js index d8e3a3ce2..78aeccf58 100644 --- a/app/kommonitor-script-resources/kommonitor-script-template.js +++ b/app/kommonitor-script-resources/kommonitor-script-template.js @@ -1,9 +1,9 @@ +"use strict"; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NECESSARY NODE MODULE DEPENDENCIES // // // // // SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant may be used to perform spatial analysis and geometric operation tasks. * A full-featured API documentation of Turf.js library can be found at {@link http://turfjs.org/}. @@ -15,7 +15,6 @@ * @constant */ const turf = require('@turf/turf'); - /** * This constant may be used to perform statistical computations. * A full-featured API documentation of JStat.js library can be found at {@link http://jstat.org/}. @@ -27,19 +26,15 @@ const turf = require('@turf/turf'); * @constant */ const jStat = require('jStat').jStat; - /** * Module that contains various helper methods (spatial GIS functions and statistical functions) * to simplify script writing */ const KmHelper = require("kmhelper"); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS DEFINITION // // here you may specify custom CONSTANTS used within the script. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** * This constant specifies allowed values to determine how the aggregation process will deal with indicator values. * I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. @@ -49,7 +44,6 @@ const KmHelper = require("kmhelper"); * @constant */ const aggregationTypeEnum = ["SUM", "AVERAGE"]; - /** * via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. * Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option @@ -58,9 +52,6 @@ const aggregationTypeEnum = ["SUM", "AVERAGE"]; * @constant */ const aggregationType = "AVERAGE"; - - - /** * This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined * as method parameters that can be used within the method body. @@ -78,14 +69,12 @@ const aggregationType = "AVERAGE"; * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ - // compute indicator for targetDate and targetSpatialUnitFeatures - // i.e. then modify the features of targetSpatialUnit_geoJSON and return it - - - return targetSpatialUnit_geoJSON; -}; - +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters) { + // compute indicator for targetDate and targetSpatialUnitFeatures + // i.e. then modify the features of targetSpatialUnit_geoJSON and return it + return targetSpatialUnit_geoJSON; +} +; /** * This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). * The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. @@ -101,22 +90,22 @@ async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndic * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - if (!aggregationTypeEnum.includes(aggregationType)){ - console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + - "'. Allowed values are: " + aggregationTypeEnum); - console.log("Will fallback to using AVERAGE aggregation logic."); - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else if(aggregationType === "SUM"){ - return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } - else { - return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); - } -}; - +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)) { + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if (aggregationType === "SUM") { + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +} +; /** * This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). * @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! @@ -127,12 +116,10 @@ function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geo * @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE * @function */ -function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // disaggregate indicator - -}; - - +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // disaggregate indicator +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. @@ -146,74 +133,60 @@ function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check to aggregate - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var baseIndicatorTotalWeight = 0; - var featureCounter = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - featureCounter++; - - // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number - if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ - // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method - // it "survives" until this aggregation logic within processing engine - var weight = KmHelper.getAggregationWeight(indicatorFeature); - - // use weight as weight for indicator value - baseIndicatorTotalWeight += weight; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; - } - } - } - - // compute average for share - if(baseIndicatorTotalWeight === 0){ - targetFeature.properties[targetDate] = Number.NaN; +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; } - else { - targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if (!Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined) { + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + // compute average for share + if (baseIndicatorTotalWeight === 0) { + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + KmHelper.log("Aggregation finished"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); } - // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); - }); - - KmHelper.log("Aggregation finished"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - + return targetSpatialUnit_geoJSON; +} +; /** * Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} * by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} @@ -227,58 +200,47 @@ function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJ * @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS * @function */ -function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ - // aggregate indicator - - var indicatorFeatures = indicator_geoJSON.features; - - KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); - KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); - KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); - - targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); - KmHelper.log('Target Date with prefix: ' + targetDate); - - var totalAggregatedIndicatorFeatures = 0; - - // first replace indicatorFeature geoimetry by their pointOnSurface - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - var centerPoint = KmHelper.pointOnFeature(indicatorFeature); - - indicatorFeature.geometry = centerPoint.geometry; - } - - // spatial within check for aggregation - targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ - - targetFeature.properties[targetDate] = 0; - var numberOfIndicatorFeaturesWithinTargetFeature = 0; - - for (var index = 0; index < indicatorFeatures.length; index++){ - var indicatorFeature = indicatorFeatures[index]; - if(KmHelper.within(indicatorFeature, targetFeature)){ - // remove from array and decrement index - indicatorFeatures.splice(index, 1); - index--; - numberOfIndicatorFeaturesWithinTargetFeature++; - targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); - } - } - totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; - }); - - KmHelper.log("Aggregation finished"); - KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); - - if(indicatorFeatures.length > 0){ - console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); - throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); - } - - return targetSpatialUnit_geoJSON; -}; - +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON) { + // aggregate indicator + var indicatorFeatures = indicator_geoJSON.features; + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + var totalAggregatedIndicatorFeatures = 0; + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + indicatorFeature.geometry = centerPoint.geometry; + } + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function (targetFeature) { + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + for (var index = 0; index < indicatorFeatures.length; index++) { + var indicatorFeature = indicatorFeatures[index]; + if (KmHelper.within(indicatorFeature, targetFeature)) { + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + if (indicatorFeatures.length > 0) { + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + return targetSpatialUnit_geoJSON; +} +; module.exports.computeIndicator = computeIndicator; module.exports.aggregateIndicator = aggregateIndicator; module.exports.disaggregateIndicator = disaggregateIndicator; +//# sourceMappingURL=kommonitor-script-template.js.map \ No newline at end of file diff --git a/app/kommonitor-script-resources/kommonitor-script-template.js.map b/app/kommonitor-script-resources/kommonitor-script-template.js.map new file mode 100644 index 000000000..056d53350 --- /dev/null +++ b/app/kommonitor-script-resources/kommonitor-script-template.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-script-template.js","sourceRoot":"","sources":["kommonitor-script-template.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/kommonitor-script-resources/kommonitor-script-template.ts b/app/kommonitor-script-resources/kommonitor-script-template.ts new file mode 100644 index 000000000..d8e3a3ce2 --- /dev/null +++ b/app/kommonitor-script-resources/kommonitor-script-template.ts @@ -0,0 +1,284 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NECESSARY NODE MODULE DEPENDENCIES // // +// // +// SEE MODULE "KmProcessingEngine" for numerous predefined helper methods // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant may be used to perform spatial analysis and geometric operation tasks. +* A full-featured API documentation of Turf.js library can be found at {@link http://turfjs.org/}. +* This template offers several API methods that utilize Turf.js to implement typical geospatial operations. +* If required a user can implement custom functions, in which this constant can be called directly. +* @see {@link http://turfjs.org/} +* @see {@link https://github.com/Turfjs/turf} +* @memberof CONSTANTS +* @constant +*/ +const turf = require('@turf/turf'); + +/** +* This constant may be used to perform statistical computations. +* A full-featured API documentation of JStat.js library can be found at {@link http://jstat.org/}. +* This template offers several API methods that utilize JStst.js to implement typical statistical operations. +* If required a user can implement custom functions, in which this constant can be called directly. +* @see {@link https://github.com/jstat/jstat} +* @see {@link https://jstat.github.io/overview.html} +* @memberof CONSTANTS +* @constant +*/ +const jStat = require('jStat').jStat; + +/** +* Module that contains various helper methods (spatial GIS functions and statistical functions) +* to simplify script writing +*/ +const KmHelper = require("kmhelper"); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS DEFINITION // +// here you may specify custom CONSTANTS used within the script. // // // +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +* This constant specifies allowed values to determine how the aggregation process will deal with indicator values. +* I.e. "SUM" will compute the sum of all affected features, while "AVERAGE" will compute the average of all affected features. +* Note that these values must not be changed by users! +* @type {Array.} +* @memberof CONSTANTS +* @constant +*/ +const aggregationTypeEnum = ["SUM", "AVERAGE"]; + +/** +* via the setting constant {@linkcode aggregationType} the user can decide how the aggregation process will deal with indicator values. +* Any value of {@linkcode aggregationTypeEnum} can be used. If set to an unknown type, then "AVERAGE" is taken as fallback option +* @type {string} +* @memberof CONSTANTS +* @constant +*/ +const aggregationType = "AVERAGE"; + + + +/** +* This method computes the indicator for the specified point in time and target spatial unit. To do this, necessary base indicators and/or georesources as well as variable process properties are defined +* as method parameters that can be used within the method body. +* +* NOTE: The function is async, so users may make use of keyword "await" to wait for results of other async helper API methods. +* (This is necessary when users want to wait for asynchronous method execution such as external API calls in a synchronous program) +* +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit as GeoJSON FeatureCollection object. +* @param {map.>} baseIndicatorsMap - Map containing all indicators, wheres key='meaningful name or id of the indicator' and value='indicator as GeoJSON object' (it contains duplicate entries, one for the indicator name and one for the indicator id) +* @param {map.>} georesourcesMap - Map containing all georesources, wheres key='meaningful name or id of the georesource' and value='georesource as GeoJSON object' (they are used to execute geometric/toptologic computations) (it contains duplicate entries, one for the georesource name and one for the georesource id) +* @param {Array.>} processParameters - an array containing objects representing variable additional process parameters that are required to perform the indicator computation. +* Each entry has properties Object.name and Object.value for name and value of the parameter. +* @returns {FeatureCollection} the computed indicator for submitted {@linkcode targetSpatialUnit_geoJSON} features as GeoJSON FeatureCollection +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +async function computeIndicator(targetDate, targetSpatialUnit_geoJSON, baseIndicatorsMap, georesourcesMap, processParameters){ + // compute indicator for targetDate and targetSpatialUnitFeatures + // i.e. then modify the features of targetSpatialUnit_geoJSON and return it + + + return targetSpatialUnit_geoJSON; +}; + +/** +* This method is used to aggregate indicators of a certain spatial unit to the features of a more high-level spatial unit (i.e. aggregate from building blocks to city districts). +* The template contains predefined aggregation logic that makes use of constant {@linkcode aggregationType} to decide how indicator values shall be aggregated. +* The aggrgation internally aggregates features of {@linkcode indicator_geoJSON} to features of {@linkcode targetSpatialUnit_geoJSON} by comparing their geometries. +* Each {@linkcode indicator_geoJSON} feature whose geometry lies within a certain geometry of a {@linkcode targetSpatialUnit_geoJSON} feature will be used to compute the aggregated indicator values. +* The within comparison is executed by method {@linkcode within_usingBBOX}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be aggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter targetSpatialUnit_geoJSON +* @see aggregationType +* @see within_usingBBOX +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the aggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function aggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + if (!aggregationTypeEnum.includes(aggregationType)){ + console.log("Unknown parameter value for 'aggregationType' was specified for aggregation logic. Parameter value was '" + aggregationType + + "'. Allowed values are: " + aggregationTypeEnum); + console.log("Will fallback to using AVERAGE aggregation logic."); + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else if(aggregationType === "SUM"){ + return aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } + else { + return aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON); + } +}; + +/** +* This method is used to disaggregate indicators of a certain spatial unit to the features of a more low-level spatial unit (i.e. disaggregate from city districts to building blocks). +* @todo CURRENTLY THIS METHOD IS NOT USED WITHIN KOMMONITOR PROJECT: THUS IT CONTAINS NO IMPLEMENTATION YET! +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - string target spatial unit features of the target spatial unit, for which the indicator shall be disaggregated to as GeoJSON FeatureCollection +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be disaggregated to the features of parameter targetSpatialUnit_geoJSON +* @returns {FeatureCollection} the features of {@linkcode targetSpatialUnit_geoJSON} which contain the disaggregated indicator values as GeoJSON FeatureCollection. +* @memberof METHODS_TO_IMPLEMENT_OR_OVERWRITE +* @function +*/ +function disaggregateIndicator(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // disaggregate indicator + +}; + + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the AVERAGE indicator value of all affected features. Internally this compares the centroids of each indicator feature to target spatial unit features. +* Also it uses the {@linkcode KmHelper.getAggregationWeight(feature)} method as weight during aggregtion. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_average(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing AVERAGE values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features. Each indicator feature will be weighted by its size (area in squareMeters)."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check to aggregate + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var baseIndicatorTotalWeight = 0; + var featureCounter = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + featureCounter++; + + // only use in aggregation, if the indicator value is not NaN, null or undefined but a "real" numeric number + if(! Number.isNaN(indicatorFeature.properties[targetDate]) && indicatorFeature.properties[targetDate] !== null && indicatorFeature.properties[targetDate] !== undefined){ + // aggregationWeight is either 1 or a custom user-set weight value set within computeIndicator()-method + // it "survives" until this aggregation logic within processing engine + var weight = KmHelper.getAggregationWeight(indicatorFeature); + + // use weight as weight for indicator value + baseIndicatorTotalWeight += weight; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]) * weight; + } + } + } + + // compute average for share + if(baseIndicatorTotalWeight === 0){ + targetFeature.properties[targetDate] = Number.NaN; + } + else { + targetFeature.properties[targetDate] = (targetFeature.properties[targetDate] / baseIndicatorTotalWeight); + } + // KmHelper.log("resulting average value is " + targetFeature.properties[targetDate]); + }); + + KmHelper.log("Aggregation finished"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +/** +* Aggregate features from {@linkcode indicator_geoJSON} to target features of {@linkcode targetSpatialUnit_geoJSON} +* by computing the SUM indicator value of all affected features. Internally this uses the function {@linkcode within_usingBBOX} +* to determine which features of {@linkcode indicator_geoJSON} can be aggregated to which features of {@linkcode targetSpatialUnit_geoJSON}. +* @param {string} targetDate - string representing the target date for which the indicator shall be computed, following the pattern {@linkcode YYYY-MM-DD}, e.g. {@linkcode 2018-01-01} +* @param {FeatureCollection} targetSpatialUnit_geoJSON - GeoJSON features of the target spatial unit, for which the indicator shall be aggregated to +* @param {FeatureCollection} indicator_geoJSON - GeoJSON features containing the indicator values for a spatial unit that can be aggregated to the features of parameter {@linkcode targetSpatialUnitFeatures} +* @returns {FeatureCollection} a GeoJSON FeatureCollection of all features of the submitted {@linkcode targetSpatialUnit_geoJSON} +* containing the resulting aggregated indicator values as new property according to the submitted {@linkcode targetDate} +* @see {@link within_usingBBOX} +* @memberof API_HELPER_METHODS_GEOMETRIC_OPERATIONS +* @function +*/ +function aggregate_sum(targetDate, targetSpatialUnit_geoJSON, indicator_geoJSON){ + // aggregate indicator + + var indicatorFeatures = indicator_geoJSON.features; + + KmHelper.log("Aggregate indicator for targetDate " + targetDate + " for a total amount of " + targetSpatialUnit_geoJSON.features.length + " target features. Computing SUM values."); + KmHelper.log("Aggregate from a total number of " + indicator_geoJSON.features.length + " baseFeatures"); + KmHelper.log("Aggregating by comparing the centroids of each indicator feature to target spatial unit features."); + + targetDate = KmHelper.getTargetDateWithPropertyPrefix(targetDate); + KmHelper.log('Target Date with prefix: ' + targetDate); + + var totalAggregatedIndicatorFeatures = 0; + + // first replace indicatorFeature geoimetry by their pointOnSurface + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + var centerPoint = KmHelper.pointOnFeature(indicatorFeature); + + indicatorFeature.geometry = centerPoint.geometry; + } + + // spatial within check for aggregation + targetSpatialUnit_geoJSON.features.forEach(function(targetFeature){ + + targetFeature.properties[targetDate] = 0; + var numberOfIndicatorFeaturesWithinTargetFeature = 0; + + for (var index = 0; index < indicatorFeatures.length; index++){ + var indicatorFeature = indicatorFeatures[index]; + if(KmHelper.within(indicatorFeature, targetFeature)){ + // remove from array and decrement index + indicatorFeatures.splice(index, 1); + index--; + numberOfIndicatorFeaturesWithinTargetFeature++; + targetFeature.properties[targetDate] += Number(indicatorFeature.properties[targetDate]); + } + } + totalAggregatedIndicatorFeatures += numberOfIndicatorFeaturesWithinTargetFeature; + }); + + KmHelper.log("Aggregation finished"); + KmHelper.log(totalAggregatedIndicatorFeatures + " features were aggregated to " + targetSpatialUnit_geoJSON.features.length + " targetFeatures"); + + if(indicatorFeatures.length > 0){ + console.error("Spatial Aggregation failed for a total number of " + indicatorFeatures.length); + throw Error("Spatial Aggregation operation failed for a total number of " + indicatorFeatures.length); + } + + return targetSpatialUnit_geoJSON; +}; + +module.exports.computeIndicator = computeIndicator; +module.exports.aggregateIndicator = aggregateIndicator; +module.exports.disaggregateIndicator = disaggregateIndicator; diff --git a/app/main.js b/app/main.js new file mode 100644 index 000000000..aa8164a25 --- /dev/null +++ b/app/main.js @@ -0,0 +1,5 @@ +/// +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { AppModule } from './app.module'; +platformBrowserDynamic().bootstrapModule(AppModule); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/app/main.js.map b/app/main.js.map new file mode 100644 index 000000000..a4d748217 --- /dev/null +++ b/app/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["main.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,sBAAsB,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC"} \ No newline at end of file diff --git a/app/main.ts b/app/main.ts new file mode 100644 index 000000000..6b7380ce6 --- /dev/null +++ b/app/main.ts @@ -0,0 +1,6 @@ +/// + +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { AppModule } from './app.module'; + +platformBrowserDynamic().bootstrapModule(AppModule); \ No newline at end of file diff --git a/app/util/genericServices/kommonitorBatchUpdateHelperService/kommonitor-batch-update-helper-service.module.js b/app/util/genericServices/kommonitorBatchUpdateHelperService/kommonitor-batch-update-helper-service.module.js index 48cbb33fd..a92368f1c 100644 --- a/app/util/genericServices/kommonitorBatchUpdateHelperService/kommonitor-batch-update-helper-service.module.js +++ b/app/util/genericServices/kommonitorBatchUpdateHelperService/kommonitor-batch-update-helper-service.module.js @@ -1,1275 +1,1094 @@ +"use strict"; angular.module('kommonitorBatchUpdateHelper', ['kommonitorDataExchange', 'kommonitorImporterHelper']); - angular - .module('kommonitorBatchUpdateHelper', []) - .service( - 'kommonitorBatchUpdateHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', 'kommonitorImporterHelperService', '__env', - function ($rootScope, $timeout, kommonitorDataExchangeService, kommonitorImporterHelperService, __env) { - - let thisService = this; // to enable access to service methods from inside other functions (e. g. $timeout) where 'this' references something else - let timeseriesMappingReference; - - // Maps the values of the "name" property in the converter's parameter array to the property names used in the batch update - // We can't use the parameters array directly because we have to bind angularjs variables to object properties, not array elements - // Used in converterParametersArrayToProperties and converterPropertiesToParametersArray - const converterParametersToPropertiesMapping = { - "CRS": "crs", - "Hausnummer_Spaltenname": "hnrColumnName", - "Strasse_Spaltenname": "streetColumnName", - "Adresse_Spaltenname": "addressColumnName", - "Strasse_Hausnummer_Spaltenname": "streetHnrColumnName", - "X_Koordinatenspalte_Rechtswert": "xCoordColumnName", - "Y_Koordinatenspalte_Hochwert": "yCoordColumnName", - "Postleitzahl_Spaltenname": "plzColumnName", - "Stadt_Spaltenname": "cityColumnName", - "NAMESPACE": "schemaNamespace", - "SCHEMA_LOCATION": "schemaLocation", - "Trennzeichen": "separator", - } - const datasourceParametersToPropertiesMapping = { - "NAME": "name", - "URL": "url", - "payload": "payload" - } - - this.batchUpdate = async function (resourceType, batchList, keepMissingOrNullValueIndicator, keepMissingOrNullValueAttributes) { - - let startBtn = document.getElementById(resourceType + "-batch-update-btn"); - startBtn.innerHTML = "Update wird ausgeführt..."; - startBtn.setAttribute("disabled", "disabled"); - - - // clear result modal - document.getElementById("batch-update-result-table-tbody").innerHTML = ""; - - // create array to store response messages - var responses = []; - - // deep copy batch list - var batchListCopy = []; - for(let i=0; i= 0; i--) { - if (batchList[i].isSelected) - batchList.splice(i, 1); - } - - allRowsSelected = false; // in case it was true - } - - // examples - // mappingTable0 --> 0 - // mappingTable12 --> 12 - // but: 12mappingTable23 --> 12, returns first occurrence of number as index - this.getIndexFromId = function (id) { - var re = /\d+/g; // gets all numbers - var index = id.match(re); - if (index) { - index = index[0]; - } - return index; - } - - - // builds a converter definition with parameters array from the currently selected datasource - // selectedConverter = the currently selected converter in the dropdown - // oldConverter = the converter property from a mapping object. - this.buildConverterDefinition = function (selectedConverter, oldConverter) { - console.log("building converter definition"); - console.log("selected converter: ", selectedConverter); - console.log("old converter: ", oldConverter); - - if (! selectedConverter){ - return oldConverter; - } - - // Remove all properties that are not part of the selected converter. - // This is usually needed when the user switches to a different converter. - let paramNames = selectedConverter.parameters.map(obj => obj.name); - for(var i=oldConverter.parameters.length-1; i>=0; i--) { - if(!paramNames.includes(oldConverter.parameters[i].name)) { - oldConverter.parameters.splice(i, 1); - } - } - - let mimeTypeValue = oldConverter.mimeType ? oldConverter.mimeType : ""; - if (mimeTypeValue == "" && oldConverter.parameters){ - // check for another property already inserted as parameter - for (const parameter of oldConverter.parameters) { - if (parameter.name == "mimeType"){ - mimeTypeValue = parameter.value; - break; - } - } - } - - let encodingValue = oldConverter.encoding ? oldConverter.encoding : ""; - if (encodingValue == "" && oldConverter.parameters){ - // check for another property already inserted as parameter - for (const parameter of oldConverter.parameters) { - if (parameter.name == "encoding"){ - encodingValue = parameter.value; - break; - } - } - } - // set first encoding as fallback option - if(encodingValue == ""){ - encodingValue = selectedConverter.encodings[0]; - } - - var converterDefinition = { - encoding: encodingValue, - mimeType: mimeTypeValue, - name: selectedConverter.name, - parameters: oldConverter.parameters, - schema: undefined - } - - if (selectedConverter.name.includes("WFS_v1")) { - if (oldConverter.schema && oldConverter.schema.length > 0) - converterDefinition.schema = oldConverter.schema; - } - - return converterDefinition; - } - - - // builds a datasource definition with parameters array from the currently selected datasource - // selectedDatasourceType = the currently selected datasource in the dropdown - // oldDataSource = the datasource property from a mapping object. - this.buildDataSourceDefinition = function (selectedDatasourceType, oldDataSource, includeFileName) { - console.log("in buildDataSourceDefinition"); - console.log("selectedDatasourceType: ", selectedDatasourceType); - console.log("oldDataSource", oldDataSource); - if (! selectedDatasourceType){ - return oldDataSource; - } - - // Remove all properties that are not part of the selected datasource. - // This is usually needed when the user switches to a different datasource. - // let paramNames = selectedDatasourceType.parameters.map(obj => obj.name); - // for(var i=oldDataSource.parameters.length-1; i>=0; i--) { - // if(!paramNames.includes(oldDataSource.parameters[i].name)) { - // oldDataSource.parameters.splice(i, 1); - // } - // } - - var dataSourceDefinition = { - parameters: [], - type: selectedDatasourceType.type - } - - if (dataSourceDefinition.type === "FILE") { - dataSourceDefinition.parameters.push({ - name: "NAME", - value: includeFileName ? oldDataSource.name : "" - }); - } - - if (dataSourceDefinition.type === "HTTP") { - - let urlValue = oldDataSource.URL ? oldDataSource.URL : ""; - if (urlValue == "" && oldDataSource.parameters){ - // check for another property already inserted as parameter - for (const parameter of oldDataSource.parameters) { - if (parameter.name == "URL"){ - urlValue = parameter.value; - break; - } - } - } - - dataSourceDefinition.parameters.push({ - name: "URL", - value: urlValue - }); - } - - if (dataSourceDefinition.type === "INLINE") { - - let payloadValue = oldDataSource.payload ? oldDataSource.payload : ""; - if (payloadValue == "" && oldDataSource.parameters){ - // check for another property already inserted as parameter - for (const parameter of oldDataSource.parameters) { - if (parameter.name == "payload"){ - payloadValue = parameter.value; - break; - } - } - } - - dataSourceDefinition.parameters.push({ - name: "payload", - value: payloadValue - }); - } - - return dataSourceDefinition; - } - - // We need properties to bind model variables to them. - // Binding to unnamed objects in an array tricky (using the index is not reliable) - // It also creates other problems - this.converterParametersArrayToProperties = function (converter) { - var result = $.extend(true, {}, converter); - var array = converter.parameters; - // for each array element add a new property - for (var i = 0; i < array.length; i++) { - var paramName = array[i].name; - var propName = converterParametersToPropertiesMapping[paramName]; - var paramValue = array[i].value; - result[propName] = paramValue; - } - delete result.parameters; - return result; - } - - // This reverses the result of the method converterParametersArrayToProperties - this.converterPropertiesToParametersArray = function (converter) { - var result = $.extend(true, {}, converter); - result.parameters = []; - - for(const [prop, value] of Object.entries(result)) { - // If prop is in mapping table - Object.keys(converterParametersToPropertiesMapping).forEach(function(key) { - if (converterParametersToPropertiesMapping[key] == prop) { - result.parameters.push({ - name: key, - value: value - }); - delete result[prop]; - } - }); - } - return result; - } - - // We need properties to bind model variables to them. - // Binding to unnamed objects in an array is tricky (using the index is not reliable) - // It also creates other problems - this.dataSourceParametersArrayToProperty = function (dataSource) { - if(dataSource) { - var result = $.extend(true, {}, dataSource); - var array = dataSource.parameters; - // only one datasource can be selected for each row, so the array has to be of length one - var paramName = array[0].name; - var paramValue = array[0].value; - result[paramName] = paramValue; - delete result.parameters; - return result; - } - } - - // This reverses the result of the method dataSourceParametersArrayToProperty - this.dataSourcePropertyToParametersArray = function (dataSource) { - if (dataSource) { - var result = $.extend(true, {}, dataSource); - result.parameters = []; - - for(const [prop, value] of Object.entries(result)) { - // If prop is in mapping table - Object.keys(datasourceParametersToPropertiesMapping).forEach(function(key) { - if (datasourceParametersToPropertiesMapping[key] == prop) { - result.parameters.push({ - name: key, - value: value - }); - delete result[prop]; - } - }); - } - return result; - } - } - - - // helper function to get a converter object by full name. - // returns null if no converter was found - this.getConverterObjectByName = function (name) { - if(kommonitorImporterHelperService.availableConverters) { - for (const converter of kommonitorImporterHelperService.availableConverters) { - if (converter.name === name) { - return converter; - } - } - } - return null; - } - - - // helper function to get a datasourceType object by type. - // returns null if no datasourceType was found - this.getDatasourceTypeObjectByType = function (type) { - for (const datasourceType of kommonitorImporterHelperService.availableDatasourceTypes) { - if (datasourceType.type === type) { - return datasourceType; - } - } - return null; - } - - - // helper function to get a spatial unit object by full name. - // returns null if no spatial unit was found - this.getSpatialUnitObjectByName = function (name) { - for (const spatialUnit of kommonitorDataExchangeService.availableSpatialUnits) { - if (spatialUnit.spatialUnitLevel === name) { - return spatialUnit; - } - } - return null; - } - - this.createAttributeMappingsObject = function(row) { - var attributeMapping = []; - for (let i = 0; i < row.mappingObj.propertyMapping.attributes.length; i++) { - let attribute = row.mappingObj.propertyMapping.attributes[i]; - var tmpEntry = { - "sourceName": attribute.name, - "destinationName": attribute.mappingName - }; - - for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { - if (dataType.apiName === attribute.type) { - tmpEntry.dataType = dataType; - } - } - - attributeMapping.push(tmpEntry); - } - - return attributeMapping; - } - - this.uploadFileToImporter = async function(datasourceFileInputId) { - - // this should be defined since the update is only possible if a file was manually selected - var file = $("#" + datasourceFileInputId).get(0).files[0]; - - if(file === null || file === undefined) { - throw new Error("File was not defined. Did not start upload to importer.") - } - - // upload file to importer - var fileUploadName; - try { - fileUploadName = await kommonitorImporterHelperService.uploadNewFile(file, file.name); - } catch (error) { - throw error; - } - - return fileUploadName; - }; - - // loop through batch list and check if condition is true for at least one row - this.checkIfMappingTableIsSpecified = function(batchList) { - let mappingTableIsSpecified = false; - for(let i=0; i 0) { - if (converterName.includes("WFS_v1")) { - selectedConverterIsWfsV1 = true; - break; - } - } - } - } - return selectedConverterIsWfsV1; - } - - - // loop through batch list and check if condition is true for at least one row - this.checkIfSelectedDatasourceTypeIsFile = function(batchList) { - let selectedDatasourceTypeIsFile = false; - for (let i=0; i 0) { - if (datasourceType == "FILE") { - selectedDatasourceTypeIsFile = true; - break; - } - } - } - } - return selectedDatasourceTypeIsFile; - } - - - // loop through batch list and check if condition is true for at least one row - this.checkIfSelectedDatasourceTypeIsHttp = function(batchList) { - let selectedDatasourceTypeIsHttp = false; - for (let i=0; i 0) { - if (datasourceType == "HTTP") { - selectedDatasourceTypeIsHttp = true; - break; - } - } - } - } - return selectedDatasourceTypeIsHttp; - } - - - // loop through batch list and check if condition is true for at least one row - this.checkIfSelectedDatasourceTypeIsInline = function(batchList) { - let selectedDatasourceTypeIsInline = false; - for (let i=0; i 0) { - if (datasourceType == "INLINE") { - selectedDatasourceTypeIsInline = true; - break; - } - } - } - } - return selectedDatasourceTypeIsInline; - } - - - this.checkIfNameAndFilesChosenInEachRow = function(resourceType, batchList) { - - let updateBtn = document.getElementById(resourceType + "-batch-update-btn"); - updateBtn.title = "Update starten" // default title, might get overwritten later - - if(batchList.length == 0) { - updateBtn.title = "Die Batch-Liste is leer." - return false; - } - - for(let i=0; i 0) { - - if (datasourceType == "FILE") { - if(!dataSource.name) { - updateBtn.title = "Die Spalte Datei* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf FILE gesetzt ist." - return false; - } else { - if(dataSource.name == undefined || dataSource.name == "") { - updateBtn.title = "Die Spalte Datei* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf FILE gesetzt ist." - return false; - } - } - } - - if (datasourceType == "HTTP") { - if(!dataSource.URL) { - // property does not exist until user uses the input field for the first time - updateBtn.title = "Die Spalte URL* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf HTTP gesetzt ist." - return false; - } else { - // the field could still be empty (if it had input before) - if(dataSource.URL == undefined || dataSource.URL == "") { - updateBtn.title = "Die Spalte URL* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf HTTP gesetzt ist." - return false; - } - } - } - - if (datasourceType == "INLINE") { - if(!dataSource.payload) { - // property does not exist until user uses the input field for the first time - updateBtn.title = "Die Spalte Payload* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf INLINE gesetzt ist." - return false; - } else { - // the field could still be empty (if it had input before) - if(dataSource.payload == undefined || dataSource.payload == "") { - updateBtn.title = "Die Spalte Payload* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf INLINE gesetzt ist." - return false; - } - } - } - } - } else { - updateBtn.title = "Die Spalte Datenquelltyp* ist nicht für alle Zeilen gesetzt." - return false; - } - - - if (!batchList[i].selectedConverter) { - if(resourceType === "georesource") - updateBtn.title = "Die Spalte Geodaten-Quellformat* ist nicht für alle Zeilen gesetzt." - else - updateBtn.title = "Die Spalte Datensatz-Quellformat* ist nicht für alle Zeilen gesetzt." // for indicators - - return false; - } - } - - return true; - } - - - this.onDataSourceFileSelected = function(file, rowIndex, batchList) { - // set filename manually - let name = file.name; - $timeout(function() { - let dataSource = batchList[rowIndex].mappingObj.dataSource; - dataSource.parameters = []; - dataSource.name = name - batchList[rowIndex].mappingObj.dataSource = dataSource; - }); - } - - - this.onMappingTableSelected = function(resourceType, event, rowIndex, file, batchList) { - - let mappingObj = JSON.parse(event.target.result); - - batchList[rowIndex].mappingTableName = file.name; - - mappingObj.converter = this.converterParametersArrayToProperties(mappingObj.converter); - mappingObj.dataSource = this.dataSourceParametersArrayToProperty(mappingObj.dataSource); - - // set value of column "Datensatz-Quellformat*" by converter name - let converterName = mappingObj.converter.name - for(let i=0; i 0)) { - let fields = angular.element('[ng-model="' + resourceType + '.' + selectedCol + '"]'); - for(let i=0; i 0) { - // Only add if name isn't added already - if( !result.includes(converterName) ) { - result.push(converterName) - } - } - } - } - return result; - } - - // the variable availableGeoresources / availableIndicators (which is used to fill the ng-options) - // changes after each update, causing angularjs to loose the connection. - // this function restores the names - this.refreshNameColumn = function(resourceType, batchList) { - for(let i=0;i= 0; i--) { + if (batchList[i].isSelected) + batchList.splice(i, 1); + } + allRowsSelected = false; // in case it was true + }; + // examples + // mappingTable0 --> 0 + // mappingTable12 --> 12 + // but: 12mappingTable23 --> 12, returns first occurrence of number as index + this.getIndexFromId = function (id) { + var re = /\d+/g; // gets all numbers + var index = id.match(re); + if (index) { + index = index[0]; + } + return index; + }; + // builds a converter definition with parameters array from the currently selected datasource + // selectedConverter = the currently selected converter in the dropdown + // oldConverter = the converter property from a mapping object. + this.buildConverterDefinition = function (selectedConverter, oldConverter) { + console.log("building converter definition"); + console.log("selected converter: ", selectedConverter); + console.log("old converter: ", oldConverter); + if (!selectedConverter) { + return oldConverter; + } + // Remove all properties that are not part of the selected converter. + // This is usually needed when the user switches to a different converter. + let paramNames = selectedConverter.parameters.map(obj => obj.name); + for (var i = oldConverter.parameters.length - 1; i >= 0; i--) { + if (!paramNames.includes(oldConverter.parameters[i].name)) { + oldConverter.parameters.splice(i, 1); + } + } + let mimeTypeValue = oldConverter.mimeType ? oldConverter.mimeType : ""; + if (mimeTypeValue == "" && oldConverter.parameters) { + // check for another property already inserted as parameter + for (const parameter of oldConverter.parameters) { + if (parameter.name == "mimeType") { + mimeTypeValue = parameter.value; + break; + } + } + } + let encodingValue = oldConverter.encoding ? oldConverter.encoding : ""; + if (encodingValue == "" && oldConverter.parameters) { + // check for another property already inserted as parameter + for (const parameter of oldConverter.parameters) { + if (parameter.name == "encoding") { + encodingValue = parameter.value; + break; + } + } + } + // set first encoding as fallback option + if (encodingValue == "") { + encodingValue = selectedConverter.encodings[0]; + } + var converterDefinition = { + encoding: encodingValue, + mimeType: mimeTypeValue, + name: selectedConverter.name, + parameters: oldConverter.parameters, + schema: undefined + }; + if (selectedConverter.name.includes("WFS_v1")) { + if (oldConverter.schema && oldConverter.schema.length > 0) + converterDefinition.schema = oldConverter.schema; + } + return converterDefinition; + }; + // builds a datasource definition with parameters array from the currently selected datasource + // selectedDatasourceType = the currently selected datasource in the dropdown + // oldDataSource = the datasource property from a mapping object. + this.buildDataSourceDefinition = function (selectedDatasourceType, oldDataSource, includeFileName) { + console.log("in buildDataSourceDefinition"); + console.log("selectedDatasourceType: ", selectedDatasourceType); + console.log("oldDataSource", oldDataSource); + if (!selectedDatasourceType) { + return oldDataSource; + } + // Remove all properties that are not part of the selected datasource. + // This is usually needed when the user switches to a different datasource. + // let paramNames = selectedDatasourceType.parameters.map(obj => obj.name); + // for(var i=oldDataSource.parameters.length-1; i>=0; i--) { + // if(!paramNames.includes(oldDataSource.parameters[i].name)) { + // oldDataSource.parameters.splice(i, 1); + // } + // } + var dataSourceDefinition = { + parameters: [], + type: selectedDatasourceType.type + }; + if (dataSourceDefinition.type === "FILE") { + dataSourceDefinition.parameters.push({ + name: "NAME", + value: includeFileName ? oldDataSource.name : "" + }); + } + if (dataSourceDefinition.type === "HTTP") { + let urlValue = oldDataSource.URL ? oldDataSource.URL : ""; + if (urlValue == "" && oldDataSource.parameters) { + // check for another property already inserted as parameter + for (const parameter of oldDataSource.parameters) { + if (parameter.name == "URL") { + urlValue = parameter.value; + break; + } + } + } + dataSourceDefinition.parameters.push({ + name: "URL", + value: urlValue + }); + } + if (dataSourceDefinition.type === "INLINE") { + let payloadValue = oldDataSource.payload ? oldDataSource.payload : ""; + if (payloadValue == "" && oldDataSource.parameters) { + // check for another property already inserted as parameter + for (const parameter of oldDataSource.parameters) { + if (parameter.name == "payload") { + payloadValue = parameter.value; + break; + } + } + } + dataSourceDefinition.parameters.push({ + name: "payload", + value: payloadValue + }); + } + return dataSourceDefinition; + }; + // We need properties to bind model variables to them. + // Binding to unnamed objects in an array tricky (using the index is not reliable) + // It also creates other problems + this.converterParametersArrayToProperties = function (converter) { + var result = $.extend(true, {}, converter); + var array = converter.parameters; + // for each array element add a new property + for (var i = 0; i < array.length; i++) { + var paramName = array[i].name; + var propName = converterParametersToPropertiesMapping[paramName]; + var paramValue = array[i].value; + result[propName] = paramValue; + } + delete result.parameters; + return result; + }; + // This reverses the result of the method converterParametersArrayToProperties + this.converterPropertiesToParametersArray = function (converter) { + var result = $.extend(true, {}, converter); + result.parameters = []; + for (const [prop, value] of Object.entries(result)) { + // If prop is in mapping table + Object.keys(converterParametersToPropertiesMapping).forEach(function (key) { + if (converterParametersToPropertiesMapping[key] == prop) { + result.parameters.push({ + name: key, + value: value + }); + delete result[prop]; + } + }); + } + return result; + }; + // We need properties to bind model variables to them. + // Binding to unnamed objects in an array is tricky (using the index is not reliable) + // It also creates other problems + this.dataSourceParametersArrayToProperty = function (dataSource) { + if (dataSource) { + var result = $.extend(true, {}, dataSource); + var array = dataSource.parameters; + // only one datasource can be selected for each row, so the array has to be of length one + var paramName = array[0].name; + var paramValue = array[0].value; + result[paramName] = paramValue; + delete result.parameters; + return result; + } + }; + // This reverses the result of the method dataSourceParametersArrayToProperty + this.dataSourcePropertyToParametersArray = function (dataSource) { + if (dataSource) { + var result = $.extend(true, {}, dataSource); + result.parameters = []; + for (const [prop, value] of Object.entries(result)) { + // If prop is in mapping table + Object.keys(datasourceParametersToPropertiesMapping).forEach(function (key) { + if (datasourceParametersToPropertiesMapping[key] == prop) { + result.parameters.push({ + name: key, + value: value + }); + delete result[prop]; + } + }); + } + return result; + } + }; + // helper function to get a converter object by full name. + // returns null if no converter was found + this.getConverterObjectByName = function (name) { + if (kommonitorImporterHelperService.availableConverters) { + for (const converter of kommonitorImporterHelperService.availableConverters) { + if (converter.name === name) { + return converter; + } + } + } + return null; + }; + // helper function to get a datasourceType object by type. + // returns null if no datasourceType was found + this.getDatasourceTypeObjectByType = function (type) { + for (const datasourceType of kommonitorImporterHelperService.availableDatasourceTypes) { + if (datasourceType.type === type) { + return datasourceType; + } + } + return null; + }; + // helper function to get a spatial unit object by full name. + // returns null if no spatial unit was found + this.getSpatialUnitObjectByName = function (name) { + for (const spatialUnit of kommonitorDataExchangeService.availableSpatialUnits) { + if (spatialUnit.spatialUnitLevel === name) { + return spatialUnit; + } + } + return null; + }; + this.createAttributeMappingsObject = function (row) { + var attributeMapping = []; + for (let i = 0; i < row.mappingObj.propertyMapping.attributes.length; i++) { + let attribute = row.mappingObj.propertyMapping.attributes[i]; + var tmpEntry = { + "sourceName": attribute.name, + "destinationName": attribute.mappingName + }; + for (const dataType of kommonitorImporterHelperService.attributeMapping_attributeTypes) { + if (dataType.apiName === attribute.type) { + tmpEntry.dataType = dataType; + } + } + attributeMapping.push(tmpEntry); + } + return attributeMapping; + }; + this.uploadFileToImporter = async function (datasourceFileInputId) { + // this should be defined since the update is only possible if a file was manually selected + var file = $("#" + datasourceFileInputId).get(0).files[0]; + if (file === null || file === undefined) { + throw new Error("File was not defined. Did not start upload to importer."); + } + // upload file to importer + var fileUploadName; + try { + fileUploadName = await kommonitorImporterHelperService.uploadNewFile(file, file.name); + } + catch (error) { + throw error; + } + return fileUploadName; + }; + // loop through batch list and check if condition is true for at least one row + this.checkIfMappingTableIsSpecified = function (batchList) { + let mappingTableIsSpecified = false; + for (let i = 0; i < batchList.length; i++) { + if (batchList[i].mappingTableName != "") { + mappingTableIsSpecified = true; + break; + } + } + return mappingTableIsSpecified; + }; + // Generic function to check which columns have to be shown depending on the selected converter. + // Returns a boolean + // loop through batch list and check if condition is true for at least one row + this.checkIfSelectedConverterIsWfsV1 = function (batchList) { + let selectedConverterIsWfsV1 = false; + for (let i = 0; i < batchList.length; i++) { + console.log(batchList[i]); + if (batchList[i].selectedConverter) { + let converterName = batchList[i].selectedConverter.name; + if (converterName != undefined && converterName.length > 0) { + if (converterName.includes("WFS_v1")) { + selectedConverterIsWfsV1 = true; + break; + } + } + } + } + return selectedConverterIsWfsV1; + }; + // loop through batch list and check if condition is true for at least one row + this.checkIfSelectedDatasourceTypeIsFile = function (batchList) { + let selectedDatasourceTypeIsFile = false; + for (let i = 0; i < batchList.length; i++) { + if (batchList[i].selectedDatasourceType) { + let datasourceType = batchList[i].selectedDatasourceType.type; + if (datasourceType != undefined && datasourceType.length > 0) { + if (datasourceType == "FILE") { + selectedDatasourceTypeIsFile = true; + break; + } + } + } + } + return selectedDatasourceTypeIsFile; + }; + // loop through batch list and check if condition is true for at least one row + this.checkIfSelectedDatasourceTypeIsHttp = function (batchList) { + let selectedDatasourceTypeIsHttp = false; + for (let i = 0; i < batchList.length; i++) { + if (batchList[i].selectedDatasourceType) { + let datasourceType = batchList[i].selectedDatasourceType.type; + if (datasourceType != undefined && datasourceType.length > 0) { + if (datasourceType == "HTTP") { + selectedDatasourceTypeIsHttp = true; + break; + } + } + } + } + return selectedDatasourceTypeIsHttp; + }; + // loop through batch list and check if condition is true for at least one row + this.checkIfSelectedDatasourceTypeIsInline = function (batchList) { + let selectedDatasourceTypeIsInline = false; + for (let i = 0; i < batchList.length; i++) { + if (batchList[i].selectedDatasourceType) { + let datasourceType = batchList[i].selectedDatasourceType.type; + if (datasourceType != undefined && datasourceType.length > 0) { + if (datasourceType == "INLINE") { + selectedDatasourceTypeIsInline = true; + break; + } + } + } + } + return selectedDatasourceTypeIsInline; + }; + this.checkIfNameAndFilesChosenInEachRow = function (resourceType, batchList) { + let updateBtn = document.getElementById(resourceType + "-batch-update-btn"); + updateBtn.title = "Update starten"; // default title, might get overwritten later + if (batchList.length == 0) { + updateBtn.title = "Die Batch-Liste is leer."; + return false; + } + for (let i = 0; i < batchList.length; i++) { + if (batchList[i].name == undefined || batchList[i].name == "") { + updateBtn.title = "Die Spalte Name* ist nicht für alle Zeilen gesetzt."; + return false; + } + if (batchList[i].selectedDatasourceType) { + let datasourceType = batchList[i].selectedDatasourceType.type; + let dataSource = batchList[i].mappingObj.dataSource; + if (datasourceType != undefined && datasourceType.length > 0) { + if (datasourceType == "FILE") { + if (!dataSource.name) { + updateBtn.title = "Die Spalte Datei* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf FILE gesetzt ist."; + return false; + } + else { + if (dataSource.name == undefined || dataSource.name == "") { + updateBtn.title = "Die Spalte Datei* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf FILE gesetzt ist."; + return false; + } + } + } + if (datasourceType == "HTTP") { + if (!dataSource.URL) { + // property does not exist until user uses the input field for the first time + updateBtn.title = "Die Spalte URL* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf HTTP gesetzt ist."; + return false; + } + else { + // the field could still be empty (if it had input before) + if (dataSource.URL == undefined || dataSource.URL == "") { + updateBtn.title = "Die Spalte URL* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf HTTP gesetzt ist."; + return false; + } + } + } + if (datasourceType == "INLINE") { + if (!dataSource.payload) { + // property does not exist until user uses the input field for the first time + updateBtn.title = "Die Spalte Payload* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf INLINE gesetzt ist."; + return false; + } + else { + // the field could still be empty (if it had input before) + if (dataSource.payload == undefined || dataSource.payload == "") { + updateBtn.title = "Die Spalte Payload* ist nicht für alle Zeilen gesetzt, in denen die Spalte Datenquelltyp* auf INLINE gesetzt ist."; + return false; + } + } + } + } + } + else { + updateBtn.title = "Die Spalte Datenquelltyp* ist nicht für alle Zeilen gesetzt."; + return false; + } + if (!batchList[i].selectedConverter) { + if (resourceType === "georesource") + updateBtn.title = "Die Spalte Geodaten-Quellformat* ist nicht für alle Zeilen gesetzt."; + else + updateBtn.title = "Die Spalte Datensatz-Quellformat* ist nicht für alle Zeilen gesetzt."; // for indicators + return false; + } + } + return true; + }; + this.onDataSourceFileSelected = function (file, rowIndex, batchList) { + // set filename manually + let name = file.name; + $timeout(function () { + let dataSource = batchList[rowIndex].mappingObj.dataSource; + dataSource.parameters = []; + dataSource.name = name; + batchList[rowIndex].mappingObj.dataSource = dataSource; + }); + }; + this.onMappingTableSelected = function (resourceType, event, rowIndex, file, batchList) { + let mappingObj = JSON.parse(event.target.result); + batchList[rowIndex].mappingTableName = file.name; + mappingObj.converter = this.converterParametersArrayToProperties(mappingObj.converter); + mappingObj.dataSource = this.dataSourceParametersArrayToProperty(mappingObj.dataSource); + // set value of column "Datensatz-Quellformat*" by converter name + let converterName = mappingObj.converter.name; + for (let i = 0; i < kommonitorImporterHelperService.availableConverters.length; i++) { + let avConverterName = kommonitorImporterHelperService.availableConverters[i].name; + if (converterName == avConverterName) { + $timeout(function () { + batchList[rowIndex].selectedConverter = kommonitorImporterHelperService.availableConverters[i]; + }); + break; + } + } + // set value of column "Datenquelltyp*" by dataSource type + if (mappingObj.dataSource) { + let dataSourceType = mappingObj.dataSource.type; + for (let i = 0; i < kommonitorImporterHelperService.availableDatasourceTypes.length; i++) { + let avDataSourceType = kommonitorImporterHelperService.availableDatasourceTypes[i].type; + if (dataSourceType == avDataSourceType) { + $timeout(function () { + batchList[rowIndex].selectedDatasourceType = kommonitorImporterHelperService.availableDatasourceTypes[i]; + }); + break; + } + } + } + if (resourceType === "indicator") { + // set value of column "Ziel-Raumebene*" by target spatial unit name + let targetSpatialUnitName = mappingObj.targetSpatialUnitName; + let spatialUnitObject = this.getSpatialUnitObjectByName(targetSpatialUnitName); + $timeout(function () { + batchList[rowIndex].selectedTargetSpatialUnit = spatialUnitObject; + }); + } + // do not import file name + if (mappingObj.dataSource) { + if (mappingObj.dataSource.type == "FILE") { + mappingObj.dataSource.name = ""; + } + } + //apply to scope + $timeout(function () { + batchList[rowIndex].mappingObj = mappingObj; + if (resourceType === "georesource") + thisService.initializeGeoresourceDatepickerFields(batchList); + }); + }; + this.onClickSaveColDefaultValue = function (resourceType, selectedCol, newValue, replaceAll, batchList) { + // differentiate between timeseries mapping and other columns + if (selectedCol == "mappingObj.propertyMapping.timeseriesMappings") { + // new value is undefined for timeseries mapping. + // instead we get the new mapping from the variable + if (typeof (newValue == "undefined")) { + let btns = angular.element($('.indicatorTimeseriesMappingBtn')); + for (let i = 0; i < batchList.length; i++) { + // never change disabled fields + let btn = btns.get(i); + if (btn.getAttribute('disabled')) + continue; + timeseriesMappingReference = angular.fromJson(angular.toJson(timeseriesMappingReference)); + let oldMapping = batchList[i].mappingObj.propertyMapping.timeseriesMappings; + // iterate timeseriesMappingReference + for (let j = 0; j < timeseriesMappingReference.length; j++) { + let exists = false; + // for each entry check if it exists in oldMapping + for (let k = 0; k < oldMapping.length; k++) { + // check if indicatorValueProperty value property is the same + if (oldMapping[k].indicatorValueProperty == timeseriesMappingReference[j].indicatorValueProperty) { + exists = true; + if (replaceAll) + batchList[i].mappingObj.propertyMapping.timeseriesMappings[j] = timeseriesMappingReference[j]; + } + } + if (!exists) { + // add mapping + batchList[i].mappingObj.propertyMapping.timeseriesMappings.push(timeseriesMappingReference[j]); + } + } + } + } + } + else { + if (typeof (newValue != "undefined")) { + if (typeof (newValue === "object") || (typeof (newValue) === "string" && newValue.length > 0)) { + let fields = angular.element('[ng-model="' + resourceType + '.' + selectedCol + '"]'); + for (let i = 0; i < batchList.length; i++) { + // never change disabled fields + let field = fields.get(i); + if (field.getAttribute('disabled')) + continue; + if (replaceAll) { + // if checkbox is true update all rows + set(batchList[i], selectedCol, newValue); + } + else { + // else only update empty rows + if (get(batchList[i], selectedCol) == undefined || get(batchList[i], selectedCol) == "") + set(batchList[i], selectedCol, newValue); + } + } + } + } + } + // helper function to get nested properties where the path is variable + function get(obj, path) { + var schema = obj; // a moving reference to internal objects within obj + var pList = path.split('.'); + var len = pList.length; + for (var i = 0; i < len - 1; i++) { + var elem = pList[i]; + if (!schema[elem]) + schema[elem] = {}; + schema = schema[elem]; + } + return schema[pList[len - 1]]; + } + ; + // helper function to set nested properties where the path is variable + function set(obj, path, value) { + var schema = obj; // a moving reference to internal objects within obj + var pList = path.split('.'); + var len = pList.length; + for (var i = 0; i < len - 1; i++) { + var elem = pList[i]; + if (!schema[elem]) + schema[elem] = {}; + schema = schema[elem]; + } + schema[pList[len - 1]] = value; + } + ; + }; + this.initializeGeoresourceDatepickerFields = function (batchList) { + $timeout(function () { + for (let i = 0; i < batchList.length; i++) { + $('#georesourcePeriodOfValidityStartDatePicker' + i).datepicker(kommonitorDataExchangeService.datePickerOptions); + $('#georesourcePeriodOfValidityEndDatePicker' + i).datepicker(kommonitorDataExchangeService.datePickerOptions); + } + ; + }, 200); + }; + // Generic function to check which columns have to be shown depending on the selected converter. + // Returns an array of the selected converter names + this.checkColumnsToShow_selectedConverter = function (batchList) { + let result = []; + // We have to check the whole batch list. + // If only one row has a spscific converter selected, we have to show the corresponding collumns + for (let i = 0; i < batchList.length; i++) { + if (batchList[i].selectedConverter) { + let converterName = batchList[i].selectedConverter.name; + if (converterName != undefined && converterName.length > 0) { + // Only add if name isn't added already + if (!result.includes(converterName)) { + result.push(converterName); + } + } + } + } + return result; + }; + // the variable availableGeoresources / availableIndicators (which is used to fill the ng-options) + // changes after each update, causing angularjs to loose the connection. + // this function restores the names + this.refreshNameColumn = function (resourceType, batchList) { + for (let i = 0; i < batchList.length; i++) { + let row = batchList[i]; + if (row.tempResourceId) { + let resource; + if (resourceType === "georesource") + resource = kommonitorDataExchangeService.getGeoresourceMetadataById(row.tempResourceId); + if (resourceType === "indicator") + resource = kommonitorDataExchangeService.getIndicatorMetadataById(row.tempResourceId); + row.name = resource; + } + } + }; + this.resizeNameColumnDropdowns = function (resource) { + $timeout(function () { + let inputs = $('.ui-select-toggle'); + for (let input of inputs) { + input = $(input); + input.css("background-color", "white"); + input.css("border", "none"); + input.css("width", '100%'); + } + }, 500); + }; + $rootScope.$on("timeseriesMappingChanged", function (event, data) { + timeseriesMappingReference = data.mapping; + }); + } +]); +//# sourceMappingURL=kommonitor-batch-update-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorBatchUpdateHelperService/kommonitor-batch-update-helper-service.module.js.map b/app/util/genericServices/kommonitorBatchUpdateHelperService/kommonitor-batch-update-helper-service.module.js.map new file mode 100644 index 000000000..d94d0b9a2 --- /dev/null +++ b/app/util/genericServices/kommonitorBatchUpdateHelperService/kommonitor-batch-update-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-batch-update-helper-service.module.js","sourceRoot":"","sources":["kommonitor-batch-update-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorCacheHelperService/kommonitor-cache-helper-service.module.js b/app/util/genericServices/kommonitorCacheHelperService/kommonitor-cache-helper-service.module.js index aa8f07de9..f088b109b 100644 --- a/app/util/genericServices/kommonitorCacheHelperService/kommonitor-cache-helper-service.module.js +++ b/app/util/genericServices/kommonitorCacheHelperService/kommonitor-cache-helper-service.module.js @@ -1,5 +1,5 @@ +"use strict"; angular.module('kommonitorCacheHelper', []); - /** * a common serviceInstance that holds all needed properties for a WPS service. * @@ -10,266 +10,211 @@ angular.module('kommonitorCacheHelper', []); * parameters for each WPS operation represented by different Angular components */ angular - .module('kommonitorCacheHelper', []) - .service( - 'kommonitorCacheHelperService', [ + .module('kommonitorCacheHelper', []) + .service('kommonitorCacheHelperService', [ '$http', '__env', 'Auth', function ($http, __env, Auth) { - - this.lastDatabaseModificationInfo; - this.baseUrlToKomMonitorDataAPI = __env.apiUrl + __env.basePath; - let self = this; - - const localStorageKey_prefix = __env.localStoragePrefix; - - const localStorageKey_accessControl = localStorageKey_prefix + "_lastModification_accessControl"; - const localStorageKey_topics = localStorageKey_prefix + "_lastModification_topics"; - const localStorageKey_spatialUnits = localStorageKey_prefix + "_lastModification_spatialUnits"; - const localStorageKey_georesources = localStorageKey_prefix + "_lastModification_georesources"; - const localStorageKey_indicators = localStorageKey_prefix + "_lastModification_indicators"; - const localStorageKey_processScripts = localStorageKey_prefix + "_lastModification_processScripts"; - - const georesourcesPublicEndpoint = "/public/georesources"; - const georesourcesProtectedEndpoint = "/georesources"; - const spatialUnitsPublicEndpoint = "/public/spatial-units"; - const spatialUnitsProtectedEndpoint = "/spatial-units"; - const indicatorsPublicEndpoint = "/public/indicators"; - const indicatorsProtectedEndpoint = "/indicators"; - const scriptsPublicEndpoint = "/public/process-scripts"; - const scriptsProtectedEndpoint = "/process-scripts"; - const topicsPublicEndpoint = "/public/topics"; - // only resource that has no public endpoint - const accessControlEndpoint = "/organizationalUnits"; - - var georesourcesEndpoint = georesourcesProtectedEndpoint; - var spatialUnitsEndpoint = spatialUnitsProtectedEndpoint; - var indicatorsEndpoint = indicatorsProtectedEndpoint; - var scriptsEndpoint = scriptsProtectedEndpoint; - this.spatialResourceGETUrlPath_forAuthentication = "/public"; - - this.checkAuthentication = function () { - if (Auth.keycloak.authenticated) { - georesourcesEndpoint = georesourcesProtectedEndpoint; - spatialUnitsEndpoint = spatialUnitsProtectedEndpoint; - indicatorsEndpoint = indicatorsProtectedEndpoint; - scriptsEndpoint = scriptsProtectedEndpoint; - this.spatialResourceGETUrlPath_forAuthentication = ""; - } else { - georesourcesEndpoint = georesourcesPublicEndpoint; - spatialUnitsEndpoint = spatialUnitsPublicEndpoint; - indicatorsEndpoint = indicatorsPublicEndpoint; - scriptsEndpoint = scriptsPublicEndpoint; - this.spatialResourceGETUrlPath_forAuthentication = "/public"; - } - - }; - - this.fetchLastDatabaseModificationObject = async function () { - await $http({ - url: this.baseUrlToKomMonitorDataAPI + "/public/database/last-modification", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - self.lastDatabaseModificationInfo = response.data; - - }); - }; - - this.fetchResource_fromCacheOrServer = async function (localStorageKey, resourceEndpoint, lastModificationResourceName, keycloakRolesArray) { - // check if the last modification date within local storage is the same as on the server - - // if YES, then try to use data from cache - - // else set new last modification date, fetch data from server and set that also within localStorage - - await this.fetchLastDatabaseModificationObject(); - - let timestampKey = localStorageKey + "_timestamp"; - let metadataKey = localStorageKey + "_metadata"; - - //TODO: why do we need this? There is ever only a single rolesArray why do we need to differentiate between different roles? - - if(keycloakRolesArray && keycloakRolesArray.length > 0){ - // admin role is kommonitor-creator - if(keycloakRolesArray.includes(__env.keycloakKomMonitorAdminRoleName)){ - metadataKey += "_" + __env.keycloakKomMonitorAdminRoleName; - timestampKey += "_" + __env.keycloakKomMonitorAdminRoleName; - } - else{ - metadataKey += "_" + JSON.stringify(keycloakRolesArray); - timestampKey += "_" + JSON.stringify(keycloakRolesArray); - } - } - else{ - metadataKey += "_public"; - timestampKey += "_public"; - } - - - let lastModTimestamp_fromCache_string = localStorage.getItem(timestampKey); - - if (lastModTimestamp_fromCache_string) { - let lastModTimestamp_fromCache = JSON.parse(lastModTimestamp_fromCache_string); - - if (lastModTimestamp_fromCache) { - - let lastModTimestamp_fromServer = this.lastDatabaseModificationInfo[lastModificationResourceName]; - - if (lastModTimestamp_fromCache == lastModTimestamp_fromServer) { - let storageObject_string = localStorage.getItem(metadataKey); - - if (storageObject_string) { - let storageObject = JSON.parse(storageObject_string); - return storageObject; - } + this.lastDatabaseModificationInfo; + this.baseUrlToKomMonitorDataAPI = __env.apiUrl + __env.basePath; + let self = this; + const localStorageKey_prefix = __env.localStoragePrefix; + const localStorageKey_accessControl = localStorageKey_prefix + "_lastModification_accessControl"; + const localStorageKey_topics = localStorageKey_prefix + "_lastModification_topics"; + const localStorageKey_spatialUnits = localStorageKey_prefix + "_lastModification_spatialUnits"; + const localStorageKey_georesources = localStorageKey_prefix + "_lastModification_georesources"; + const localStorageKey_indicators = localStorageKey_prefix + "_lastModification_indicators"; + const localStorageKey_processScripts = localStorageKey_prefix + "_lastModification_processScripts"; + const georesourcesPublicEndpoint = "/public/georesources"; + const georesourcesProtectedEndpoint = "/georesources"; + const spatialUnitsPublicEndpoint = "/public/spatial-units"; + const spatialUnitsProtectedEndpoint = "/spatial-units"; + const indicatorsPublicEndpoint = "/public/indicators"; + const indicatorsProtectedEndpoint = "/indicators"; + const scriptsPublicEndpoint = "/public/process-scripts"; + const scriptsProtectedEndpoint = "/process-scripts"; + const topicsPublicEndpoint = "/public/topics"; + // only resource that has no public endpoint + const accessControlEndpoint = "/organizationalUnits"; + var georesourcesEndpoint = georesourcesProtectedEndpoint; + var spatialUnitsEndpoint = spatialUnitsProtectedEndpoint; + var indicatorsEndpoint = indicatorsProtectedEndpoint; + var scriptsEndpoint = scriptsProtectedEndpoint; + this.spatialResourceGETUrlPath_forAuthentication = "/public"; + this.checkAuthentication = function () { + if (Auth.keycloak.authenticated) { + georesourcesEndpoint = georesourcesProtectedEndpoint; + spatialUnitsEndpoint = spatialUnitsProtectedEndpoint; + indicatorsEndpoint = indicatorsProtectedEndpoint; + scriptsEndpoint = scriptsProtectedEndpoint; + this.spatialResourceGETUrlPath_forAuthentication = ""; } - } - } - - // when code reaches this place we must overwrite/set timestamp and actual metadata - - // persist last modification timestamp object as String in local storage - localStorage.setItem(timestampKey, JSON.stringify(this.lastDatabaseModificationInfo[lastModificationResourceName])); - - return await $http({ - url: this.baseUrlToKomMonitorDataAPI + resourceEndpoint, - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - localStorage.setItem(metadataKey, JSON.stringify(response.data)); - - return response.data; - }); - }; - - this.fetchAccessControlMetadata = async function (keycloakRolesArray) { - return await this.fetchResource_fromCacheOrServer(localStorageKey_accessControl, accessControlEndpoint, "access-control", keycloakRolesArray); - }; - - this.fetchTopicsMetadata = async function (keycloakRolesArray) { - return await this.fetchResource_fromCacheOrServer(localStorageKey_topics, topicsPublicEndpoint, "topics", keycloakRolesArray); - }; - - this.fetchSpatialUnitsMetadata = async function (keycloakRolesArray) { - return await this.fetchResource_fromCacheOrServer(localStorageKey_spatialUnits, spatialUnitsEndpoint, "spatial-units", keycloakRolesArray); - }; - - this.fetchIndicatorsMetadata = async function (keycloakRolesArray) { - return await this.fetchResource_fromCacheOrServer(localStorageKey_indicators, indicatorsEndpoint, "indicators", keycloakRolesArray); - }; - - this.fetchGeoresourceMetadata = async function (keycloakRolesArray) { - return await this.fetchResource_fromCacheOrServer(localStorageKey_georesources, georesourcesEndpoint, "georesources", keycloakRolesArray); - }; - - this.fetchProcessScriptsMetadata = async function (keycloakRolesArray) { - return await this.fetchResource_fromCacheOrServer(localStorageKey_processScripts, scriptsEndpoint, "process-scripts", keycloakRolesArray); - }; - - this.fetchSingleAccessControlMetadata = function (targetId, keycloakRolesArray) { - return $http({ - url: this.baseUrlToKomMonitorDataAPI + accessControlEndpoint + "/" + targetId, - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - // let cache be checked, but in the background, do not wait for it - self.fetchAccessControlMetadata(keycloakRolesArray); - return response.data; - }); - }; - - this.fetchSingleSpatialUnitMetadata = function (targetSpatialUnitId, keycloakRolesArray) { - return $http({ - url: this.baseUrlToKomMonitorDataAPI + spatialUnitsEndpoint + "/" + targetSpatialUnitId, - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - self.fetchSpatialUnitsMetadata(keycloakRolesArray); - return response.data; - - }); - }; - - this.fetchSingleGeoresourceMetadata = function (targetGeoresourceId, keycloakRolesArray) { - return $http({ - url: this.baseUrlToKomMonitorDataAPI + georesourcesEndpoint + "/" + targetGeoresourceId, - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - self.fetchGeoresourceMetadata(keycloakRolesArray); - return response.data; - - }); - }; - - this.fetchSingleIndicatorMetadata = function (targetIndicatorId, keycloakRolesArray) { - return $http({ - url: this.baseUrlToKomMonitorDataAPI + indicatorsEndpoint + "/" + targetIndicatorId, - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - self.fetchIndicatorsMetadata(keycloakRolesArray); - return response.data; - - }); - }; - - this.fetchSingleIndicatorScriptMetadata = function (targetScriptId, keycloakRolesArray) { - return $http({ - url: this.baseUrlToKomMonitorDataAPI + scriptsEndpoint + "/" + targetScriptId, - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - self.fetchProcessScriptsMetadata(keycloakRolesArray); - return response.data; - - }); - }; - - this.fetchSingleGeoresourceSchema = function (targetGeoresourceId) { - return $http({ - url: this.baseUrlToKomMonitorDataAPI + georesourcesEndpoint + "/" + targetGeoresourceId + "/schema", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - return response.data; - - }); - }; - - this.fetchSingleGeoresourceWithoutGeometry = function (targetGeoresourceId) { - return $http({ - url: this.baseUrlToKomMonitorDataAPI + georesourcesEndpoint + "/" + targetGeoresourceId + "/allFeatures/without-geometry", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - return response.data; - - }); - }; - - this.init = async function () { - this.checkAuthentication(); - - await this.fetchLastDatabaseModificationObject(); - }; - - this.init(); - - }]); + else { + georesourcesEndpoint = georesourcesPublicEndpoint; + spatialUnitsEndpoint = spatialUnitsPublicEndpoint; + indicatorsEndpoint = indicatorsPublicEndpoint; + scriptsEndpoint = scriptsPublicEndpoint; + this.spatialResourceGETUrlPath_forAuthentication = "/public"; + } + }; + this.fetchLastDatabaseModificationObject = async function () { + await $http({ + url: this.baseUrlToKomMonitorDataAPI + "/public/database/last-modification", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + self.lastDatabaseModificationInfo = response.data; + }); + }; + this.fetchResource_fromCacheOrServer = async function (localStorageKey, resourceEndpoint, lastModificationResourceName, keycloakRolesArray) { + // check if the last modification date within local storage is the same as on the server + // if YES, then try to use data from cache + // else set new last modification date, fetch data from server and set that also within localStorage + await this.fetchLastDatabaseModificationObject(); + let timestampKey = localStorageKey + "_timestamp"; + let metadataKey = localStorageKey + "_metadata"; + //TODO: why do we need this? There is ever only a single rolesArray why do we need to differentiate between different roles? + if (keycloakRolesArray && keycloakRolesArray.length > 0) { + // admin role is kommonitor-creator + if (keycloakRolesArray.includes(__env.keycloakKomMonitorAdminRoleName)) { + metadataKey += "_" + __env.keycloakKomMonitorAdminRoleName; + timestampKey += "_" + __env.keycloakKomMonitorAdminRoleName; + } + else { + metadataKey += "_" + JSON.stringify(keycloakRolesArray); + timestampKey += "_" + JSON.stringify(keycloakRolesArray); + } + } + else { + metadataKey += "_public"; + timestampKey += "_public"; + } + let lastModTimestamp_fromCache_string = localStorage.getItem(timestampKey); + if (lastModTimestamp_fromCache_string) { + let lastModTimestamp_fromCache = JSON.parse(lastModTimestamp_fromCache_string); + if (lastModTimestamp_fromCache) { + let lastModTimestamp_fromServer = this.lastDatabaseModificationInfo[lastModificationResourceName]; + if (lastModTimestamp_fromCache == lastModTimestamp_fromServer) { + let storageObject_string = localStorage.getItem(metadataKey); + if (storageObject_string) { + let storageObject = JSON.parse(storageObject_string); + return storageObject; + } + } + } + } + // when code reaches this place we must overwrite/set timestamp and actual metadata + // persist last modification timestamp object as String in local storage + localStorage.setItem(timestampKey, JSON.stringify(this.lastDatabaseModificationInfo[lastModificationResourceName])); + return await $http({ + url: this.baseUrlToKomMonitorDataAPI + resourceEndpoint, + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + localStorage.setItem(metadataKey, JSON.stringify(response.data)); + return response.data; + }); + }; + this.fetchAccessControlMetadata = async function (keycloakRolesArray) { + return await this.fetchResource_fromCacheOrServer(localStorageKey_accessControl, accessControlEndpoint, "access-control", keycloakRolesArray); + }; + this.fetchTopicsMetadata = async function (keycloakRolesArray) { + return await this.fetchResource_fromCacheOrServer(localStorageKey_topics, topicsPublicEndpoint, "topics", keycloakRolesArray); + }; + this.fetchSpatialUnitsMetadata = async function (keycloakRolesArray) { + return await this.fetchResource_fromCacheOrServer(localStorageKey_spatialUnits, spatialUnitsEndpoint, "spatial-units", keycloakRolesArray); + }; + this.fetchIndicatorsMetadata = async function (keycloakRolesArray) { + return await this.fetchResource_fromCacheOrServer(localStorageKey_indicators, indicatorsEndpoint, "indicators", keycloakRolesArray); + }; + this.fetchGeoresourceMetadata = async function (keycloakRolesArray) { + return await this.fetchResource_fromCacheOrServer(localStorageKey_georesources, georesourcesEndpoint, "georesources", keycloakRolesArray); + }; + this.fetchProcessScriptsMetadata = async function (keycloakRolesArray) { + return await this.fetchResource_fromCacheOrServer(localStorageKey_processScripts, scriptsEndpoint, "process-scripts", keycloakRolesArray); + }; + this.fetchSingleAccessControlMetadata = function (targetId, keycloakRolesArray) { + return $http({ + url: this.baseUrlToKomMonitorDataAPI + accessControlEndpoint + "/" + targetId, + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + // let cache be checked, but in the background, do not wait for it + self.fetchAccessControlMetadata(keycloakRolesArray); + return response.data; + }); + }; + this.fetchSingleSpatialUnitMetadata = function (targetSpatialUnitId, keycloakRolesArray) { + return $http({ + url: this.baseUrlToKomMonitorDataAPI + spatialUnitsEndpoint + "/" + targetSpatialUnitId, + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + self.fetchSpatialUnitsMetadata(keycloakRolesArray); + return response.data; + }); + }; + this.fetchSingleGeoresourceMetadata = function (targetGeoresourceId, keycloakRolesArray) { + return $http({ + url: this.baseUrlToKomMonitorDataAPI + georesourcesEndpoint + "/" + targetGeoresourceId, + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + self.fetchGeoresourceMetadata(keycloakRolesArray); + return response.data; + }); + }; + this.fetchSingleIndicatorMetadata = function (targetIndicatorId, keycloakRolesArray) { + return $http({ + url: this.baseUrlToKomMonitorDataAPI + indicatorsEndpoint + "/" + targetIndicatorId, + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + self.fetchIndicatorsMetadata(keycloakRolesArray); + return response.data; + }); + }; + this.fetchSingleIndicatorScriptMetadata = function (targetScriptId, keycloakRolesArray) { + return $http({ + url: this.baseUrlToKomMonitorDataAPI + scriptsEndpoint + "/" + targetScriptId, + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + self.fetchProcessScriptsMetadata(keycloakRolesArray); + return response.data; + }); + }; + this.fetchSingleGeoresourceSchema = function (targetGeoresourceId) { + return $http({ + url: this.baseUrlToKomMonitorDataAPI + georesourcesEndpoint + "/" + targetGeoresourceId + "/schema", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }); + }; + this.fetchSingleGeoresourceWithoutGeometry = function (targetGeoresourceId) { + return $http({ + url: this.baseUrlToKomMonitorDataAPI + georesourcesEndpoint + "/" + targetGeoresourceId + "/allFeatures/without-geometry", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }); + }; + this.init = async function () { + this.checkAuthentication(); + await this.fetchLastDatabaseModificationObject(); + }; + this.init(); + } +]); +//# sourceMappingURL=kommonitor-cache-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorCacheHelperService/kommonitor-cache-helper-service.module.js.map b/app/util/genericServices/kommonitorCacheHelperService/kommonitor-cache-helper-service.module.js.map new file mode 100644 index 000000000..412097258 --- /dev/null +++ b/app/util/genericServices/kommonitorCacheHelperService/kommonitor-cache-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-cache-helper-service.module.js","sourceRoot":"","sources":["kommonitor-cache-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorConfigStorageService/kommonitor-config-storage-service.module.js b/app/util/genericServices/kommonitorConfigStorageService/kommonitor-config-storage-service.module.js index d199edc08..063fed989 100644 --- a/app/util/genericServices/kommonitorConfigStorageService/kommonitor-config-storage-service.module.js +++ b/app/util/genericServices/kommonitorConfigStorageService/kommonitor-config-storage-service.module.js @@ -1,157 +1,128 @@ +"use strict"; angular.module('kommonitorConfigStorage', ['kommonitorDataExchange']); - angular - .module('kommonitorConfigStorage', []) - .service( - 'kommonitorConfigStorageService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', - function ($rootScope, $timeout, - kommonitorDataExchangeService, $http, __env) { - - this.postKeycloakConfig = async function(jsonString){ - - console.log("Trying to POST to config storage service to upload new keycloak config."); - - var formdata = new FormData(); - formdata.append("appConfig", new Blob([jsonString], { type: "application/json"})); - - return await $http({ - url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_keycloakConfig, - method: "POST", - data: formdata, - // must set header content-type to undefined in order to send as multipart-formdata - headers: {"Content-Type": undefined, "Accept": "text/plain" }, - responseType: 'text' - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to config storage service."); - throw response; - }); - }; - - this.postControlsConfig = async function(jsonString){ - - console.log("Trying to POST to config storage service to upload new controls config."); - - var formdata = new FormData(); - formdata.append("appConfig", new Blob([jsonString], { type: "application/json"})); - - return await $http({ - url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_controlsConfig, - method: "POST", - data: formdata, - // must set header content-type to undefined in order to send as multipart-formdata - headers: {"Content-Type": undefined, "Accept": "text/plain" }, - responseType: 'text' - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to config storage service."); - throw response; - }); - }; - - this.postAppConfig = async function(jsString){ - - console.log("Trying to POST to config storage service to upload new app config."); - - var formdata = new FormData(); - formdata.append("appConfig", new Blob([jsString], { type: "application/javascript"})); - - return await $http({ - url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_appConfig, - method: "POST", - data: formdata, - // must set header content-type to undefined in order to send as multipart-formdata - headers: {"Content-Type": undefined, "Accept": "text/plain" }, - responseType: 'text' - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to config storage service."); - throw response; - }); - }; - - this.getKeycloakConfig = async function(){ - return await $http({ - url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_keycloakConfig, - method: "GET", - responseType: 'json' - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while getting keycloak config from config storage service."); - throw response; - }); - }; - - this.getControlsConfig = async function(){ - return await $http({ - url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_controlsConfig, - method: "GET", - responseType: 'json' - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while getting keycloak config from config storage service."); - throw response; - }); - }; - - this.getAppConfig = async function(){ - return await $http({ - url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_appConfig, - method: "GET", - responseType: 'text' - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while getting keycloak config from config storage service."); - throw response; - }); - }; - + .module('kommonitorConfigStorage', []) + .service('kommonitorConfigStorageService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', + function ($rootScope, $timeout, kommonitorDataExchangeService, $http, __env) { + this.postKeycloakConfig = async function (jsonString) { + console.log("Trying to POST to config storage service to upload new keycloak config."); + var formdata = new FormData(); + formdata.append("appConfig", new Blob([jsonString], { type: "application/json" })); + return await $http({ + url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_keycloakConfig, + method: "POST", + data: formdata, + // must set header content-type to undefined in order to send as multipart-formdata + headers: { "Content-Type": undefined, "Accept": "text/plain" }, + responseType: 'text' + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to config storage service."); + throw response; + }); + }; + this.postControlsConfig = async function (jsonString) { + console.log("Trying to POST to config storage service to upload new controls config."); + var formdata = new FormData(); + formdata.append("appConfig", new Blob([jsonString], { type: "application/json" })); + return await $http({ + url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_controlsConfig, + method: "POST", + data: formdata, + // must set header content-type to undefined in order to send as multipart-formdata + headers: { "Content-Type": undefined, "Accept": "text/plain" }, + responseType: 'text' + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to config storage service."); + throw response; + }); + }; + this.postAppConfig = async function (jsString) { + console.log("Trying to POST to config storage service to upload new app config."); + var formdata = new FormData(); + formdata.append("appConfig", new Blob([jsString], { type: "application/javascript" })); + return await $http({ + url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_appConfig, + method: "POST", + data: formdata, + // must set header content-type to undefined in order to send as multipart-formdata + headers: { "Content-Type": undefined, "Accept": "text/plain" }, + responseType: 'text' + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to config storage service."); + throw response; + }); + }; + this.getKeycloakConfig = async function () { + return await $http({ + url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_keycloakConfig, + method: "GET", + responseType: 'json' + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while getting keycloak config from config storage service."); + throw response; + }); + }; + this.getControlsConfig = async function () { + return await $http({ + url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_controlsConfig, + method: "GET", + responseType: 'json' + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while getting keycloak config from config storage service."); + throw response; + }); + }; + this.getAppConfig = async function () { + return await $http({ + url: __env.configStorageServerConfig.targetUrlToConfigStorageServer_appConfig, + method: "GET", + responseType: 'text' + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while getting keycloak config from config storage service."); + throw response; + }); + }; }]); +//# sourceMappingURL=kommonitor-config-storage-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorConfigStorageService/kommonitor-config-storage-service.module.js.map b/app/util/genericServices/kommonitorConfigStorageService/kommonitor-config-storage-service.module.js.map new file mode 100644 index 000000000..d35312f6c --- /dev/null +++ b/app/util/genericServices/kommonitorConfigStorageService/kommonitor-config-storage-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-config-storage-service.module.js","sourceRoot":"","sources":["kommonitor-config-storage-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorDataExchangeService/kommonitor-data-exchange-service.module.js b/app/util/genericServices/kommonitorDataExchangeService/kommonitor-data-exchange-service.module.js index 0cea61601..f710e790b 100644 --- a/app/util/genericServices/kommonitorDataExchangeService/kommonitor-data-exchange-service.module.js +++ b/app/util/genericServices/kommonitorDataExchangeService/kommonitor-data-exchange-service.module.js @@ -1,5 +1,5 @@ +"use strict"; angular.module('kommonitorDataExchange', ['kommonitorMap', 'kommonitorKeycloakHelper']); - /** * a common serviceInstance that holds all needed properties for a WPS service. * @@ -10,1078 +10,867 @@ angular.module('kommonitorDataExchange', ['kommonitorMap', 'kommonitorKeycloakHe * parameters for each WPS operation represented by different Angular components */ angular - .module('kommonitorDataExchange', ['kommonitorCacheHelper', 'angularjs-dropdown-multiselect']) - .service( - 'kommonitorDataExchangeService', ['$rootScope', '$timeout', '$interval', 'kommonitorMapService', 'kommonitorKeycloakHelperService', - 'kommonitorCacheHelperService', - '$http', '__env', '$q', 'Auth', - function($rootScope, $timeout, $interval, - kommonitorMapService, kommonitorKeycloakHelperService, kommonitorCacheHelperService, $http, __env, $q, Auth,) { - - let thisService = this; - this.appTitle = __env.appTitle; - - this.customLogoURL = __env.customLogoURL; - this.customLogo_onClickURL = __env.customLogo_onClickURL; - this.customLogoWidth = __env.customLogoWidth; - this.customGreetingsContact_name = __env.customGreetingsContact_name; - this.customGreetingsContact_organisation = __env.customGreetingsContact_organisation; - this.customGreetingsContact_mail = __env.customGreetingsContact_mail; - this.customGreetingsTextInfoMessage = __env.customGreetingsTextInfoMessage; // maybe undefined or empty string - - this.showDiagramExportButtons = true; - this.showGeoresourceExportButtons = true; - - var numberOfDecimals = __env.numberOfDecimals; - const DATE_PREFIX = __env.indicatorDatePrefix; - var defaultColorForZeroValues = __env.defaultColorForZeroValues; - var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; - var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; - - const defaultColorForOutliers_high = __env.defaultColorForOutliers_high; - const defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; - const defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; - const defaultColorForOutliers_low = __env.defaultColorForOutliers_low; - const defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; - const defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; - - - - var self = this; - - this.headlineIndicatorHierarchy = []; - this.computationIndicatorHierarchy = []; - this.topicIndicatorHierarchy = []; - this.topicIndicatorHierarchy_forOrderView = []; - - this.topicGeoresourceHierarchy = []; - this.topicGeoresourceHierarchy_unmappedEntries = {}; - this.georesourceMapKey_forUnmappedTopicReferences = "unmapped"; - - this.enableKeycloakSecurity = __env.enableKeycloakSecurity; - this.currentKeycloakLoginRoles = []; - this.currentKomMonitorLoginRoleNames = []; - this.currentKeycloakUser; - - // MAP objects for available resource metadata in order to have quick access to datasets by ID - this.availableIndicators_map = new Map(); - this.availableGeoresources_map = new Map(); - this.availableSpatialUnits_map = new Map(); - this.availableProcessScripts_map = new Map(); - - this.accessControl = []; - this.accessControl_map = new Map(); - - // Define translations, settings for dropdown-multiselect - this.multiselectDropdownTranslations = { checkAll: 'Alle auswählen', uncheckAll: 'Nichts auswählen', dynamicButtonTextSuffix: 'Werte ausgewählt', - buttonDefaultText: 'Objekteigenschaften auswählen', searchPlaceholder: 'Suchen...' - }; - - this.multiselectDropdownSettings = { + .module('kommonitorDataExchange', ['kommonitorCacheHelper', 'angularjs-dropdown-multiselect']) + .service('kommonitorDataExchangeService', ['$rootScope', '$timeout', '$interval', 'kommonitorMapService', 'kommonitorKeycloakHelperService', + 'kommonitorCacheHelperService', + '$http', '__env', '$q', 'Auth', + function ($rootScope, $timeout, $interval, kommonitorMapService, kommonitorKeycloakHelperService, kommonitorCacheHelperService, $http, __env, $q, Auth) { + let thisService = this; + this.appTitle = __env.appTitle; + this.customLogoURL = __env.customLogoURL; + this.customLogo_onClickURL = __env.customLogo_onClickURL; + this.customLogoWidth = __env.customLogoWidth; + this.customGreetingsContact_name = __env.customGreetingsContact_name; + this.customGreetingsContact_organisation = __env.customGreetingsContact_organisation; + this.customGreetingsContact_mail = __env.customGreetingsContact_mail; + this.customGreetingsTextInfoMessage = __env.customGreetingsTextInfoMessage; // maybe undefined or empty string + this.showDiagramExportButtons = true; + this.showGeoresourceExportButtons = true; + var numberOfDecimals = __env.numberOfDecimals; + const DATE_PREFIX = __env.indicatorDatePrefix; + var defaultColorForZeroValues = __env.defaultColorForZeroValues; + var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; + var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; + const defaultColorForOutliers_high = __env.defaultColorForOutliers_high; + const defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; + const defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; + const defaultColorForOutliers_low = __env.defaultColorForOutliers_low; + const defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; + const defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; + var self = this; + this.headlineIndicatorHierarchy = []; + this.computationIndicatorHierarchy = []; + this.topicIndicatorHierarchy = []; + this.topicIndicatorHierarchy_forOrderView = []; + this.topicGeoresourceHierarchy = []; + this.topicGeoresourceHierarchy_unmappedEntries = {}; + this.georesourceMapKey_forUnmappedTopicReferences = "unmapped"; + this.enableKeycloakSecurity = __env.enableKeycloakSecurity; + this.currentKeycloakLoginRoles = []; + this.currentKomMonitorLoginRoleNames = []; + this.currentKeycloakUser; + // MAP objects for available resource metadata in order to have quick access to datasets by ID + this.availableIndicators_map = new Map(); + this.availableGeoresources_map = new Map(); + this.availableSpatialUnits_map = new Map(); + this.availableProcessScripts_map = new Map(); + this.accessControl = []; + this.accessControl_map = new Map(); + // Define translations, settings for dropdown-multiselect + this.multiselectDropdownTranslations = { checkAll: 'Alle auswählen', uncheckAll: 'Nichts auswählen', dynamicButtonTextSuffix: 'Werte ausgewählt', + buttonDefaultText: 'Objekteigenschaften auswählen', searchPlaceholder: 'Suchen...' + }; + this.multiselectDropdownSettings = { enableSearch: true, clearSearchOnClose: true, scrollableHeight: '250px', scrollable: true, - buttonClasses: 'form-control btn-block', + buttonClasses: 'form-control btn-block', template: '{{option}}', smartButtonTextConverter(skip, option) { return option; }, styleActive: true - }; - - // Filter out roles unrelated to kommonitor - this.setCurrentKomMonitorLoginRoleNames = function() { - var possibleRoles = ["manage-realm"] + }; + // Filter out roles unrelated to kommonitor + this.setCurrentKomMonitorLoginRoleNames = function () { + var possibleRoles = ["manage-realm"]; this.accessControl.forEach(organizationalUnit => { - organizationalUnit.roles.forEach(role => { - possibleRoles.push(organizationalUnit.name + "-" + role.permissionLevel) - }); + organizationalUnit.roles.forEach(role => { + possibleRoles.push(organizationalUnit.name + "-" + role.permissionLevel); + }); }); this.currentKomMonitorLoginRoleNames = this.currentKeycloakLoginRoles.filter(role => possibleRoles.includes(role)); - } - - this.setCurrentKomMonitorLoginRoleIds = function() { + }; + this.setCurrentKomMonitorLoginRoleIds = function () { this.currentKomMonitorLoginRoleIds = []; - // make a map of all role names currently logged in user according to pattern // - let roleNameMap_loggedIn = new Map(); - for (const roleName of this.currentKeycloakLoginRoles) { - // roleName consists of - - roleNameMap_loggedIn.set(roleName, ""); + // roleName consists of - + roleNameMap_loggedIn.set(roleName, ""); } - // now iterate once over all possible KomMonitor roles and check if they are within previous map this.accessControl.forEach(organizationalUnit => { - organizationalUnit.roles.forEach(role => { - if(roleNameMap_loggedIn.has(organizationalUnit.name + "-" + role.permissionLevel)){ - this.currentKomMonitorLoginRoleIds.push(role.roleId); - } - }); + organizationalUnit.roles.forEach(role => { + if (roleNameMap_loggedIn.has(organizationalUnit.name + "-" + role.permissionLevel)) { + this.currentKomMonitorLoginRoleIds.push(role.roleId); + } + }); }); - }; - - this.getCurrentKomMonitorLoginRoleIds = function() { + }; + this.getCurrentKomMonitorLoginRoleIds = function () { return this.currentKomMonitorLoginRoleIds; - }; - - - this.isAllowedSpatialUnitForCurrentIndicator = function(spatialUnitMetadata){ - if(! this.selectedIndicator){ - return false; + }; + this.isAllowedSpatialUnitForCurrentIndicator = function (spatialUnitMetadata) { + if (!this.selectedIndicator) { + return false; } - - if(! spatialUnitMetadata || ! spatialUnitMetadata.spatialUnitLevel){ - return false; + if (!spatialUnitMetadata || !spatialUnitMetadata.spatialUnitLevel) { + return false; } - var filteredApplicableUnits = this.selectedIndicator.applicableSpatialUnits.filter(function (applicableSpatialUnit) { - if (applicableSpatialUnit.spatialUnitId === spatialUnitMetadata.spatialUnitId){ - return true; - } - else{ - return false; - } + if (applicableSpatialUnit.spatialUnitId === spatialUnitMetadata.spatialUnitId) { + return true; + } + else { + return false; + } }); - return filteredApplicableUnits.length > 0; - }; - - this.FEATURE_ID_PROPERTY_NAME = __env.FEATURE_ID_PROPERTY_NAME; - this.FEATURE_NAME_PROPERTY_NAME = __env.FEATURE_NAME_PROPERTY_NAME; - this.VALID_START_DATE_PROPERTY_NAME = __env.VALID_START_DATE_PROPERTY_NAME; - this.VALID_END_DATE_PROPERTY_NAME = __env.VALID_END_DATE_PROPERTY_NAME; - this.indicatorDatePrefix = __env.indicatorDatePrefix; - - this.datePickerOptions = { + }; + this.FEATURE_ID_PROPERTY_NAME = __env.FEATURE_ID_PROPERTY_NAME; + this.FEATURE_NAME_PROPERTY_NAME = __env.FEATURE_NAME_PROPERTY_NAME; + this.VALID_START_DATE_PROPERTY_NAME = __env.VALID_START_DATE_PROPERTY_NAME; + this.VALID_END_DATE_PROPERTY_NAME = __env.VALID_END_DATE_PROPERTY_NAME; + this.indicatorDatePrefix = __env.indicatorDatePrefix; + this.datePickerOptions = { autoclose: true, - language: 'de', - format: 'yyyy-mm-dd' - }; - - this.disableIndicatorDatePicker = false; - - this.getLimitedDatePickerOptions = function(availableDates){ - + language: 'de', + format: 'yyyy-mm-dd' + }; + this.disableIndicatorDatePicker = false; + this.getLimitedDatePickerOptions = function (availableDates) { var months = new Map(); - var years = new Map(); - var yearMonths = new Map(); - for (const dateString of availableDates) { - var date = new Date(dateString); - var month = date.getMonth() + 1; - var year = date.getFullYear(); - var yearMonth = year + "-" + month; - - months.set(month, month); - years.set(year, year); - yearMonths.set(yearMonth, yearMonth); + var date = new Date(dateString); + var month = date.getMonth() + 1; + var year = date.getFullYear(); + var yearMonth = year + "-" + month; + months.set(month, month); + years.set(year, year); + yearMonths.set(yearMonth, yearMonth); } - var newDatePickerOptions = { - autoclose: true, - language: 'de', - format: 'yyyy-mm-dd', - endDate: new Date(availableDates[availableDates.length - 1]), - startDate: new Date(availableDates[0]), - defaultViewDate: new Date(availableDates[availableDates.length - 1]), - beforeShowDay: function(date) { - var month = (date.getMonth()+1); - if (month < 10 ){ - month = "0" + month; - } - var day = (date.getDate()); - if (day < 10 ){ - day = "0" + day; - } - var dateString = date.getFullYear() + "-" + month + "-" + day; - - if (availableDates.includes(dateString)) { - - return "enabled-datepicker-item"; - - } else { - - return "disabled disabled-datepicker-item"; - - } - }, - beforeShowMonth: function(date) { - var month = date.getMonth()+1; - var year = date.getFullYear(); - var yearMonth = year + "-" + month; - - if (yearMonths.has(yearMonth)) { - - return "enabled-datepicker-item"; - - } else { - - return "disabled disabled-datepicker-item"; - - } - }, - beforeShowYear: function(date) { - var year = date.getFullYear(); - - if (years.has(year)) { - - return "enabled-datepicker-item"; - - } else { - - return "disabled disabled-datepicker-item"; - - } - }, - beforeShowDecade: function(date) { - var year = date.getFullYear(); - - if (years.has(year)) { - - return "enabled-datepicker-item"; - - } else { - - return "disabled disabled-datepicker-item"; - - } - }, - beforeShowCentury: function(date) { - var year = date.getFullYear(); - - if (years.has(year)) { - - return "enabled-datepicker-item"; - - } else { - - return "disabled disabled-datepicker-item"; - - } - } + autoclose: true, + language: 'de', + format: 'yyyy-mm-dd', + endDate: new Date(availableDates[availableDates.length - 1]), + startDate: new Date(availableDates[0]), + defaultViewDate: new Date(availableDates[availableDates.length - 1]), + beforeShowDay: function (date) { + var month = (date.getMonth() + 1); + if (month < 10) { + month = "0" + month; + } + var day = (date.getDate()); + if (day < 10) { + day = "0" + day; + } + var dateString = date.getFullYear() + "-" + month + "-" + day; + if (availableDates.includes(dateString)) { + return "enabled-datepicker-item"; + } + else { + return "disabled disabled-datepicker-item"; + } + }, + beforeShowMonth: function (date) { + var month = date.getMonth() + 1; + var year = date.getFullYear(); + var yearMonth = year + "-" + month; + if (yearMonths.has(yearMonth)) { + return "enabled-datepicker-item"; + } + else { + return "disabled disabled-datepicker-item"; + } + }, + beforeShowYear: function (date) { + var year = date.getFullYear(); + if (years.has(year)) { + return "enabled-datepicker-item"; + } + else { + return "disabled disabled-datepicker-item"; + } + }, + beforeShowDecade: function (date) { + var year = date.getFullYear(); + if (years.has(year)) { + return "enabled-datepicker-item"; + } + else { + return "disabled disabled-datepicker-item"; + } + }, + beforeShowCentury: function (date) { + var year = date.getFullYear(); + if (years.has(year)) { + return "enabled-datepicker-item"; + } + else { + return "disabled disabled-datepicker-item"; + } + } }; - return newDatePickerOptions; - }; - - this.adminUserName = __env.adminUserName; - this.adminPassword = __env.adminPassword; - this.adminIsLoggedIn = false; - - this.availablePoiMarkerColors = [ + }; + this.adminUserName = __env.adminUserName; + this.adminPassword = __env.adminPassword; + this.adminIsLoggedIn = false; + this.availablePoiMarkerColors = [ { - "colorName" : "red", - "colorValue" : "rgb(205,59,40)" + "colorName": "red", + "colorValue": "rgb(205,59,40)" }, { - "colorName" : "white", - "colorValue" : "rgb(255,255,255)" + "colorName": "white", + "colorValue": "rgb(255,255,255)" }, { - "colorName" : "orange", - "colorValue" : "rgb(235,144,46)" + "colorName": "orange", + "colorValue": "rgb(235,144,46)" }, { - "colorName" : "beige", - "colorValue" : "rgb(255,198,138)" + "colorName": "beige", + "colorValue": "rgb(255,198,138)" }, { - "colorName" : "green", - "colorValue" : "rgb(108,166,36)" + "colorName": "green", + "colorValue": "rgb(108,166,36)" }, { - "colorName" : "blue", - "colorValue" : "rgb(53,161,209)" + "colorName": "blue", + "colorValue": "rgb(53,161,209)" }, { - "colorName" : "purple", - "colorValue" : "rgb(198,77,175)" + "colorName": "purple", + "colorValue": "rgb(198,77,175)" }, { - "colorName" : "pink", - "colorValue" : "rgb(255,138,232)" + "colorName": "pink", + "colorValue": "rgb(255,138,232)" }, { - "colorName" : "gray", - "colorValue" : "rgb(163,163,163)" + "colorName": "gray", + "colorValue": "rgb(163,163,163)" }, { - "colorName" : "black", - "colorValue" : "rgb(47,47,47)" + "colorName": "black", + "colorValue": "rgb(47,47,47)" } - ]; - - this.availableLoiDashArrayObjects = [ + ]; + this.availableLoiDashArrayObjects = [ { - "svgString" : '', - "dashArrayValue" : "" + "svgString": '', + "dashArrayValue": "" }, { - "svgString" : '', - "dashArrayValue" : "20" + "svgString": '', + "dashArrayValue": "20" }, { - "svgString" : '', - "dashArrayValue" : "20 10" + "svgString": '', + "dashArrayValue": "20 10" }, { - "svgString" : '', - "dashArrayValue" : "20 10 5 10" + "svgString": '', + "dashArrayValue": "20 10 5 10" }, { - "svgString" : '', - "dashArrayValue" : "5" + "svgString": '', + "dashArrayValue": "5" } - ]; - - this.getLoiDashSvgFromStringValue = function(loiDashArrayString){ + ]; + this.getLoiDashSvgFromStringValue = function (loiDashArrayString) { for (const loiDashArrayObject of this.availableLoiDashArrayObjects) { - if(loiDashArrayObject.dashArrayValue == loiDashArrayString){ - return loiDashArrayObject.svgString; - } + if (loiDashArrayObject.dashArrayValue == loiDashArrayString) { + return loiDashArrayObject.svgString; + } } - }; - - this.kommonitorMapServiceInstance = kommonitorMapService; - - this.updateIntervalOptions = __env.updateIntervalOptions; - this.indicatorTypeOptions = __env.indicatorTypeOptions; - this.indicatorUnitOptions = __env.indicatorUnitOptions.sort(); - this.indicatorCreationTypeOptions = __env.indicatorCreationTypeOptions; - this.geodataSourceFormats = __env.geodataSourceFormats; - - this.anySideBarIsShown = false; - - this.isMeasureOfValueChecked = false; - this.isBalanceChecked = false; - this.indicatorAndMetadataAsBalance; - this.tmpIndicatorGeoJSON = undefined; - - this.wmsUrlForSelectedIndicator = undefined; - this.wfsUrlForSelectedIndicator = undefined; - - this.baseUrlToKomMonitorDataAPI = __env.apiUrl + __env.basePath; - this.simplifyGeometriesParameterName = __env.simplifyGeometriesParameterName; - this.simplifyGeometriesOptions = __env.simplifyGeometriesOptions; - this.simplifyGeometries = __env.simplifyGeometries; - - this.wmsDatasets = __env.wmsDatasets.sort((a, b) => (a.title > b.title) ? 1 : -1); - this.wfsDatasets = __env.wfsDatasets.sort((a, b) => (a.title > b.title) ? 1 : -1); - this.wmsDatasets_keywordFiltered = JSON.parse(JSON.stringify(this.wmsDatasets)); - this.wfsDatasets_keywordFiltered = JSON.parse(JSON.stringify(this.wfsDatasets)); - - - this.fileDatasets = []; - - this.availableRoles = []; - this.availableUsers = []; - this.availableProcessScripts = []; - this.isochroneLegend; - - this.useOutlierDetectionOnIndicator = __env.useOutlierDetectionOnIndicator; - this.classifyZeroSeparately = __env.classifyZeroSeparately; - this.classifyUsingWholeTimeseries = __env.classifyUsingWholeTimeseries; - this.useNoDataToggle = __env.useNoDataToggle; - - this.getUpdateIntervalDisplayValue = function(apiValue){ + }; + this.kommonitorMapServiceInstance = kommonitorMapService; + this.updateIntervalOptions = __env.updateIntervalOptions; + this.indicatorTypeOptions = __env.indicatorTypeOptions; + this.indicatorUnitOptions = __env.indicatorUnitOptions.sort(); + this.indicatorCreationTypeOptions = __env.indicatorCreationTypeOptions; + this.geodataSourceFormats = __env.geodataSourceFormats; + this.anySideBarIsShown = false; + this.isMeasureOfValueChecked = false; + this.isBalanceChecked = false; + this.indicatorAndMetadataAsBalance; + this.tmpIndicatorGeoJSON = undefined; + this.wmsUrlForSelectedIndicator = undefined; + this.wfsUrlForSelectedIndicator = undefined; + this.baseUrlToKomMonitorDataAPI = __env.apiUrl + __env.basePath; + this.simplifyGeometriesParameterName = __env.simplifyGeometriesParameterName; + this.simplifyGeometriesOptions = __env.simplifyGeometriesOptions; + this.simplifyGeometries = __env.simplifyGeometries; + this.wmsDatasets = __env.wmsDatasets.sort((a, b) => (a.title > b.title) ? 1 : -1); + this.wfsDatasets = __env.wfsDatasets.sort((a, b) => (a.title > b.title) ? 1 : -1); + this.wmsDatasets_keywordFiltered = JSON.parse(JSON.stringify(this.wmsDatasets)); + this.wfsDatasets_keywordFiltered = JSON.parse(JSON.stringify(this.wfsDatasets)); + this.fileDatasets = []; + this.availableRoles = []; + this.availableUsers = []; + this.availableProcessScripts = []; + this.isochroneLegend; + this.useOutlierDetectionOnIndicator = __env.useOutlierDetectionOnIndicator; + this.classifyZeroSeparately = __env.classifyZeroSeparately; + this.classifyUsingWholeTimeseries = __env.classifyUsingWholeTimeseries; + this.useNoDataToggle = __env.useNoDataToggle; + this.getUpdateIntervalDisplayValue = function (apiValue) { for (const updateIntervalOption of this.updateIntervalOptions) { - if(updateIntervalOption.apiName === apiValue){ - return updateIntervalOption.displayName - } + if (updateIntervalOption.apiName === apiValue) { + return updateIntervalOption.displayName; + } } - }; - - this.getBaseUrlToKomMonitorDataAPI_spatialResource = function(){ + }; + this.getBaseUrlToKomMonitorDataAPI_spatialResource = function () { return this.baseUrlToKomMonitorDataAPI + kommonitorCacheHelperService.spatialResourceGETUrlPath_forAuthentication; - }; - - this.setProcessScripts = function(scriptsArray){ - this.availableProcessScripts = scriptsArray; + }; + this.setProcessScripts = function (scriptsArray) { + this.availableProcessScripts = scriptsArray; this.availableProcessScripts_map = new Map(); for (const scriptMetadata of scriptsArray) { - this.availableProcessScripts_map.set(scriptMetadata.scriptId, scriptMetadata); + this.availableProcessScripts_map.set(scriptMetadata.scriptId, scriptMetadata); } - }; - - this.addSingleProcessScriptMetadata = function(processScriptMetadata){ + }; + this.addSingleProcessScriptMetadata = function (processScriptMetadata) { let tmpArray = [processScriptMetadata]; Array.prototype.push.apply(tmpArray, this.availableProcessScripts); - this.availableProcessScripts = tmpArray; + this.availableProcessScripts = tmpArray; this.availableProcessScripts_map.set(processScriptMetadata.scriptId, processScriptMetadata); - }; - - this.replaceSingleProcessScriptMetadata = function(processScriptMetadata){ + }; + this.replaceSingleProcessScriptMetadata = function (processScriptMetadata) { for (let index = 0; index < this.availableProcessScripts.length; index++) { - let processScript = this.availableProcessScripts[index]; - if(processScript.scriptId == processScriptMetadata.scriptId){ - this.availableProcessScripts[index] = processScriptMetadata; - break; - } + let processScript = this.availableProcessScripts[index]; + if (processScript.scriptId == processScriptMetadata.scriptId) { + this.availableProcessScripts[index] = processScriptMetadata; + break; + } } this.availableProcessScripts_map.set(processScriptMetadata.scriptId, processScriptMetadata); - }; - - this.deleteSingleProcessScriptMetadata = function(processScriptId){ + }; + this.deleteSingleProcessScriptMetadata = function (processScriptId) { for (let index = 0; index < this.availableProcessScripts.length; index++) { - const processScript = this.availableProcessScripts[index]; - if(processScript.scriptId == processScriptId){ - this.availableProcessScripts.splice(index, 1); - break; - } + const processScript = this.availableProcessScripts[index]; + if (processScript.scriptId == processScriptId) { + this.availableProcessScripts.splice(index, 1); + break; + } } this.availableProcessScripts_map.delete(processScriptId); - }; - - this.getProcessScriptMetadataById = function(scriptId){ + }; + this.getProcessScriptMetadataById = function (scriptId) { return this.availableProcessScripts_map.get(scriptId); - }; - - - // ERROR HANDLING - this.errorMessage = undefined; - this.hideErrorAlert = function(){ + }; + // ERROR HANDLING + this.errorMessage = undefined; + this.hideErrorAlert = function () { $(".mapApplicationErrorAlert").hide(); - }; - - this.displayMapApplicationError = function(error){ + }; + this.displayMapApplicationError = function (error) { $timeout(function () { - if(error.data){ - self.errorMessage = self.syntaxHighlightJSON(error.data); + if (error.data) { + self.errorMessage = self.syntaxHighlightJSON(error.data); } - if(error.message){ - self.errorMessage = self.syntaxHighlightJSON(error.message); + if (error.message) { + self.errorMessage = self.syntaxHighlightJSON(error.message); } - else{ - self.errorMessage = self.syntaxHighlightJSON(error); + else { + self.errorMessage = self.syntaxHighlightJSON(error); } - // $rootScope.$apply(); $rootScope.$broadcast("hideLoadingIconOnMap"); - $(".mapApplicationErrorAlert").show(); - }, 1000); - - }; - - // SPATIAL UNITS - - this.availableSpatialUnits = []; - - this.selectedSpatialUnit; - this.selectedDate; - - this.setSpatialUnits = function(spatialUnitsArray){ - this.availableSpatialUnits = spatialUnitsArray; + }, 1000); + }; + // SPATIAL UNITS + this.availableSpatialUnits = []; + this.selectedSpatialUnit; + this.selectedDate; + this.setSpatialUnits = function (spatialUnitsArray) { + this.availableSpatialUnits = spatialUnitsArray; this.availableSpatialUnits_map = new Map(); for (const spatialUnitMetadata of spatialUnitsArray) { - this.availableSpatialUnits_map.set(spatialUnitMetadata.spatialUnitId, spatialUnitMetadata); + this.availableSpatialUnits_map.set(spatialUnitMetadata.spatialUnitId, spatialUnitMetadata); } - }; - - this.addSingleSpatialUnitMetadata = function(spatialUnitMetadata){ + }; + this.addSingleSpatialUnitMetadata = function (spatialUnitMetadata) { let tmpArray = [spatialUnitMetadata]; Array.prototype.push.apply(tmpArray, this.availableSpatialUnits); - this.availableSpatialUnits = tmpArray; + this.availableSpatialUnits = tmpArray; this.availableSpatialUnits_map.set(spatialUnitMetadata.spatialUnitId, spatialUnitMetadata); - }; - - this.replaceSingleSpatialUnitMetadata = function(spatialUnitMetadata){ + }; + this.replaceSingleSpatialUnitMetadata = function (spatialUnitMetadata) { for (let index = 0; index < this.availableSpatialUnits.length; index++) { - let spatialUnit = this.availableSpatialUnits[index]; - if(spatialUnit.spatialUnitId == spatialUnitMetadata.spatialUnitId){ - this.availableSpatialUnits[index] = spatialUnitMetadata; - break; - } + let spatialUnit = this.availableSpatialUnits[index]; + if (spatialUnit.spatialUnitId == spatialUnitMetadata.spatialUnitId) { + this.availableSpatialUnits[index] = spatialUnitMetadata; + break; + } } this.availableSpatialUnits_map.set(spatialUnitMetadata.spatialUnitId, spatialUnitMetadata); - }; - - this.deleteSingleSpatialUnitMetadata = function(spatialUnitId){ + }; + this.deleteSingleSpatialUnitMetadata = function (spatialUnitId) { for (let index = 0; index < this.availableSpatialUnits.length; index++) { - const spatialUnit = this.availableSpatialUnits[index]; - if(spatialUnit.spatialUnitId == spatialUnitId){ - this.availableSpatialUnits.splice(index, 1); - break; - } + const spatialUnit = this.availableSpatialUnits[index]; + if (spatialUnit.spatialUnitId == spatialUnitId) { + this.availableSpatialUnits.splice(index, 1); + break; + } } this.availableSpatialUnits_map.delete(spatialUnitId); - }; - - // GEORESOURCES - - this.availableGeoresources = []; - this.displayableGeoresources = []; - this.displayableGeoresources_keywordFiltered = []; - this.displayableGeoresources_keywordFiltered_forAlphabeticalDisplay = {}; - - this.selectedGeoresource; - - this.setGeoresources = function(georesourcesArray){ - this.availableGeoresources = georesourcesArray; - + }; + // GEORESOURCES + this.availableGeoresources = []; + this.displayableGeoresources = []; + this.displayableGeoresources_keywordFiltered = []; + this.displayableGeoresources_keywordFiltered_forAlphabeticalDisplay = {}; + this.selectedGeoresource; + this.setGeoresources = function (georesourcesArray) { + this.availableGeoresources = georesourcesArray; this.availableGeoresources_map = new Map(); for (const georesourceMetadata of georesourcesArray) { - this.availableGeoresources_map.set(georesourceMetadata.georesourceId, georesourceMetadata); + this.availableGeoresources_map.set(georesourceMetadata.georesourceId, georesourceMetadata); } - this.displayableGeoresources = this.availableGeoresources.filter(item => self.isDisplayableGeoresource(item)); this.displayableGeoresources_keywordFiltered = JSON.parse(JSON.stringify(this.displayableGeoresources)); - this.wmsDatasets_keywordFiltered = JSON.parse(JSON.stringify(this.wmsDatasets)); this.wfsDatasets_keywordFiltered = JSON.parse(JSON.stringify(this.wfsDatasets)); - this.displayableGeoresources_keywordFiltered_forAlphabeticalDisplay = { - poiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isPOI), - loiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isLOI), - aoiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isAOI), - wmsData: this.wmsDatasets_keywordFiltered, - wfsData: this.wfsDatasets_keywordFiltered + poiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isPOI), + loiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isLOI), + aoiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isAOI), + wmsData: this.wmsDatasets_keywordFiltered, + wfsData: this.wfsDatasets_keywordFiltered }; - }; - - this.addSingleGeoresourceMetadata = function(georesourceMetadata){ + }; + this.addSingleGeoresourceMetadata = function (georesourceMetadata) { let tmpArray = [georesourceMetadata]; Array.prototype.push.apply(tmpArray, this.availableGeoresources); - this.availableGeoresources = tmpArray; + this.availableGeoresources = tmpArray; this.availableGeoresources_map.set(georesourceMetadata.georesourceId, georesourceMetadata); - }; - - this.replaceSingleGeoresourceMetadata = function(georesourceMetadata){ + }; + this.replaceSingleGeoresourceMetadata = function (georesourceMetadata) { for (let index = 0; index < this.availableGeoresources.length; index++) { - let georesource = this.availableGeoresources[index]; - if(georesource.georesourceId == georesourceMetadata.georesourceId){ - this.availableGeoresources[index] = georesourceMetadata; - break; - } + let georesource = this.availableGeoresources[index]; + if (georesource.georesourceId == georesourceMetadata.georesourceId) { + this.availableGeoresources[index] = georesourceMetadata; + break; + } } this.availableGeoresources_map.set(georesourceMetadata.georesourceId, georesourceMetadata); - }; - - this.deleteSingleGeoresourceMetadata = function(georesourceId){ + }; + this.deleteSingleGeoresourceMetadata = function (georesourceId) { for (let index = 0; index < this.availableGeoresources.length; index++) { - const georesource = this.availableGeoresources[index]; - if(georesource.georesourceId == georesourceId){ - this.availableGeoresources.splice(index, 1); - break; - } + const georesource = this.availableGeoresources[index]; + if (georesource.georesourceId == georesourceId) { + this.availableGeoresources.splice(index, 1); + break; + } } this.availableGeoresources_map.delete(georesourceId); - }; - - // INDICATORS - - this.availableIndicators = []; - this.displayableIndicators = []; - - this.selectedIndicator; - // backup used when switching themes --< this might make selectedIndicator undefined due to filtering list of theme-matching indicators - this.selectedIndicatorBackup; - this.wmsUrlForSelectedIndicator; - this.wfsUrlForSelectedIndicator; - - this.selectedIndicatorLegendURL; - - this.measureOfValue = 51; - - // updateInterval (from kommonitor data management api) = ['ARBITRARY', 'MONTHLY', 'QUARTERLY', 'HALF_YEARLY', 'YEARLY'] - this.updateInterval = new Map(); - this.updateInterval.set("ARBITRARY", "beliebig"); - this.updateInterval.set("YEARLY", "jährlich"); - this.updateInterval.set("HALF_YEARLY", "halbjährig"); - this.updateInterval.set("MONTHLY", "monatlich"); - this.updateInterval.set("QUARTERLY", "vierteljährlich"); - - this.setIndicators = function(indicatorsArray){ - this.availableIndicators = indicatorsArray; + }; + // INDICATORS + this.availableIndicators = []; + this.displayableIndicators = []; + this.selectedIndicator; + // backup used when switching themes --< this might make selectedIndicator undefined due to filtering list of theme-matching indicators + this.selectedIndicatorBackup; + this.wmsUrlForSelectedIndicator; + this.wfsUrlForSelectedIndicator; + this.selectedIndicatorLegendURL; + this.measureOfValue = 51; + // updateInterval (from kommonitor data management api) = ['ARBITRARY', 'MONTHLY', 'QUARTERLY', 'HALF_YEARLY', 'YEARLY'] + this.updateInterval = new Map(); + this.updateInterval.set("ARBITRARY", "beliebig"); + this.updateInterval.set("YEARLY", "jährlich"); + this.updateInterval.set("HALF_YEARLY", "halbjährig"); + this.updateInterval.set("MONTHLY", "monatlich"); + this.updateInterval.set("QUARTERLY", "vierteljährlich"); + this.setIndicators = function (indicatorsArray) { + this.availableIndicators = indicatorsArray; this.availableIndicators_map = new Map(); - for (const indicatorMetadata of indicatorsArray) { - this.availableIndicators_map.set(indicatorMetadata.indicatorId, indicatorMetadata); + this.availableIndicators_map.set(indicatorMetadata.indicatorId, indicatorMetadata); } - }; - - this.addSingleIndicatorMetadata = function(indicatorMetadata){ + }; + this.addSingleIndicatorMetadata = function (indicatorMetadata) { let tmpArray = [indicatorMetadata]; Array.prototype.push.apply(tmpArray, this.availableIndicators); - this.availableIndicators = tmpArray; + this.availableIndicators = tmpArray; this.availableIndicators_map.set(indicatorMetadata.indicatorId, indicatorMetadata); - }; - - this.replaceSingleIndicatorMetadata = function(indicatorMetadata){ + }; + this.replaceSingleIndicatorMetadata = function (indicatorMetadata) { for (let index = 0; index < this.availableIndicators.length; index++) { - let indicator = this.availableIndicators[index]; - if(indicator.indicatorId == indicatorMetadata.indicatorId){ - this.availableIndicators[index] = indicatorMetadata; - break; - } + let indicator = this.availableIndicators[index]; + if (indicator.indicatorId == indicatorMetadata.indicatorId) { + this.availableIndicators[index] = indicatorMetadata; + break; + } } this.availableIndicators_map.set(indicatorMetadata.indicatorId, indicatorMetadata); - }; - - this.deleteSingleIndicatorMetadata = function(indicatorId){ + }; + this.deleteSingleIndicatorMetadata = function (indicatorId) { for (let index = 0; index < this.availableIndicators.length; index++) { - const indicator = this.availableIndicators[index]; - if(indicator.indicatorId == indicatorId){ - this.availableIndicators.splice(index, 1); - break; - } + const indicator = this.availableIndicators[index]; + if (indicator.indicatorId == indicatorId) { + this.availableIndicators.splice(index, 1); + break; + } } this.availableIndicators_map.delete(indicatorId); - }; - - - // TOPICS - - this.availableTopics = []; - - this.selectedTopic; - - this.setTopics = function(topicsArray){ - this.availableTopics = topicsArray; - }; - - this.topicHierarchyContainsGeoresource = function(topic, georesourceMetadata){ + }; + // TOPICS + this.availableTopics = []; + this.selectedTopic; + this.setTopics = function (topicsArray) { + this.availableTopics = topicsArray; + }; + this.topicHierarchyContainsGeoresource = function (topic, georesourceMetadata) { // luckily, the topicReference is defined exactly like for indicators // hence we can simply refer to that method - return this.topicHierarchyContainsIndicator(topic, georesourceMetadata); - }; - - this.topicHierarchyContainsWms = function(topic, wmsMetadata){ + }; + this.topicHierarchyContainsWms = function (topic, wmsMetadata) { // luckily, the topicReference is defined exactly like for indicators // hence we can simply refer to that method - return this.topicHierarchyContainsIndicator(topic, wmsMetadata); - }; - - this.topicHierarchyContainsWfs = function(topic, wfsMetadata){ + }; + this.topicHierarchyContainsWfs = function (topic, wfsMetadata) { // luckily, the topicReference is defined exactly like for indicators // hence we can simply refer to that method - return this.topicHierarchyContainsIndicator(topic, wfsMetadata); - }; - - this.topicHierarchyContainsIndicator = function(topic, indicatorMetadata){ - if(topic === null || topic === ""){ - if (indicatorMetadata.topicReference === null || indicatorMetadata.topicReference === "" || ! this.referencedTopicIdExists(indicatorMetadata.topicReference)){ - return true; - } - else{ - return false; - } + }; + this.topicHierarchyContainsIndicator = function (topic, indicatorMetadata) { + if (topic === null || topic === "") { + if (indicatorMetadata.topicReference === null || indicatorMetadata.topicReference === "" || !this.referencedTopicIdExists(indicatorMetadata.topicReference)) { + return true; + } + else { + return false; + } } - - if (topic.topicId === indicatorMetadata.topicReference){ - return true; + if (topic.topicId === indicatorMetadata.topicReference) { + return true; } - else{ - return this.anySubTopicContainsIndicator(topic, indicatorMetadata); + else { + return this.anySubTopicContainsIndicator(topic, indicatorMetadata); } - }; - - this.anySubTopicContainsIndicator = function(topic, indicatorMetadata){ + }; + this.anySubTopicContainsIndicator = function (topic, indicatorMetadata) { var isContained = false; - for (const subTopic of topic.subTopics) { - isContained = this.topicHierarchyContainsIndicator(subTopic, indicatorMetadata); - - if(isContained){ - break; - } + isContained = this.topicHierarchyContainsIndicator(subTopic, indicatorMetadata); + if (isContained) { + break; + } } - return isContained; - }; - - // topic may be null - this.getGeoresourceDatasets = function(topic, georesourceNameFilter, showPOI, showLOI, showAOI, showWMS, showWFS){ - var availableGeoresources = this.getAvailableGeoresources(topic, georesourceNameFilter, showPOI, showLOI, showAOI); + }; + // topic may be null + this.getGeoresourceDatasets = function (topic, georesourceNameFilter, showPOI, showLOI, showAOI, showWMS, showWFS) { + var availableGeoresources = this.getAvailableGeoresources(topic, georesourceNameFilter, showPOI, showLOI, showAOI); var wmsDatasets = this.getAvailableWmsDatasets(topic, georesourceNameFilter, showWMS); var wfsDatasets = this.getAvailableWfsDatasets(topic, georesourceNameFilter, showWFS); - var datasets = availableGeoresources.concat(wmsDatasets).concat(wfsDatasets); return datasets; - }; - - this.getNumberOfGeoresources = function(topic, georesourceNameFilter, showPOI, showLOI, showAOI, showWMS, showWFS){ - - var numberOfAvailableGeoresources = this.getNumberOfAvailableGeoresources(topic, georesourceNameFilter, showPOI, showLOI, showAOI); + }; + this.getNumberOfGeoresources = function (topic, georesourceNameFilter, showPOI, showLOI, showAOI, showWMS, showWFS) { + var numberOfAvailableGeoresources = this.getNumberOfAvailableGeoresources(topic, georesourceNameFilter, showPOI, showLOI, showAOI); var numberOfWmsDatasets = this.getNumberOfAvailableWmsDatasets(topic, georesourceNameFilter, showWMS); var numberOfWfsDatasets = this.getNumberOfAvailableWfsDatasets(topic, georesourceNameFilter, showWFS); - var numberOfResources = numberOfAvailableGeoresources + numberOfWmsDatasets + numberOfWfsDatasets; return numberOfResources; - }; - - var filterGeoresourcesByTypes = function(georesourceMetadataArray, showPOI, showLOI, showAOI){ - - if(!showPOI && !showLOI && !showAOI){ - return []; - } - - return georesourceMetadataArray.filter(georesourceMetadata => { - if(georesourceMetadata.isPOI){ - if(showPOI){ - return true; - } - else{ - return false; + }; + var filterGeoresourcesByTypes = function (georesourceMetadataArray, showPOI, showLOI, showAOI) { + if (!showPOI && !showLOI && !showAOI) { + return []; + } + return georesourceMetadataArray.filter(georesourceMetadata => { + if (georesourceMetadata.isPOI) { + if (showPOI) { + return true; + } + else { + return false; + } } - } - else if(georesourceMetadata.isLOI){ - if(showLOI){ - return true; + else if (georesourceMetadata.isLOI) { + if (showLOI) { + return true; + } + else { + return false; + } } - else{ - return false; + else if (georesourceMetadata.isAOI) { + if (showAOI) { + return true; + } + else { + return false; + } } - } - else if(georesourceMetadata.isAOI){ - if(showAOI){ - return true; - } - else{ - return false; + else { + return false; } - } - else{ - return false; - } }); - }; - - this.getAvailableGeoresources = function(topic, georesourceNameFilter, showPOI, showLOI, showAOI){ + }; + this.getAvailableGeoresources = function (topic, georesourceNameFilter, showPOI, showLOI, showAOI) { var georesources = []; - var filteredGeoresources = this.availableGeoresources; - filteredGeoresources = filterByGeoresourceNamesToHide(filteredGeoresources); - - if(georesourceNameFilter && georesourceNameFilter != ""){ - filteredGeoresources = filterArrayObjectsByValue(filteredGeoresources, georesourceNameFilter); + if (georesourceNameFilter && georesourceNameFilter != "") { + filteredGeoresources = filterArrayObjectsByValue(filteredGeoresources, georesourceNameFilter); } - filteredGeoresources = filterGeoresourcesByTypes(filteredGeoresources, showPOI, showLOI, showAOI); - - for (const georesourceMetadata of filteredGeoresources) { - if (this.topicHierarchyContainsGeoresource(topic, georesourceMetadata)){ - georesources.push(georesourceMetadata); - } + for (const georesourceMetadata of filteredGeoresources) { + if (this.topicHierarchyContainsGeoresource(topic, georesourceMetadata)) { + georesources.push(georesourceMetadata); + } } - return georesources; - }; - - this.getNumberOfAvailableGeoresources = function(topic, georesourceNameFilter, showPOI, showLOI, showAOI){ + }; + this.getNumberOfAvailableGeoresources = function (topic, georesourceNameFilter, showPOI, showLOI, showAOI) { return this.getAvailableGeoresources(topic, georesourceNameFilter, showPOI, showLOI, showAOI).length; - }; - - this.getAvailableWmsDatasets = function(topic, georesourceNameFilter, showWMS){ - if(!showWMS){ - return []; + }; + this.getAvailableWmsDatasets = function (topic, georesourceNameFilter, showWMS) { + if (!showWMS) { + return []; } - var wmsDatasets = []; - var filteredWmsDatasets = this.wmsDatasets; - - if(georesourceNameFilter && georesourceNameFilter != ""){ - filteredWmsDatasets = filterArrayObjectsByValue(filteredWmsDatasets, georesourceNameFilter); + if (georesourceNameFilter && georesourceNameFilter != "") { + filteredWmsDatasets = filterArrayObjectsByValue(filteredWmsDatasets, georesourceNameFilter); } - for (const wmsMetadata of filteredWmsDatasets) { - if (this.topicHierarchyContainsWms(topic, wmsMetadata)){ - wmsDatasets.push(wmsMetadata); - } + if (this.topicHierarchyContainsWms(topic, wmsMetadata)) { + wmsDatasets.push(wmsMetadata); + } } - return wmsDatasets; - }; - - this.getNumberOfAvailableWmsDatasets = function(topic, georesourceNameFilter, showWMS){ - if(!showWMS){ - return 0; + }; + this.getNumberOfAvailableWmsDatasets = function (topic, georesourceNameFilter, showWMS) { + if (!showWMS) { + return 0; } - return this.getAvailableWmsDatasets(topic, georesourceNameFilter, showWMS).length; - }; - - this.getAvailableWfsDatasets = function(topic, georesourceNameFilter, showWFS){ - if(!showWFS){ - return []; + }; + this.getAvailableWfsDatasets = function (topic, georesourceNameFilter, showWFS) { + if (!showWFS) { + return []; } - var wfsDatasets = []; - var filteredWfsDatasets = this.wfsDatasets; - - if(georesourceNameFilter && georesourceNameFilter != ""){ - filteredWfsDatasets = filterArrayObjectsByValue(filteredWfsDatasets, georesourceNameFilter); + if (georesourceNameFilter && georesourceNameFilter != "") { + filteredWfsDatasets = filterArrayObjectsByValue(filteredWfsDatasets, georesourceNameFilter); } - for (const wfsMetadata of filteredWfsDatasets) { - if (this.topicHierarchyContainsWms(topic, wfsMetadata)){ - wfsDatasets.push(wfsMetadata); - } + if (this.topicHierarchyContainsWms(topic, wfsMetadata)) { + wfsDatasets.push(wfsMetadata); + } } - return wfsDatasets; - }; - - this.getNumberOfAvailableWfsDatasets = function(topic, georesourceNameFilter, showWFS){ - if(!showWFS){ - return 0; + }; + this.getNumberOfAvailableWfsDatasets = function (topic, georesourceNameFilter, showWFS) { + if (!showWFS) { + return 0; } - return this.getAvailableWfsDatasets(topic, georesourceNameFilter, showWFS).length; - }; - - this.getNumberOfIndicators = function(topic, indicatorNameFilter){ + }; + this.getNumberOfIndicators = function (topic, indicatorNameFilter) { var numberOfIndicators = 0; - var filteredIndicators = this.availableIndicators; - - if(indicatorNameFilter && indicatorNameFilter != ""){ - filteredIndicators = filterArrayObjectsByValue(this.availableIndicators, indicatorNameFilter); + if (indicatorNameFilter && indicatorNameFilter != "") { + filteredIndicators = filterArrayObjectsByValue(this.availableIndicators, indicatorNameFilter); } - filteredIndicators = filterByIndicatorNamesToHide(filteredIndicators); - for (const indicatorMetadata of filteredIndicators) { - if (this.topicHierarchyContainsIndicator(topic, indicatorMetadata)){ - numberOfIndicators++; - } + if (this.topicHierarchyContainsIndicator(topic, indicatorMetadata)) { + numberOfIndicators++; + } } - return numberOfIndicators; - }; - - var filterByIndicatorNamesToHide = function(filteredIndicators){ - - return filteredIndicators.filter(indicatorMetadata => { - return isDisplayableIndicator(indicatorMetadata); + }; + var filterByIndicatorNamesToHide = function (filteredIndicators) { + return filteredIndicators.filter(indicatorMetadata => { + return isDisplayableIndicator(indicatorMetadata); }); - }; - - var filterByGeoresourceNamesToHide = function(filteredGeoresources){ - - return filteredGeoresources.filter(georesourceMetadata => { - return self.isDisplayableGeoresource(georesourceMetadata); + }; + var filterByGeoresourceNamesToHide = function (filteredGeoresources) { + return filteredGeoresources.filter(georesourceMetadata => { + return self.isDisplayableGeoresource(georesourceMetadata); }); - }; - - var filterArrayObjectsByValue = function (array, string) { - return array.filter(o => { - return Object.keys(o).some(k => { - if (typeof o[k] === 'string') - return o[k].toLowerCase().includes(string.toLowerCase()); - }); - }); - }; - - this.getIndicatorMetadataById = function(indicatorId){ + }; + var filterArrayObjectsByValue = function (array, string) { + return array.filter(o => { + return Object.keys(o).some(k => { + if (typeof o[k] === 'string') + return o[k].toLowerCase().includes(string.toLowerCase()); + }); + }); + }; + this.getIndicatorMetadataById = function (indicatorId) { return this.availableIndicators_map.get(indicatorId); - }; - - this.getGeoresourceMetadataById = function(georesourceId){ + }; + this.getGeoresourceMetadataById = function (georesourceId) { return this.availableGeoresources_map.get(georesourceId); - }; - - this.getSpatialUnitMetadataById = function(spatialUnitId){ + }; + this.getSpatialUnitMetadataById = function (spatialUnitId) { return this.availableSpatialUnits_map.get(spatialUnitId); - }; - - this.getIndicatorAbbreviationFromIndicatorId = function(indicatorId){ + }; + this.getIndicatorAbbreviationFromIndicatorId = function (indicatorId) { for (var indicatorMetadata of this.availableIndicators) { - if (indicatorMetadata.indicatorId === indicatorId){ - return indicatorMetadata.abbreviation; - } + if (indicatorMetadata.indicatorId === indicatorId) { + return indicatorMetadata.abbreviation; + } } - }; - - this.getIndicatorNameFromIndicatorId = function(indicatorId){ + }; + this.getIndicatorNameFromIndicatorId = function (indicatorId) { for (var indicatorMetadata of this.availableIndicators) { - if (indicatorMetadata.indicatorId === indicatorId){ - return indicatorMetadata.indicatorName; - } + if (indicatorMetadata.indicatorId === indicatorId) { + return indicatorMetadata.indicatorName; + } } - }; - - this.getGeoresourceNameFromGeoresourceId = function(georesourceId){ + }; + this.getGeoresourceNameFromGeoresourceId = function (georesourceId) { for (var georesourceMetadata of this.availableGeoresources) { - if (georesourceMetadata.georesourceId === georesourceId){ - return georesourceMetadata.datasetName; - } + if (georesourceMetadata.georesourceId === georesourceId) { + return georesourceMetadata.datasetName; + } } - }; - - this.referencedTopicIdExists = function(topicId){ + }; + this.referencedTopicIdExists = function (topicId) { var topicHierarchy = this.getTopicHierarchyForTopicId(topicId); - - if(topicHierarchy.length === 0){ - return false; + if (topicHierarchy.length === 0) { + return false; } - else{ - return true; + else { + return true; } - }; - - this.getTopicHierarchyForTopicId = function(topicReferenceId){ + }; + this.getTopicHierarchyForTopicId = function (topicReferenceId) { // create an array respresenting the topic hierarchy // i.e. [mainTopic_firstTier, subTopic_secondTier, subTopic_thirdTier, ...] var topicHierarchyArray = []; - for (var i = 0; i < this.availableTopics.length; i++) { - - var mainTopicCandidate = this.availableTopics[i]; - - if(mainTopicCandidate.topicId === topicReferenceId){ - topicHierarchyArray.push(mainTopicCandidate); - break; - } - - else if(this.findIdInAnySubTopicHierarchy(topicReferenceId, mainTopicCandidate.subTopics)){ - topicHierarchyArray.push(mainTopicCandidate); - topicHierarchyArray = this.addSubTopicHierarchy(topicHierarchyArray, topicReferenceId, mainTopicCandidate.subTopics); - } + var mainTopicCandidate = this.availableTopics[i]; + if (mainTopicCandidate.topicId === topicReferenceId) { + topicHierarchyArray.push(mainTopicCandidate); + break; + } + else if (this.findIdInAnySubTopicHierarchy(topicReferenceId, mainTopicCandidate.subTopics)) { + topicHierarchyArray.push(mainTopicCandidate); + topicHierarchyArray = this.addSubTopicHierarchy(topicHierarchyArray, topicReferenceId, mainTopicCandidate.subTopics); + } } - return topicHierarchyArray; - }; - - this.findIdInAnySubTopicHierarchy = function(topicReferenceId, subTopicsArray){ + }; + this.findIdInAnySubTopicHierarchy = function (topicReferenceId, subTopicsArray) { for (let index = 0; index < subTopicsArray.length; index++) { - const subTopicCandidate = subTopicsArray[index]; - - if(subTopicCandidate.topicId === topicReferenceId){ - return true; - } - - else if(this.findIdInAnySubTopicHierarchy(topicReferenceId, subTopicCandidate.subTopics)){ - return true; - } + const subTopicCandidate = subTopicsArray[index]; + if (subTopicCandidate.topicId === topicReferenceId) { + return true; + } + else if (this.findIdInAnySubTopicHierarchy(topicReferenceId, subTopicCandidate.subTopics)) { + return true; + } } - return false; - }; - - this.addSubTopicHierarchy = function(topicHierarchyArray, topicReferenceId, subTopicsArray){ + }; + this.addSubTopicHierarchy = function (topicHierarchyArray, topicReferenceId, subTopicsArray) { for (let index = 0; index < subTopicsArray.length; index++) { - const subTopicCandidate = subTopicsArray[index]; - - if(subTopicCandidate.topicId === topicReferenceId){ - topicHierarchyArray.push(subTopicCandidate); - break; - } - - else if(this.findIdInAnySubTopicHierarchy(topicReferenceId, subTopicCandidate.subTopics)){ - topicHierarchyArray.push(subTopicCandidate); - topicHierarchyArray = this.addSubTopicHierarchy(topicHierarchyArray, topicReferenceId, subTopicCandidate.subTopics); - } + const subTopicCandidate = subTopicsArray[index]; + if (subTopicCandidate.topicId === topicReferenceId) { + topicHierarchyArray.push(subTopicCandidate); + break; + } + else if (this.findIdInAnySubTopicHierarchy(topicReferenceId, subTopicCandidate.subTopics)) { + topicHierarchyArray.push(subTopicCandidate); + topicHierarchyArray = this.addSubTopicHierarchy(topicHierarchyArray, topicReferenceId, subTopicCandidate.subTopics); + } } - return topicHierarchyArray; - }; - - this.syntaxHighlightJSON = function(json) { - if (typeof json != 'string') { - json = JSON.stringify(json, undefined, 2); - } - json = json.replace(/&/g, '&').replace(//g, '>'); - return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { - var cls = 'number'; - if (/^"/.test(match)) { - if (/:$/.test(match)) { - cls = 'key'; - } else { - cls = 'string'; - } - } else if (/true|false/.test(match)) { - cls = 'boolean'; - } else if (/null/.test(match)) { - cls = 'null'; - } - return '' + match + ''; - }); - }; - - - - this.extendKeycloakSession = function () { + }; + this.syntaxHighlightJSON = function (json) { + if (typeof json != 'string') { + json = JSON.stringify(json, undefined, 2); + } + json = json.replace(/&/g, '&').replace(//g, '>'); + return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { + var cls = 'number'; + if (/^"/.test(match)) { + if (/:$/.test(match)) { + cls = 'key'; + } + else { + cls = 'string'; + } + } + else if (/true|false/.test(match)) { + cls = 'boolean'; + } + else if (/null/.test(match)) { + cls = 'null'; + } + return '' + match + ''; + }); + }; + this.extendKeycloakSession = function () { // Auth.keycloak.updateToken(5).then(function () { // console.log("keycloak token refreshed."); // }).catch(function () { // console.error('Failed to refresh token. Will redirect to Login screen'); // Auth.keycloak.login(); // }); - Auth.keycloak.login(); - }; - - this.tryLogoutUser = function() { + }; + this.tryLogoutUser = function () { Auth.keycloak.logout(); - }; - - var startCheckSessionExpiration = function(){ + }; + var startCheckSessionExpiration = function () { $interval(function () { - // minutes until current browser session invalidates - // use refresh token as this is used when calling "updateToken" keycloak method. Only if that is invalid the whole session is invalid - self.keycloakTokenExpirationInfo = Math.round((Auth.keycloak.refreshTokenParsed.exp + Auth.keycloak.timeSkew - new Date().getTime() / 1000) / 60); - if(! self.keycloakTokenExpirationInfo){ - self.keycloakTokenExpirationInfo = 30; - } - - // if session is expired then show warning to User! - if (self.keycloakTokenExpirationInfo < 0){ - self.keycloakTokenExpirationInfo = 0; - self.displayMapApplicationError("Ihre aktuelle Login-Session ist abgelaufen. Sie müssen sich neu einloggen. Nutzen Sie dazu das User-Menü oben rechts."); - } - - }, 1000 * 60); - }; - - /* - * FETCH INITIAL METADATA ABOUT EACH RESOURCE - */ - - // $rootScope.$on("$locationChangeStart", function(event){ - // self.fetchAllMetadata(); - // self.adminIsLoggedIn = false; - // }); - - this.fetchAllMetadata = async function(){ + // minutes until current browser session invalidates + // use refresh token as this is used when calling "updateToken" keycloak method. Only if that is invalid the whole session is invalid + self.keycloakTokenExpirationInfo = Math.round((Auth.keycloak.refreshTokenParsed.exp + Auth.keycloak.timeSkew - new Date().getTime() / 1000) / 60); + if (!self.keycloakTokenExpirationInfo) { + self.keycloakTokenExpirationInfo = 30; + } + // if session is expired then show warning to User! + if (self.keycloakTokenExpirationInfo < 0) { + self.keycloakTokenExpirationInfo = 0; + self.displayMapApplicationError("Ihre aktuelle Login-Session ist abgelaufen. Sie müssen sich neu einloggen. Nutzen Sie dazu das User-Menü oben rechts."); + } + }, 1000 * 60); + }; + /* + * FETCH INITIAL METADATA ABOUT EACH RESOURCE + */ + // $rootScope.$on("$locationChangeStart", function(event){ + // self.fetchAllMetadata(); + // self.adminIsLoggedIn = false; + // }); + this.fetchAllMetadata = async function () { console.log("fetching all metadata from management component"); - // var metadataPromises = [topicsPromise, usersPromise, rolesPromise, spatialUnitsPromise, georesourcesPromise, indicatorsPromise, scriptsPromise]; var metadataPromises = []; - - if (Auth.keycloak.authenticated){ - await Auth.keycloak.loadUserProfile() - .then(function (profile) { - // set user profile - self.currentKeycloakUser = profile; - console.log("User logged in with email: " + profile.email); - - if(Auth.keycloak.tokenParsed && Auth.keycloak.tokenParsed.realm_access && Auth.keycloak.tokenParsed.realm_access.roles){ - self.currentKeycloakLoginRoles = Auth.keycloak.tokenParsed.realm_access.roles; - if (Auth.keycloak.tokenParsed.resource_access["realm-management"]) { - self.isRealmAdmin = true; - self.currentKeycloakLoginRoles = self.currentKeycloakLoginRoles.concat(Auth.keycloak.tokenParsed.resource_access["realm-management"].roles); - } - } else { - self.currentKeycloakLoginRoles = []; - } - - // set token expiration - startCheckSessionExpiration(); + if (Auth.keycloak.authenticated) { + await Auth.keycloak.loadUserProfile() + .then(function (profile) { + // set user profile + self.currentKeycloakUser = profile; + console.log("User logged in with email: " + profile.email); + if (Auth.keycloak.tokenParsed && Auth.keycloak.tokenParsed.realm_access && Auth.keycloak.tokenParsed.realm_access.roles) { + self.currentKeycloakLoginRoles = Auth.keycloak.tokenParsed.realm_access.roles; + if (Auth.keycloak.tokenParsed.resource_access["realm-management"]) { + self.isRealmAdmin = true; + self.currentKeycloakLoginRoles = self.currentKeycloakLoginRoles.concat(Auth.keycloak.tokenParsed.resource_access["realm-management"].roles); + } + } + else { + self.currentKeycloakLoginRoles = []; + } + // set token expiration + startCheckSessionExpiration(); }) - .catch(function () { - console.log('Failed to load user profile'); - }); - var promise = await this.fetchAccessControlMetadata(self.currentKeycloakLoginRoles); - metadataPromises.push(promise); + .catch(function () { + console.log('Failed to load user profile'); + }); + var promise = await this.fetchAccessControlMetadata(self.currentKeycloakLoginRoles); + metadataPromises.push(promise); } - //TODO revise metadata fecthing for protected endpoints var scriptsPromise = await this.fetchIndicatorScriptsMetadata(self.currentKeycloakLoginRoles); var topicsPromise = await this.fetchTopicsMetadata(self.currentKeycloakLoginRoles); @@ -1093,122 +882,97 @@ angular metadataPromises.push(spatialUnitsPromise); metadataPromises.push(georesourcesPromise); metadataPromises.push(indicatorsPromise); - $q.all(metadataPromises).then(function successCallback(successArray) { - - self.modifyIndicatorApplicableSpatialUnitsForLoginRoles(); - - self.buildHeadlineIndicatorHierarchy(); - self.buildTopicIndicatorHierarchy(); - self.topicIndicatorHierarchy_forOrderView = JSON.parse(JSON.stringify(self.topicIndicatorHierarchy)); - self.buildComputationIndicatorHierarchy(); - - self.buildTopicGeoresourceHierarchy(); - - console.log("Metadata fetched. Call initialize event."); - onMetadataLoadingCompleted(); - - $timeout(function(){ - $('.list-group-item > .collapseTrigger').on('click', function() { - $('.glyphicon', this) - .toggleClass('glyphicon-chevron-right') - .toggleClass('glyphicon-chevron-down'); - + self.modifyIndicatorApplicableSpatialUnitsForLoginRoles(); + self.buildHeadlineIndicatorHierarchy(); + self.buildTopicIndicatorHierarchy(); + self.topicIndicatorHierarchy_forOrderView = JSON.parse(JSON.stringify(self.topicIndicatorHierarchy)); + self.buildComputationIndicatorHierarchy(); + self.buildTopicGeoresourceHierarchy(); + console.log("Metadata fetched. Call initialize event."); + onMetadataLoadingCompleted(); + $timeout(function () { + $('.list-group-item > .collapseTrigger').on('click', function () { + $('.glyphicon', this) + .toggleClass('glyphicon-chevron-right') + .toggleClass('glyphicon-chevron-down'); }); - }); - }, function errorCallback(errorArray) { + }); + }, function errorCallback(errorArray) { // todo error handling self.displayMapApplicationError("Beim Laden der erforderlichen Anwendungsdaten ist ein Fehler aufgetreten. Bitte wenden Sie sich an Ihren Administrator."); $rootScope.$broadcast("initialMetadataLoadingFailed", errorArray); - }); - - }; - - this.modifyIndicatorApplicableSpatialUnitsForLoginRoles = function(){ + }); + }; + this.modifyIndicatorApplicableSpatialUnitsForLoginRoles = function () { var availableSpatialUnitNames = []; for (const spatialUnit of this.availableSpatialUnits) { - availableSpatialUnitNames.push(spatialUnit.spatialUnitLevel); + availableSpatialUnitNames.push(spatialUnit.spatialUnitLevel); } for (const indicator of this.availableIndicators) { - indicator.applicableSpatialUnits = indicator.applicableSpatialUnits.filter(applicableSpatialUnit => availableSpatialUnitNames.includes(applicableSpatialUnit.spatialUnitName)); + indicator.applicableSpatialUnits = indicator.applicableSpatialUnits.filter(applicableSpatialUnit => availableSpatialUnitNames.includes(applicableSpatialUnit.spatialUnitName)); } - this.displayableIndicators = this.availableIndicators.filter(item => isDisplayableIndicator(item)); this.displayableIndicators_keywordFiltered = JSON.parse(JSON.stringify(this.displayableIndicators)); - }; - - this.buildTopicsMap_indicators = function(indicatorTopics){ - var topicsMap = new Map(); - + }; + this.buildTopicsMap_indicators = function (indicatorTopics) { + var topicsMap = new Map(); for (const topic of indicatorTopics) { - topicsMap.set(topic.topicId, []); - if(topic.subTopics.length > 0){ - topicsMap = this.addSubTopicsToMap_indicators(topic.subTopics, topicsMap); - } + topicsMap.set(topic.topicId, []); + if (topic.subTopics.length > 0) { + topicsMap = this.addSubTopicsToMap_indicators(topic.subTopics, topicsMap); + } } - return topicsMap; - }; - - this.buildTopicsMap_georesources = function(georesourceTopics){ - var topicsMap = new Map(); - + }; + this.buildTopicsMap_georesources = function (georesourceTopics) { + var topicsMap = new Map(); for (const topic of georesourceTopics) { - topicsMap.set(topic.topicId, { + topicsMap.set(topic.topicId, { + poiDatasets: [], + loiDatasets: [], + aoiDatasets: [], + wmsDatasets: [], + wfsDatasets: [] + }); + if (topic.subTopics.length > 0) { + topicsMap = this.addSubTopicsToMap_georesources(topic.subTopics, topicsMap); + } + } + topicsMap.set(this.georesourceMapKey_forUnmappedTopicReferences, { poiDatasets: [], loiDatasets: [], aoiDatasets: [], wmsDatasets: [], wfsDatasets: [] - }); - if(topic.subTopics.length > 0){ - topicsMap = this.addSubTopicsToMap_georesources(topic.subTopics, topicsMap); - } - } - - topicsMap.set(this.georesourceMapKey_forUnmappedTopicReferences, { - poiDatasets: [], - loiDatasets: [], - aoiDatasets: [], - wmsDatasets: [], - wfsDatasets: [] }); - return topicsMap; - }; - - this.addSubTopicsToMap_indicators = function(subTopicsArray, topicsMap){ - + }; + this.addSubTopicsToMap_indicators = function (subTopicsArray, topicsMap) { for (const subTopic of subTopicsArray) { - topicsMap.set(subTopic.topicId, []); - if(subTopic.subTopics.length > 0){ - topicsMap = this.addSubTopicsToMap_indicators(subTopic.subTopics, topicsMap); - } - } - + topicsMap.set(subTopic.topicId, []); + if (subTopic.subTopics.length > 0) { + topicsMap = this.addSubTopicsToMap_indicators(subTopic.subTopics, topicsMap); + } + } return topicsMap; - }; - - this.addSubTopicsToMap_georesources = function(subTopicsArray, topicsMap){ - + }; + this.addSubTopicsToMap_georesources = function (subTopicsArray, topicsMap) { for (const subTopic of subTopicsArray) { - topicsMap.set(subTopic.topicId, { - poiDatasets: [], - loiDatasets: [], - aoiDatasets: [], - wmsDatasets: [], - wfsDatasets: [] - }); - if(subTopic.subTopics.length > 0){ - topicsMap = this.addSubTopicsToMap_georesources(subTopic.subTopics, topicsMap); - } - } - + topicsMap.set(subTopic.topicId, { + poiDatasets: [], + loiDatasets: [], + aoiDatasets: [], + wmsDatasets: [], + wfsDatasets: [] + }); + if (subTopic.subTopics.length > 0) { + topicsMap = this.addSubTopicsToMap_georesources(subTopic.subTopics, topicsMap); + } + } return topicsMap; - }; - - this.buildTopicGeoresourceHierarchy = function(){ - + }; + this.buildTopicGeoresourceHierarchy = function () { var georesourceTopics = JSON.parse(JSON.stringify(this.availableTopics)).filter(topic => topic.topicResource === "georesource"); /* topicsMap.set(topic.topicId, { @@ -1222,128 +986,101 @@ angular + special entry with key "unmapped" for all datasets without valid topic reference */ var topicsMap = this.buildTopicsMap_georesources(georesourceTopics); - - // PROCESS GEORESOURCES var filteredGeoresources = this.displayableGeoresources_keywordFiltered; - for (const georesourceMetadata of filteredGeoresources) { - if (topicsMap.has(georesourceMetadata.topicReference)){ - var georesourceDatasets = topicsMap.get(georesourceMetadata.topicReference); - - if(georesourceMetadata.isPOI){ - georesourceDatasets.poiDatasets.push(georesourceMetadata); - } - if(georesourceMetadata.isLOI){ - georesourceDatasets.loiDatasets.push(georesourceMetadata); - } - if(georesourceMetadata.isAOI){ - georesourceDatasets.aoiDatasets.push(georesourceMetadata); - } - - topicsMap.set(georesourceMetadata.topicReference, georesourceDatasets); - } - else{ - var georesourceDatasets_unmapped = topicsMap.get(this.georesourceMapKey_forUnmappedTopicReferences); - - if(georesourceMetadata.isPOI){ - georesourceDatasets_unmapped.poiDatasets.push(georesourceMetadata); - } - if(georesourceMetadata.isLOI){ - georesourceDatasets_unmapped.loiDatasets.push(georesourceMetadata); - } - if(georesourceMetadata.isAOI){ - georesourceDatasets_unmapped.aoiDatasets.push(georesourceMetadata); - } - - topicsMap.set(this.georesourceMapKey_forUnmappedTopicReferences, georesourceDatasets_unmapped); - } + if (topicsMap.has(georesourceMetadata.topicReference)) { + var georesourceDatasets = topicsMap.get(georesourceMetadata.topicReference); + if (georesourceMetadata.isPOI) { + georesourceDatasets.poiDatasets.push(georesourceMetadata); + } + if (georesourceMetadata.isLOI) { + georesourceDatasets.loiDatasets.push(georesourceMetadata); + } + if (georesourceMetadata.isAOI) { + georesourceDatasets.aoiDatasets.push(georesourceMetadata); + } + topicsMap.set(georesourceMetadata.topicReference, georesourceDatasets); + } + else { + var georesourceDatasets_unmapped = topicsMap.get(this.georesourceMapKey_forUnmappedTopicReferences); + if (georesourceMetadata.isPOI) { + georesourceDatasets_unmapped.poiDatasets.push(georesourceMetadata); + } + if (georesourceMetadata.isLOI) { + georesourceDatasets_unmapped.loiDatasets.push(georesourceMetadata); + } + if (georesourceMetadata.isAOI) { + georesourceDatasets_unmapped.aoiDatasets.push(georesourceMetadata); + } + topicsMap.set(this.georesourceMapKey_forUnmappedTopicReferences, georesourceDatasets_unmapped); + } } - // PROCESS WMS and WFS for (const wmsMetadata of this.wmsDatasets_keywordFiltered) { - if (topicsMap.has(wmsMetadata.topicReference)){ - var georesourceDatasets = topicsMap.get(wmsMetadata.topicReference); - georesourceDatasets.wmsDatasets.push(wmsMetadata); - - topicsMap.set(wmsMetadata.topicReference, georesourceDatasets); - } - else{ - var georesourceDatasets_unmapped = topicsMap.get(this.georesourceMapKey_forUnmappedTopicReferences); - - georesourceDatasets_unmapped.wmsDatasets.push(wmsMetadata); - - topicsMap.set(this.georesourceMapKey_forUnmappedTopicReferences, georesourceDatasets_unmapped); - } + if (topicsMap.has(wmsMetadata.topicReference)) { + var georesourceDatasets = topicsMap.get(wmsMetadata.topicReference); + georesourceDatasets.wmsDatasets.push(wmsMetadata); + topicsMap.set(wmsMetadata.topicReference, georesourceDatasets); + } + else { + var georesourceDatasets_unmapped = topicsMap.get(this.georesourceMapKey_forUnmappedTopicReferences); + georesourceDatasets_unmapped.wmsDatasets.push(wmsMetadata); + topicsMap.set(this.georesourceMapKey_forUnmappedTopicReferences, georesourceDatasets_unmapped); + } } - // PROCESS WMS and WFS for (const wfsMetadata of this.wfsDatasets_keywordFiltered) { - if (topicsMap.has(wfsMetadata.topicReference)){ - var georesourceDatasets = topicsMap.get(wfsMetadata.topicReference); - georesourceDatasets.wfsDatasets.push(wfsMetadata); - - topicsMap.set(wfsMetadata.topicReference, georesourceDatasets); - } - else{ - var georesourceDatasets_unmapped = topicsMap.get(this.georesourceMapKey_forUnmappedTopicReferences); - - georesourceDatasets_unmapped.wfsDatasets.push(wfsMetadata); - - topicsMap.set(this.georesourceMapKey_forUnmappedTopicReferences, georesourceDatasets_unmapped); - } + if (topicsMap.has(wfsMetadata.topicReference)) { + var georesourceDatasets = topicsMap.get(wfsMetadata.topicReference); + georesourceDatasets.wfsDatasets.push(wfsMetadata); + topicsMap.set(wfsMetadata.topicReference, georesourceDatasets); + } + else { + var georesourceDatasets_unmapped = topicsMap.get(this.georesourceMapKey_forUnmappedTopicReferences); + georesourceDatasets_unmapped.wfsDatasets.push(wfsMetadata); + topicsMap.set(this.georesourceMapKey_forUnmappedTopicReferences, georesourceDatasets_unmapped); + } } - this.topicGeoresourceHierarchy = this.addGeoresourceDataToTopicHierarchy(georesourceTopics, topicsMap); - }; - - this.buildTopicIndicatorHierarchy = function(){ - + }; + this.buildTopicIndicatorHierarchy = function () { var indicatorTopics = JSON.parse(JSON.stringify(this.availableTopics)).filter(topic => topic.topicResource === "indicator"); var topicsMap = this.buildTopicsMap_indicators(indicatorTopics); - var filteredIndicators = this.displayableIndicators_keywordFiltered; - for (const indicatorMetadata of filteredIndicators) { - if (topicsMap.has(indicatorMetadata.topicReference)){ - var indicatorArray = topicsMap.get(indicatorMetadata.topicReference); - indicatorArray.push(indicatorMetadata); - topicsMap.set(indicatorMetadata.topicReference, indicatorArray); - } + if (topicsMap.has(indicatorMetadata.topicReference)) { + var indicatorArray = topicsMap.get(indicatorMetadata.topicReference); + indicatorArray.push(indicatorMetadata); + topicsMap.set(indicatorMetadata.topicReference, indicatorArray); + } } - this.topicIndicatorHierarchy = this.addIndicatorDataToTopicHierarchy(indicatorTopics, topicsMap); - }; - - this.addIndicatorDataToTopicHierarchy = function(topicsArray, topicsMap){ + }; + this.addIndicatorDataToTopicHierarchy = function (topicsArray, topicsMap) { for (var topic of topicsArray) { - topic.indicatorData = topicsMap.get(topic.topicId); - topic.indicatorData.sort((a,b) => (a.displayOrder > b.displayOrder) ? 1 : ((b.displayOrder > a.displayOrder) ? -1 : 0)); - topic.indicatorCount = topic.indicatorData.length; - if(topic.subTopics.length > 0){ - topic = this.addIndicatorDataToSubTopics(topic, topicsMap); - } + topic.indicatorData = topicsMap.get(topic.topicId); + topic.indicatorData.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : ((b.displayOrder > a.displayOrder) ? -1 : 0)); + topic.indicatorCount = topic.indicatorData.length; + if (topic.subTopics.length > 0) { + topic = this.addIndicatorDataToSubTopics(topic, topicsMap); + } } - return topicsArray; - }; - - this.addIndicatorDataToSubTopics = function(topic, topicsMap){ + }; + this.addIndicatorDataToSubTopics = function (topic, topicsMap) { for (var subTopic of topic.subTopics) { - subTopic.indicatorData = topicsMap.get(subTopic.topicId); - subTopic.indicatorData.sort((a,b) => (a.displayOrder > b.displayOrder) ? 1 : ((b.displayOrder > a.displayOrder) ? -1 : 0)); - subTopic.indicatorCount = subTopic.indicatorData.length; - if(subTopic.subTopics.length > 0){ - subTopic = this.addIndicatorDataToSubTopics(subTopic, topicsMap); - } - topic.indicatorCount = topic.indicatorCount + subTopic.indicatorCount; + subTopic.indicatorData = topicsMap.get(subTopic.topicId); + subTopic.indicatorData.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : ((b.displayOrder > a.displayOrder) ? -1 : 0)); + subTopic.indicatorCount = subTopic.indicatorData.length; + if (subTopic.subTopics.length > 0) { + subTopic = this.addIndicatorDataToSubTopics(subTopic, topicsMap); + } + topic.indicatorCount = topic.indicatorCount + subTopic.indicatorCount; } - return topic; - }; - - this.addGeoresourceDataToTopicHierarchy = function(topicsArray, topicsMap){ - + }; + this.addGeoresourceDataToTopicHierarchy = function (topicsArray, topicsMap) { /* topicsMap.set(topic.topicId, { poiDatasets: [], @@ -1355,916 +1092,725 @@ angular + special entry with key "unmapped" for all datasets without valid topic reference */ - for (var topic of topicsArray) { - var topicsDataEntry = topicsMap.get(topic.topicId); - topic.poiData = topicsDataEntry.poiDatasets; - topic.poiCount = topicsDataEntry.poiDatasets.length; - - topic.loiData = topicsDataEntry.loiDatasets; - topic.loiCount = topicsDataEntry.loiDatasets.length; - - topic.aoiData = topicsDataEntry.aoiDatasets; - topic.aoiCount = topicsDataEntry.aoiDatasets.length; - - topic.wmsData = topicsDataEntry.wmsDatasets; - topic.wmsCount = topicsDataEntry.wmsDatasets.length; - - topic.wfsData = topicsDataEntry.wfsDatasets; - topic.wfsCount = topicsDataEntry.wfsDatasets.length; - - topic.totalCount = topic.poiCount + topic.loiCount + topic.aoiCount + topic.wmsCount + topic.wfsCount; - topic.ownCount = topic.poiCount + topic.loiCount + topic.aoiCount + topic.wmsCount + topic.wfsCount; - - if(topic.subTopics.length > 0){ - topic = this.addGeoresourceDataToSubTopics(topic, topicsMap); - } + var topicsDataEntry = topicsMap.get(topic.topicId); + topic.poiData = topicsDataEntry.poiDatasets; + topic.poiCount = topicsDataEntry.poiDatasets.length; + topic.loiData = topicsDataEntry.loiDatasets; + topic.loiCount = topicsDataEntry.loiDatasets.length; + topic.aoiData = topicsDataEntry.aoiDatasets; + topic.aoiCount = topicsDataEntry.aoiDatasets.length; + topic.wmsData = topicsDataEntry.wmsDatasets; + topic.wmsCount = topicsDataEntry.wmsDatasets.length; + topic.wfsData = topicsDataEntry.wfsDatasets; + topic.wfsCount = topicsDataEntry.wfsDatasets.length; + topic.totalCount = topic.poiCount + topic.loiCount + topic.aoiCount + topic.wmsCount + topic.wfsCount; + topic.ownCount = topic.poiCount + topic.loiCount + topic.aoiCount + topic.wmsCount + topic.wfsCount; + if (topic.subTopics.length > 0) { + topic = this.addGeoresourceDataToSubTopics(topic, topicsMap); + } } - // PROCESS UNMAPPED entries this.topicGeoresourceHierarchy_unmappedEntries = {}; var topicsDataEntry_unmapped = topicsMap.get(this.georesourceMapKey_forUnmappedTopicReferences); this.topicGeoresourceHierarchy_unmappedEntries.poiData = topicsDataEntry_unmapped.poiDatasets; this.topicGeoresourceHierarchy_unmappedEntries.poiCount = topicsDataEntry_unmapped.poiDatasets.length; - this.topicGeoresourceHierarchy_unmappedEntries.loiData = topicsDataEntry_unmapped.loiDatasets; this.topicGeoresourceHierarchy_unmappedEntries.loiCount = topicsDataEntry_unmapped.loiDatasets.length; - this.topicGeoresourceHierarchy_unmappedEntries.aoiData = topicsDataEntry_unmapped.aoiDatasets; this.topicGeoresourceHierarchy_unmappedEntries.aoiCount = topicsDataEntry_unmapped.aoiDatasets.length; - this.topicGeoresourceHierarchy_unmappedEntries.wmsData = topicsDataEntry_unmapped.wmsDatasets; this.topicGeoresourceHierarchy_unmappedEntries.wmsCount = topicsDataEntry_unmapped.wmsDatasets.length; - this.topicGeoresourceHierarchy_unmappedEntries.wfsData = topicsDataEntry_unmapped.wfsDatasets; this.topicGeoresourceHierarchy_unmappedEntries.wfsCount = topicsDataEntry_unmapped.wfsDatasets.length; - - this.topicGeoresourceHierarchy_unmappedEntries.totalCount = this.topicGeoresourceHierarchy_unmappedEntries.poiCount + - this.topicGeoresourceHierarchy_unmappedEntries.loiCount + - this.topicGeoresourceHierarchy_unmappedEntries.aoiCount + - this.topicGeoresourceHierarchy_unmappedEntries.wmsCount + - this.topicGeoresourceHierarchy_unmappedEntries.wfsCount; - + this.topicGeoresourceHierarchy_unmappedEntries.totalCount = this.topicGeoresourceHierarchy_unmappedEntries.poiCount + + this.topicGeoresourceHierarchy_unmappedEntries.loiCount + + this.topicGeoresourceHierarchy_unmappedEntries.aoiCount + + this.topicGeoresourceHierarchy_unmappedEntries.wmsCount + + this.topicGeoresourceHierarchy_unmappedEntries.wfsCount; return topicsArray; - }; - - this.addGeoresourceDataToSubTopics = function(topic, topicsMap){ - for (var subTopic of topic.subTopics) { - - var topicsDataEntry = topicsMap.get(subTopic.topicId); - subTopic.poiData = topicsDataEntry.poiDatasets; - subTopic.poiCount = topicsDataEntry.poiDatasets.length; - - subTopic.loiData = topicsDataEntry.loiDatasets; - subTopic.loiCount = topicsDataEntry.loiDatasets.length; - - subTopic.aoiData = topicsDataEntry.aoiDatasets; - subTopic.aoiCount = topicsDataEntry.aoiDatasets.length; - - subTopic.wmsData = topicsDataEntry.wmsDatasets; - subTopic.wmsCount = topicsDataEntry.wmsDatasets.length; - - subTopic.wfsData = topicsDataEntry.wfsDatasets; - subTopic.wfsCount = topicsDataEntry.wfsDatasets.length; - - subTopic.totalCount = subTopic.poiCount + subTopic.loiCount + subTopic.aoiCount + subTopic.wmsCount + subTopic.wfsCount; - subTopic.ownCount = subTopic.poiCount + subTopic.loiCount + subTopic.aoiCount + subTopic.wmsCount + subTopic.wfsCount; - - if(subTopic.subTopics.length > 0){ - subTopic = this.addGeoresourceDataToSubTopics(subTopic, topicsMap); - } - topic.poiCount = topic.poiCount + subTopic.poiCount; - topic.loiCount = topic.loiCount + subTopic.loiCount; - topic.aoiCount = topic.aoiCount + subTopic.aoiCount; - topic.wmsCount = topic.wmsCount + subTopic.wmsCount; - topic.wfsCount = topic.wfsCount + subTopic.wfsCount; - topic.totalCount = topic.totalCount + subTopic.totalCount; + }; + this.addGeoresourceDataToSubTopics = function (topic, topicsMap) { + for (var subTopic of topic.subTopics) { + var topicsDataEntry = topicsMap.get(subTopic.topicId); + subTopic.poiData = topicsDataEntry.poiDatasets; + subTopic.poiCount = topicsDataEntry.poiDatasets.length; + subTopic.loiData = topicsDataEntry.loiDatasets; + subTopic.loiCount = topicsDataEntry.loiDatasets.length; + subTopic.aoiData = topicsDataEntry.aoiDatasets; + subTopic.aoiCount = topicsDataEntry.aoiDatasets.length; + subTopic.wmsData = topicsDataEntry.wmsDatasets; + subTopic.wmsCount = topicsDataEntry.wmsDatasets.length; + subTopic.wfsData = topicsDataEntry.wfsDatasets; + subTopic.wfsCount = topicsDataEntry.wfsDatasets.length; + subTopic.totalCount = subTopic.poiCount + subTopic.loiCount + subTopic.aoiCount + subTopic.wmsCount + subTopic.wfsCount; + subTopic.ownCount = subTopic.poiCount + subTopic.loiCount + subTopic.aoiCount + subTopic.wmsCount + subTopic.wfsCount; + if (subTopic.subTopics.length > 0) { + subTopic = this.addGeoresourceDataToSubTopics(subTopic, topicsMap); + } + topic.poiCount = topic.poiCount + subTopic.poiCount; + topic.loiCount = topic.loiCount + subTopic.loiCount; + topic.aoiCount = topic.aoiCount + subTopic.aoiCount; + topic.wmsCount = topic.wmsCount + subTopic.wmsCount; + topic.wfsCount = topic.wfsCount + subTopic.wfsCount; + topic.totalCount = topic.totalCount + subTopic.totalCount; } - return topic; - }; - - this.onChangeIndicatorKeywordFilter = function(indicatorNameFilter){ + }; + this.onChangeIndicatorKeywordFilter = function (indicatorNameFilter) { this.displayableIndicators_keywordFiltered = JSON.parse(JSON.stringify(this.displayableIndicators)); - - if(indicatorNameFilter && indicatorNameFilter != ""){ - this.displayableIndicators_keywordFiltered = filterArrayObjectsByValue(this.displayableIndicators_keywordFiltered, indicatorNameFilter); + if (indicatorNameFilter && indicatorNameFilter != "") { + this.displayableIndicators_keywordFiltered = filterArrayObjectsByValue(this.displayableIndicators_keywordFiltered, indicatorNameFilter); } - this.buildTopicIndicatorHierarchy(); this.buildHeadlineIndicatorHierarchy(); - this.buildComputationIndicatorHierarchy(); - }; - - this.onChangeGeoresourceKeywordFilter = function(georesourceNameFilter, showPOI, showLOI, showAOI, showWMS, showWFS){ + this.buildComputationIndicatorHierarchy(); + }; + this.onChangeGeoresourceKeywordFilter = function (georesourceNameFilter, showPOI, showLOI, showAOI, showWMS, showWFS) { this.wmsDatasets_keywordFiltered = JSON.parse(JSON.stringify(this.wmsDatasets)); this.wfsDatasets_keywordFiltered = JSON.parse(JSON.stringify(this.wfsDatasets)); - this.displayableGeoresources_keywordFiltered = JSON.parse(JSON.stringify(this.displayableGeoresources)); - - if(georesourceNameFilter && georesourceNameFilter != ""){ - this.displayableGeoresources_keywordFiltered = filterArrayObjectsByValue(this.displayableGeoresources_keywordFiltered, georesourceNameFilter); - - this.wmsDatasets_keywordFiltered = filterArrayObjectsByValue(this.wmsDatasets_keywordFiltered, georesourceNameFilter); - this.wfsDatasets_keywordFiltered = filterArrayObjectsByValue(this.wfsDatasets_keywordFiltered, georesourceNameFilter); + if (georesourceNameFilter && georesourceNameFilter != "") { + this.displayableGeoresources_keywordFiltered = filterArrayObjectsByValue(this.displayableGeoresources_keywordFiltered, georesourceNameFilter); + this.wmsDatasets_keywordFiltered = filterArrayObjectsByValue(this.wmsDatasets_keywordFiltered, georesourceNameFilter); + this.wfsDatasets_keywordFiltered = filterArrayObjectsByValue(this.wfsDatasets_keywordFiltered, georesourceNameFilter); } - this.displayableGeoresources_keywordFiltered_forAlphabeticalDisplay = { - poiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isPOI), - loiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isLOI), - aoiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isAOI), - wmsData: this.wmsDatasets_keywordFiltered, - wfsData: this.wfsDatasets_keywordFiltered + poiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isPOI), + loiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isLOI), + aoiData: this.displayableGeoresources_keywordFiltered.filter(item => item.isAOI), + wmsData: this.wmsDatasets_keywordFiltered, + wfsData: this.wfsDatasets_keywordFiltered }; - - if(!showWMS){ - this.wmsDatasets_keywordFiltered = []; - } - if(!showWFS){ - this.wfsDatasets_keywordFiltered = []; - } - - if(! (showPOI && showLOI && showAOI)){ - this.displayableGeoresources_keywordFiltered = this.displayableGeoresources_keywordFiltered.filter(item => { - if (! showPOI && item.isPOI){ - return false; - } - if (! showLOI && item.isLOI){ - return false; - } - - if (! showAOI && item.isAOI){ - return false; - } - - return true; - }); + if (!showWMS) { + this.wmsDatasets_keywordFiltered = []; + } + if (!showWFS) { + this.wfsDatasets_keywordFiltered = []; + } + if (!(showPOI && showLOI && showAOI)) { + this.displayableGeoresources_keywordFiltered = this.displayableGeoresources_keywordFiltered.filter(item => { + if (!showPOI && item.isPOI) { + return false; + } + if (!showLOI && item.isLOI) { + return false; + } + if (!showAOI && item.isAOI) { + return false; + } + return true; + }); } - - this.buildTopicGeoresourceHierarchy(); - }; - - this.buildHeadlineIndicatorHierarchy = function(){ - + this.buildTopicGeoresourceHierarchy(); + }; + this.buildHeadlineIndicatorHierarchy = function () { var indicatorsMap = new Map(); - var filteredIndicators = this.displayableIndicators_keywordFiltered; - for (const indicatorMetadata of filteredIndicators) { - indicatorsMap.set(indicatorMetadata.indicatorId, indicatorMetadata); + indicatorsMap.set(indicatorMetadata.indicatorId, indicatorMetadata); } - var headlineIndicatorsArray = filteredIndicators.filter(indicatorMetadata => indicatorMetadata.isHeadlineIndicator == true); - var headlineIndicatorsIdArray = headlineIndicatorsArray.map(indicatorMetadata => indicatorMetadata.indicatorId); - var headlineIndicatorsMap = new Map(); - for (const indicatorMetadata of headlineIndicatorsArray) { - headlineIndicatorsMap.set(indicatorMetadata.indicatorId, indicatorMetadata); + headlineIndicatorsMap.set(indicatorMetadata.indicatorId, indicatorMetadata); } - var headlineIndicatorScriptsMap = new Map(); for (const scriptMetadata of this.availableProcessScripts) { - if(headlineIndicatorsIdArray.includes(scriptMetadata.indicatorId)){ - headlineIndicatorScriptsMap.set(scriptMetadata.indicatorId, scriptMetadata); - } + if (headlineIndicatorsIdArray.includes(scriptMetadata.indicatorId)) { + headlineIndicatorScriptsMap.set(scriptMetadata.indicatorId, scriptMetadata); + } } - this.headlineIndicatorHierarchy = []; - // var item = { // headlineIndicator: {metadata} // baseIndicators: [{metadata}] // maybeSomeAnalysisItems? // } - for (const headlineIndicatorMetadata of headlineIndicatorsArray) { - var item = {}; - item.headlineIndicator = headlineIndicatorMetadata; - item.baseIndicators = []; - - if(headlineIndicatorScriptsMap.has(headlineIndicatorMetadata.indicatorId)){ - var targetScriptMetadata = headlineIndicatorScriptsMap.get(headlineIndicatorMetadata.indicatorId); - for (const requiredIndicatorId of targetScriptMetadata.requiredIndicatorIds) { - if (indicatorsMap.has(requiredIndicatorId)){ - item.baseIndicators.push(indicatorsMap.get(requiredIndicatorId)); - } - } - } - - this.headlineIndicatorHierarchy.push(item); - } - - }; - - this.buildComputationIndicatorHierarchy = function(){ - + var item = {}; + item.headlineIndicator = headlineIndicatorMetadata; + item.baseIndicators = []; + if (headlineIndicatorScriptsMap.has(headlineIndicatorMetadata.indicatorId)) { + var targetScriptMetadata = headlineIndicatorScriptsMap.get(headlineIndicatorMetadata.indicatorId); + for (const requiredIndicatorId of targetScriptMetadata.requiredIndicatorIds) { + if (indicatorsMap.has(requiredIndicatorId)) { + item.baseIndicators.push(indicatorsMap.get(requiredIndicatorId)); + } + } + } + this.headlineIndicatorHierarchy.push(item); + } + }; + this.buildComputationIndicatorHierarchy = function () { var indicatorsMap = new Map(); - var filteredIndicators = this.displayableIndicators_keywordFiltered; - for (const indicatorMetadata of filteredIndicators) { - indicatorsMap.set(indicatorMetadata.indicatorId, indicatorMetadata); + indicatorsMap.set(indicatorMetadata.indicatorId, indicatorMetadata); } - var computationIndicatorsArray = filteredIndicators.filter(indicatorMetadata => indicatorMetadata.creationType == "COMPUTATION"); - var computationIndicatorsIdArray = computationIndicatorsArray.map(indicatorMetadata => indicatorMetadata.indicatorId); - var computationIndicatorsMap = new Map(); - for (const indicatorMetadata of computationIndicatorsArray) { - computationIndicatorsMap.set(indicatorMetadata.indicatorId, indicatorMetadata); + computationIndicatorsMap.set(indicatorMetadata.indicatorId, indicatorMetadata); } - var computationIndicatorScriptsMap = new Map(); for (const scriptMetadata of this.availableProcessScripts) { - if(computationIndicatorsIdArray.includes(scriptMetadata.indicatorId)){ - computationIndicatorScriptsMap.set(scriptMetadata.indicatorId, scriptMetadata); - } + if (computationIndicatorsIdArray.includes(scriptMetadata.indicatorId)) { + computationIndicatorScriptsMap.set(scriptMetadata.indicatorId, scriptMetadata); + } } - this.computationIndicatorHierarchy = []; - // var item = { // computationIndicator: {metadata} // baseIndicators: [{metadata}] // maybeSomeAnalysisItems? // } - for (const computationIndicatorMetadata of computationIndicatorsArray) { - var item = {}; - item.computationIndicator = computationIndicatorMetadata; - item.baseIndicators = []; - - if(computationIndicatorScriptsMap.has(computationIndicatorMetadata.indicatorId)){ - var targetScriptMetadata = computationIndicatorScriptsMap.get(computationIndicatorMetadata.indicatorId); - for (const requiredIndicatorId of targetScriptMetadata.requiredIndicatorIds) { - if (indicatorsMap.has(requiredIndicatorId)){ - item.baseIndicators.push(indicatorsMap.get(requiredIndicatorId)); - } - } - } - - this.computationIndicatorHierarchy.push(item); - } - - }; - - this.filterCurrentlySelectedIndicator = function(){ - return function( item ) { - - if (item.indicatorMetadata.indicatorId === self.selectedIndicator.indicatorId){ - return true; - } - return false; - - }; - }; - - this.filterBaseIndicatorsOfCurrentHeadlineIndicator = function(){ - return function( item ) { - - var headlineIndicatorEntry = self.headlineIndicatorHierarchy.filter(element => element.headlineIndicator.indicatorId == self.selectedIndicator.indicatorId)[0]; - - if(headlineIndicatorEntry){ - var baseIndicators_filtered = headlineIndicatorEntry.baseIndicators.filter(element => element.indicatorId == item.indicatorMetadata.indicatorId); - if (baseIndicators_filtered.length > 0){ - return true; - } - } - - return false; - - }; - }; - - this.filterBaseIndicatorsOfCurrentComputationIndicator = function(){ - return function( item ) { - - var computationIndicatorEntry = self.computationIndicatorHierarchy.filter(element => element.computationIndicator.indicatorId == self.selectedIndicator.indicatorId)[0]; - - if(computationIndicatorEntry){ - var baseIndicators_filtered = computationIndicatorEntry.baseIndicators.filter(element => element.indicatorId == item.indicatorMetadata.indicatorId); - if (baseIndicators_filtered.length > 0){ - return true; - } - } - - return false; - - }; - }; - - var onMetadataLoadingCompleted = function(){ - + var item = {}; + item.computationIndicator = computationIndicatorMetadata; + item.baseIndicators = []; + if (computationIndicatorScriptsMap.has(computationIndicatorMetadata.indicatorId)) { + var targetScriptMetadata = computationIndicatorScriptsMap.get(computationIndicatorMetadata.indicatorId); + for (const requiredIndicatorId of targetScriptMetadata.requiredIndicatorIds) { + if (indicatorsMap.has(requiredIndicatorId)) { + item.baseIndicators.push(indicatorsMap.get(requiredIndicatorId)); + } + } + } + this.computationIndicatorHierarchy.push(item); + } + }; + this.filterCurrentlySelectedIndicator = function () { + return function (item) { + if (item.indicatorMetadata.indicatorId === self.selectedIndicator.indicatorId) { + return true; + } + return false; + }; + }; + this.filterBaseIndicatorsOfCurrentHeadlineIndicator = function () { + return function (item) { + var headlineIndicatorEntry = self.headlineIndicatorHierarchy.filter(element => element.headlineIndicator.indicatorId == self.selectedIndicator.indicatorId)[0]; + if (headlineIndicatorEntry) { + var baseIndicators_filtered = headlineIndicatorEntry.baseIndicators.filter(element => element.indicatorId == item.indicatorMetadata.indicatorId); + if (baseIndicators_filtered.length > 0) { + return true; + } + } + return false; + }; + }; + this.filterBaseIndicatorsOfCurrentComputationIndicator = function () { + return function (item) { + var computationIndicatorEntry = self.computationIndicatorHierarchy.filter(element => element.computationIndicator.indicatorId == self.selectedIndicator.indicatorId)[0]; + if (computationIndicatorEntry) { + var baseIndicators_filtered = computationIndicatorEntry.baseIndicators.filter(element => element.indicatorId == item.indicatorMetadata.indicatorId); + if (baseIndicators_filtered.length > 0) { + return true; + } + } + return false; + }; + }; + var onMetadataLoadingCompleted = function () { $timeout(function () { - $rootScope.$broadcast("initialMetadataLoadingCompleted"); - - $timeout(function () { - $("option").each(function (index, element) { - var text = $(element).text(); - $(element).attr("title", text); - }); - }, 1000); + $rootScope.$broadcast("initialMetadataLoadingCompleted"); + $timeout(function () { + $("option").each(function (index, element) { + var text = $(element).text(); + $(element).attr("title", text); + }); + }, 1000); }, 1000); // setTimeout(() => { // // $rootScope.$broadcast("initialMetadataLoadingCompleted"); // }, 1000); - }; - - this.setAccessControl = function(input){ + }; + this.setAccessControl = function (input) { this.accessControl = input; this.accessControl_map = new Map(); for (const entry of input) { - this.accessControl_map.set(entry.organizationalUnitId, entry); + this.accessControl_map.set(entry.organizationalUnitId, entry); } this.updateAvailableRoles(); - }; - - this.fetchAccessControlMetadata = async function(keycloakRolesArray){ + }; + this.fetchAccessControlMetadata = async function (keycloakRolesArray) { self.setAccessControl(await kommonitorCacheHelperService.fetchAccessControlMetadata(keycloakRolesArray)); self.setCurrentKomMonitorLoginRoleNames(); self.setCurrentKomMonitorLoginRoleIds(); - }; - - this.replaceSingleAccessControlMetadata = function(targetRoleMetadata){ + }; + this.replaceSingleAccessControlMetadata = function (targetRoleMetadata) { for (let index = 0; index < this.accessControl.length; index++) { - let oldMetadata = this.accessControl[index]; - if(oldMetadata.organizationalUnitId == targetRoleMetadata.organizationalUnitId){ - this.accessControl[index] = targetRoleMetadata; - break; - } + let oldMetadata = this.accessControl[index]; + if (oldMetadata.organizationalUnitId == targetRoleMetadata.organizationalUnitId) { + this.accessControl[index] = targetRoleMetadata; + break; + } } this.accessControl_map.set(targetRoleMetadata.organizationalUnitId, targetRoleMetadata); this.updateAvailableRoles(); - }; - - this.addSingleAccessControlMetadata = function(metadata){ + }; + this.addSingleAccessControlMetadata = function (metadata) { let tmpArray = [metadata]; Array.prototype.push.apply(tmpArray, this.accessControl); this.accessControl = tmpArray; this.accessControl_map.set(metadata.organizationalUnitId, metadata); this.updateAvailableRoles(); - }; - - this.deleteSingleAccessControlMetadata = function(id){ + }; + this.deleteSingleAccessControlMetadata = function (id) { for (let index = 0; index < this.accessControl.length; index++) { - const oldMetadata = this.accessControl[index]; - if(oldMetadata.organizationalUnitId == id){ - this.accessControl.splice(index, 1); - break; - } + const oldMetadata = this.accessControl[index]; + if (oldMetadata.organizationalUnitId == id) { + this.accessControl.splice(index, 1); + break; + } } this.accessControl_map.delete(id); this.updateAvailableRoles(); - }; - - this.updateAvailableRoles = function() { + }; + this.updateAvailableRoles = function () { this.availableRoles = []; for (let elem of this.accessControl) { - for (let role of elem.roles) { - let available = {...role, ...{"organizationalUnit": elem, "roleName": elem.name + "-" + role.permissionLevel}}; - this.availableRoles.push(available); - } + for (let role of elem.roles) { + let available = { ...role, ...{ "organizationalUnit": elem, "roleName": elem.name + "-" + role.permissionLevel } }; + this.availableRoles.push(available); + } } // we need to refresh all modals as roles have changed $rootScope.$broadcast("availableRolesUpdate"); - } - - this.getAccessControlById = function(id){ + }; + this.getAccessControlById = function (id) { return this.accessControl_map.get(id); - }; - - this.fetchTopicsMetadata = async function(keycloakRolesArray){ + }; + this.fetchTopicsMetadata = async function (keycloakRolesArray) { self.setTopics(await kommonitorCacheHelperService.fetchTopicsMetadata(keycloakRolesArray)); - }; - - this.fetchSpatialUnitsMetadata = async function(keycloakRolesArray){ + }; + this.fetchSpatialUnitsMetadata = async function (keycloakRolesArray) { self.setSpatialUnits(await kommonitorCacheHelperService.fetchSpatialUnitsMetadata(keycloakRolesArray)); - }; - - this.fetchGeoresourcesMetadata = async function(keycloakRolesArray){ + }; + this.fetchGeoresourcesMetadata = async function (keycloakRolesArray) { self.setGeoresources(await kommonitorCacheHelperService.fetchGeoresourceMetadata(keycloakRolesArray)); - }; - - this.fetchIndicatorsMetadata = async function(keycloakRolesArray){ + }; + this.fetchIndicatorsMetadata = async function (keycloakRolesArray) { self.setIndicators(await kommonitorCacheHelperService.fetchIndicatorsMetadata(keycloakRolesArray)); - }; - - this.fetchIndicatorScriptsMetadata = async function(keycloakRolesArray){ + }; + this.fetchIndicatorScriptsMetadata = async function (keycloakRolesArray) { self.setProcessScripts(await kommonitorCacheHelperService.fetchProcessScriptsMetadata(keycloakRolesArray)); - }; - - this.indicatorValueIsNoData = function(indicatorValue){ - if(Number.isNaN(indicatorValue) || indicatorValue === null || indicatorValue === undefined){ - return true; - } - return false; - }; - - this.getIndicatorValueFromArray_asNumber = function(propertiesArray, targetDateString){ - if(!targetDateString.includes(DATE_PREFIX)){ - targetDateString = DATE_PREFIX + targetDateString; - } - var indicatorValue = propertiesArray[targetDateString]; - var value; - if(this.indicatorValueIsNoData(indicatorValue)){ - value = "NoData"; - } - else{ - value = this.getIndicatorValue_asNumber(indicatorValue); - } - - return value; - }; - - this.getIndicatorValueFromArray_asFormattedText = function(propertiesArray, targetDateString){ - if(!targetDateString.includes(DATE_PREFIX)){ - targetDateString = DATE_PREFIX + targetDateString; - } - var indicatorValue = propertiesArray[targetDateString]; - var value; - if(this.indicatorValueIsNoData(indicatorValue)){ - value = "NoData"; - } - else{ - value = this.getIndicatorValue_asFormattedText(indicatorValue); - } - - return value; - }; - - this.getIndicatorValue_asNumber = function(indicatorValue){ - var value; - if(this.indicatorValueIsNoData(indicatorValue)){ - value = "NoData"; - } - else{ - value = +Number(indicatorValue).toFixed(numberOfDecimals); - } - + }; + this.indicatorValueIsNoData = function (indicatorValue) { + if (Number.isNaN(indicatorValue) || indicatorValue === null || indicatorValue === undefined) { + return true; + } + return false; + }; + this.getIndicatorValueFromArray_asNumber = function (propertiesArray, targetDateString) { + if (!targetDateString.includes(DATE_PREFIX)) { + targetDateString = DATE_PREFIX + targetDateString; + } + var indicatorValue = propertiesArray[targetDateString]; + var value; + if (this.indicatorValueIsNoData(indicatorValue)) { + value = "NoData"; + } + else { + value = this.getIndicatorValue_asNumber(indicatorValue); + } + return value; + }; + this.getIndicatorValueFromArray_asFormattedText = function (propertiesArray, targetDateString) { + if (!targetDateString.includes(DATE_PREFIX)) { + targetDateString = DATE_PREFIX + targetDateString; + } + var indicatorValue = propertiesArray[targetDateString]; + var value; + if (this.indicatorValueIsNoData(indicatorValue)) { + value = "NoData"; + } + else { + value = this.getIndicatorValue_asFormattedText(indicatorValue); + } + return value; + }; + this.getIndicatorValue_asNumber = function (indicatorValue) { + var value; + if (this.indicatorValueIsNoData(indicatorValue)) { + value = "NoData"; + } + else { + value = +Number(indicatorValue).toFixed(numberOfDecimals); + } // if the original value is greater than zero but would be rounded as 0 then we must return the original result - if(Number(value) == 0 && indicatorValue > 0){ - value = Number(indicatorValue); - } - - return value; - }; - - this.getIndicatorValue_asFormattedText = function(indicatorValue){ - var value; - if(this.indicatorValueIsNoData(indicatorValue)){ - value = "NoData"; - } - else{ - value = Number(indicatorValue).toLocaleString('de-DE', {maximumFractionDigits: numberOfDecimals}); - } - + if (Number(value) == 0 && indicatorValue > 0) { + value = Number(indicatorValue); + } + return value; + }; + this.getIndicatorValue_asFormattedText = function (indicatorValue) { + var value; + if (this.indicatorValueIsNoData(indicatorValue)) { + value = "NoData"; + } + else { + value = Number(indicatorValue).toLocaleString('de-DE', { maximumFractionDigits: numberOfDecimals }); + } // if the original value is greater than zero but would be rounded as 0 then we must return the original result - if(Number(value) == 0 && indicatorValue > 0){ - value = Number(indicatorValue).toLocaleString('de-DE'); - } - - return value; - }; - - this.getTopicHierarchyDisplayString = function(topicReferenceId){ + if (Number(value) == 0 && indicatorValue > 0) { + value = Number(indicatorValue).toLocaleString('de-DE'); + } + return value; + }; + this.getTopicHierarchyDisplayString = function (topicReferenceId) { var topicHierarchyArray = this.getTopicHierarchyForTopicId(topicReferenceId); - var topicsString = ""; for (let index = 0; index < topicHierarchyArray.length; index++) { - if (index === 0) { - // mainTopic --> first tier - topicsString += topicHierarchyArray[index].topicName; - } - else { - var numberOfWhitespaces = 2 * index; - var whitespaceString = ""; - for (let k = 0; k < numberOfWhitespaces; k++) { - whitespaceString += " "; - } - topicsString += whitespaceString + topicHierarchyArray[index].topicName; - } - - if (index < topicHierarchyArray.length) { - topicsString += "
        "; - } - + if (index === 0) { + // mainTopic --> first tier + topicsString += topicHierarchyArray[index].topicName; + } + else { + var numberOfWhitespaces = 2 * index; + var whitespaceString = ""; + for (let k = 0; k < numberOfWhitespaces; k++) { + whitespaceString += " "; + } + topicsString += whitespaceString + topicHierarchyArray[index].topicName; + } + if (index < topicHierarchyArray.length) { + topicsString += "
        "; + } } - return topicsString; - }; - - this.getIndicatorStringFromIndicatorType = function (indicatorType) { + }; + this.getIndicatorStringFromIndicatorType = function (indicatorType) { var indicatorTypeString; - for (const indicatorTypeOption of this.indicatorTypeOptions) { - if (indicatorType.includes(indicatorTypeOption.apiName)) { - indicatorTypeString = indicatorTypeOption.displayName; - break; - } + if (indicatorType.includes(indicatorTypeOption.apiName)) { + indicatorTypeString = indicatorTypeOption.displayName; + break; + } } - return indicatorTypeString; - }; - - - this.labelAllFeatures = "alle Features"; - this.labelFilteredFeatures = "gefilterte Features"; - this.labelSelectedFeatures = "selektierte Features"; - this.labelNumberOfFeatures = "Anzahl:" - this.labelSum = "Summe:" - this.labelMean = "arith. Mittel:" - this.labelMin = "Minimalwert:" - this.labelMax = "Maximalwert" - - this.allFeaturesNumberOfFeatures; - this.allFeaturesSum; - this.allFeaturesMean; - this.allFeaturesMin; - this.allFeaturesMax; - this.selectedFeaturesNumberOfFeatures; - this.selectedFeaturesSum; - this.selectedFeaturesMean; - this.selectedFeaturesMin; - this.selectedFeaturesMax; - this.allFeaturesPropertyUnit; - - this.setAllFeaturesProperty = function(indicatorMetadataAndGeoJSON, propertyName){ + }; + this.labelAllFeatures = "alle Features"; + this.labelFilteredFeatures = "gefilterte Features"; + this.labelSelectedFeatures = "selektierte Features"; + this.labelNumberOfFeatures = "Anzahl:"; + this.labelSum = "Summe:"; + this.labelMean = "arith. Mittel:"; + this.labelMin = "Minimalwert:"; + this.labelMax = "Maximalwert"; + this.allFeaturesNumberOfFeatures; + this.allFeaturesSum; + this.allFeaturesMean; + this.allFeaturesMin; + this.allFeaturesMax; + this.selectedFeaturesNumberOfFeatures; + this.selectedFeaturesSum; + this.selectedFeaturesMean; + this.selectedFeaturesMin; + this.selectedFeaturesMax; + this.allFeaturesPropertyUnit; + this.setAllFeaturesProperty = function (indicatorMetadataAndGeoJSON, propertyName) { let sum = 0; let count = 0; let min = Number.MAX_VALUE; let max = Number.MIN_VALUE; - for (const feature of indicatorMetadataAndGeoJSON.geoJSON.features) { - if(! this.indicatorValueIsNoData(feature.properties[propertyName])){ - let value = this.getIndicatorValueFromArray_asNumber(feature.properties, propertyName) - sum += value; - if (value < min) min = value; - if (value > max) max = value; - count++; - } + if (!this.indicatorValueIsNoData(feature.properties[propertyName])) { + let value = this.getIndicatorValueFromArray_asNumber(feature.properties, propertyName); + sum += value; + if (value < min) + min = value; + if (value > max) + max = value; + count++; + } } - this.allFeaturesPropertyUnit = indicatorMetadataAndGeoJSON.unit; this.allFeaturesNumberOfFeatures = count; this.allFeaturesSum = this.getIndicatorValue_asFormattedText(sum); // no division by zero - if (count > 0) - this.allFeaturesMean = this.getIndicatorValue_asFormattedText(sum / count); - else - this.allFeaturesMean = 0; + if (count > 0) + this.allFeaturesMean = this.getIndicatorValue_asFormattedText(sum / count); + else + this.allFeaturesMean = 0; this.allFeaturesMin = this.getIndicatorValue_asFormattedText(min); - this.allFeaturesMax = this.getIndicatorValue_asFormattedText(max) - }; - - - this.setSelectedFeatureProperty = function(selectedFeaturesMap, propertyName) { + this.allFeaturesMax = this.getIndicatorValue_asFormattedText(max); + }; + this.setSelectedFeatureProperty = function (selectedFeaturesMap, propertyName) { let sum = 0; - let count = 0 + let count = 0; let min = Number.MAX_VALUE; let max = Number.MIN_VALUE; - - selectedFeaturesMap.forEach(function(feature, key, map) { - if(! thisService.indicatorValueIsNoData(feature.properties[propertyName])){ - let value = thisService.getIndicatorValueFromArray_asNumber(feature.properties, propertyName); - sum += value; - if (value < min) min = value; - if (value > max) max = value; - count++; - } + selectedFeaturesMap.forEach(function (feature, key, map) { + if (!thisService.indicatorValueIsNoData(feature.properties[propertyName])) { + let value = thisService.getIndicatorValueFromArray_asNumber(feature.properties, propertyName); + sum += value; + if (value < min) + min = value; + if (value > max) + max = value; + count++; + } }); - - if(count === 0) { - // no feature selected, overwrite initial values for min and max - min = 0; - max = 0; + if (count === 0) { + // no feature selected, overwrite initial values for min and max + min = 0; + max = 0; } - - this.selectedFeaturesNumberOfFeatures = count; this.selectedFeaturesSum = this.getIndicatorValue_asFormattedText(sum); // no division by zero - if (count > 0) - this.selectedFeaturesMean = this.getIndicatorValue_asFormattedText(sum / count); - else - this.selectedFeaturesMean = 0; + if (count > 0) + this.selectedFeaturesMean = this.getIndicatorValue_asFormattedText(sum / count); + else + this.selectedFeaturesMean = 0; this.selectedFeaturesMin = this.getIndicatorValue_asFormattedText(min); this.selectedFeaturesMax = this.getIndicatorValue_asFormattedText(max); - }; - - - var containsNegativeValues = function(geoJSON, propertyName){ - + }; + var containsNegativeValues = function (geoJSON, propertyName) { var containsNegativeValues = false; - for(var i=0; i< geoJSON.features.length; i++){ - if (geoJSON.features[i].properties[propertyName] < 0){ - containsNegativeValues = true; - break; - } + for (var i = 0; i < geoJSON.features.length; i++) { + if (geoJSON.features[i].properties[propertyName] < 0) { + containsNegativeValues = true; + break; + } } - return containsNegativeValues; - }; - - this.formatIndicatorNameForLabel = function(indicatorName, maxCharsPerLine){ + }; + this.formatIndicatorNameForLabel = function (indicatorName, maxCharsPerLine) { var arr = []; var space = /\s/; - const words = indicatorName.split(space); // push first word into new array if (words[0].length) { - arr.push(words[0]); + arr.push(words[0]); } - for (let i = 1; i < words.length; i++) { - if (words[i].length + arr[arr.length - 1].length < maxCharsPerLine) { - arr[arr.length - 1] = `${arr[arr.length - 1]} ${words[i - ]}`; - } - else { - arr.push(words[i]); - } + if (words[i].length + arr[arr.length - 1].length < maxCharsPerLine) { + arr[arr.length - 1] = `${arr[arr.length - 1]} ${words[i]}`; + } + else { + arr.push(words[i]); + } } return arr.join("\n"); - }; - - this.filterIndicators = function (){ - return function( item ) { - - return isDisplayableIndicator(item); + }; + this.filterIndicators = function () { + return function (item) { + return isDisplayableIndicator(item); }; - }; - - this.filterGeoresources = function (){ - return function( item ) { - - return self.isDisplayableGeoresource(item); + }; + this.filterGeoresources = function () { + return function (item) { + return self.isDisplayableGeoresource(item); }; - }; - - this.isDisplayableGeoresource = function(item){ + }; + this.isDisplayableGeoresource = function (item) { var arrayOfNameSubstringsForHidingGeoresources = __env.arrayOfNameSubstringsForHidingGeoresources; - - if(item.availablePeriodsOfValidity == undefined || item.availablePeriodsOfValidity.length === 0) + if (item.availablePeriodsOfValidity == undefined || item.availablePeriodsOfValidity.length === 0) return false; - - var isGeoresourceThatShallNotBeDisplayed = arrayOfNameSubstringsForHidingGeoresources.some(substring => String(item.datasetName).includes(substring)); - - if(isGeoresourceThatShallNotBeDisplayed){ - return false; - } - return true; - }; - - this.selectedSpatialUnitIsRaster = function(){ + var isGeoresourceThatShallNotBeDisplayed = arrayOfNameSubstringsForHidingGeoresources.some(substring => String(item.datasetName).includes(substring)); + if (isGeoresourceThatShallNotBeDisplayed) { + return false; + } + return true; + }; + this.selectedSpatialUnitIsRaster = function () { var spatialUnitName = this.selectedSpatialUnit ? this.selectedSpatialUnit.spatialUnitLevel : ""; - return (spatialUnitName.includes("raster") || spatialUnitName.includes("Raster") || spatialUnitName.includes("RASTER") || spatialUnitName.includes("grid") || spatialUnitName.includes("GRID") || spatialUnitName.includes("Grid")); - }; - - // var roleMappingAllowsDisplay = function(indicatorMetadata){ - // //admin --> everything allowed - // if(self.currentKeycloakLoginRoles.includes(__env.keycloakKomMonitorAdminRoleName)){ - // return true; - // } - - // // public user - - - // // non-admin - // self.roleMetadataForCurrentKeycloakLoginRoles = self.availableRoles.filter(role => self.currentKeycloakLoginRoles.includes(role.roleName)); - - // var filteredApplicableUnits = indicatorMetadata.applicableSpatialUnits.filter(function (applicableSpatialUnit) { - // return applicableSpatialUnit.allowedRoles.length == 0 || applicableSpatialUnit.allowedRoles.some(allowedRoleId => self.roleMetadataForCurrentKeycloakLoginRoles.some(roleMetadata => roleMetadata.roleId === allowedRoleId) ); - // }); - - // return filteredApplicableUnits.length > 0; - // }; - - var isDisplayableIndicator = function(item){ - // var arrayOfNameSubstringsForHidingIndicators = ["Standardabweichung", "Prozentuale Ver"]; - var arrayOfNameSubstringsForHidingIndicators = __env.arrayOfNameSubstringsForHidingIndicators; - - // this is an item from i.e. indicatorRadar, that has a different structure - if(item.indicatorMetadata){ - if(item.indicatorMetadata.applicableDates == undefined || item.indicatorMetadata.applicableDates.length === 0) - return false; - - if(item.indicatorMetadata.applicableSpatialUnits == undefined || item.indicatorMetadata.applicableSpatialUnits.length === 0) - return false; - - var isIndicatorThatShallNotBeDisplayed = arrayOfNameSubstringsForHidingIndicators.some(substring => String(item.indicatorMetadata.indicatorName).includes(substring)); - - if(isIndicatorThatShallNotBeDisplayed){ - return false; - } - + }; + // var roleMappingAllowsDisplay = function(indicatorMetadata){ + // //admin --> everything allowed + // if(self.currentKeycloakLoginRoles.includes(__env.keycloakKomMonitorAdminRoleName)){ + // return true; + // } + // // public user + // // non-admin + // self.roleMetadataForCurrentKeycloakLoginRoles = self.availableRoles.filter(role => self.currentKeycloakLoginRoles.includes(role.roleName)); + // var filteredApplicableUnits = indicatorMetadata.applicableSpatialUnits.filter(function (applicableSpatialUnit) { + // return applicableSpatialUnit.allowedRoles.length == 0 || applicableSpatialUnit.allowedRoles.some(allowedRoleId => self.roleMetadataForCurrentKeycloakLoginRoles.some(roleMetadata => roleMetadata.roleId === allowedRoleId) ); + // }); + // return filteredApplicableUnits.length > 0; + // }; + var isDisplayableIndicator = function (item) { + // var arrayOfNameSubstringsForHidingIndicators = ["Standardabweichung", "Prozentuale Ver"]; + var arrayOfNameSubstringsForHidingIndicators = __env.arrayOfNameSubstringsForHidingIndicators; + // this is an item from i.e. indicatorRadar, that has a different structure + if (item.indicatorMetadata) { + if (item.indicatorMetadata.applicableDates == undefined || item.indicatorMetadata.applicableDates.length === 0) + return false; + if (item.indicatorMetadata.applicableSpatialUnits == undefined || item.indicatorMetadata.applicableSpatialUnits.length === 0) + return false; + var isIndicatorThatShallNotBeDisplayed = arrayOfNameSubstringsForHidingIndicators.some(substring => String(item.indicatorMetadata.indicatorName).includes(substring)); + if (isIndicatorThatShallNotBeDisplayed) { + return false; + } // if(! roleMappingAllowsDisplay(item.indicatorMetadata)){ // return false; // } - - return true; - } - else{ - // - if(item.applicableDates == undefined || item.applicableDates.length === 0) - return false; - - if(item.applicableSpatialUnits == undefined || item.applicableSpatialUnits.length === 0) - return false; - - // var isIndicatorThatShallNotBeDisplayed = item.indicatorName.includes("Standardabweichung") || item.indicatorName.includes("Prozentuale Ver"); - var isIndicatorThatShallNotBeDisplayed = arrayOfNameSubstringsForHidingIndicators.some(substring => String(item.indicatorName).includes(substring)); - - if(isIndicatorThatShallNotBeDisplayed){ - return false; - } - + return true; + } + else { + // + if (item.applicableDates == undefined || item.applicableDates.length === 0) + return false; + if (item.applicableSpatialUnits == undefined || item.applicableSpatialUnits.length === 0) + return false; + // var isIndicatorThatShallNotBeDisplayed = item.indicatorName.includes("Standardabweichung") || item.indicatorName.includes("Prozentuale Ver"); + var isIndicatorThatShallNotBeDisplayed = arrayOfNameSubstringsForHidingIndicators.some(substring => String(item.indicatorName).includes(substring)); + if (isIndicatorThatShallNotBeDisplayed) { + return false; + } // if(! roleMappingAllowsDisplay(item)){ // return false; // } - - return true; - } - }; - - this.filterGeoresourcesByPoi = function(){ - return function( item ) { - - try{ - if(item.isPOI){ - return true; + return true; + } + }; + this.filterGeoresourcesByPoi = function () { + return function (item) { + try { + if (item.isPOI) { + return true; + } + return false; + } + catch (error) { + return false; } - return false; - } - catch(error){ - return false; - } }; - }; - - this.filterPois = function(){ - return function( item ) { - - try{ - // if(item.datasetName.includes("Lebensmittel")){ - // return false; - // } - return true; - } - catch(error){ - return true; - } + }; + this.filterPois = function () { + return function (item) { + try { + // if(item.datasetName.includes("Lebensmittel")){ + // return false; + // } + return true; + } + catch (error) { + return true; + } }; - }; - - function getImageDimensions(file) { - return new Promise (function (resolved, rejected) { - var i = new Image(); - i.onload = function(){ - resolved({w: i.width, h: i.height}) - }; - i.src = file; + }; + function getImageDimensions(file) { + return new Promise(function (resolved, rejected) { + var i = new Image(); + i.onload = function () { + resolved({ w: i.width, h: i.height }); + }; + i.src = file; }); - } - - /** - * creates and returns a pdf for the indicator given as parameter - */ - this.createMetadataPDF_indicator = async function(indicator) { - + } + /** + * creates and returns a pdf for the indicator given as parameter + */ + this.createMetadataPDF_indicator = async function (indicator) { var jspdf = new jsPDF(); jspdf.setFontSize(16); // jspdf.text("Metadatenblatt", 70, 6); - //insert logo var img = new Image(); var subPath = location.pathname; img.src = subPath + 'logos/KM_Logo1.png'; jspdf.addImage(img, 'PNG', 193, 5, 12, 12); - jspdf.setFontSize(16); jspdf.setFont('Helvetica', 'bolditalic', 'normal'); - var titleArray = jspdf.splitTextToSize("Indikator: " +indicator.indicatorName, 180); + var titleArray = jspdf.splitTextToSize("Indikator: " + indicator.indicatorName, 180); jspdf.text(titleArray, 14, 25); - if (indicator.characteristicValue && indicator.characteristicValue != "-" && indicator.characteristicValue != "") { - jspdf.setFontSize(14); - jspdf.text(indicator.characteristicValue, 14, 25); + jspdf.setFontSize(14); + jspdf.text(indicator.characteristicValue, 14, 25); } - - jspdf.setFontSize(11); - var initialStartY = 30; - if (titleArray.length > 1) { - titleArray.forEach(function (item) { - initialStartY += 5; - }); + titleArray.forEach(function (item) { + initialStartY += 5; + }); } if (indicator.characteristicValue && indicator.characteristicValue != "-" && indicator.characteristicValue != "") { - initialStartY += 5; + initialStartY += 5; } - var headStyles = { - fontStyle: 'bold', - fontSize: 12, - fillColor: '#337ab7', - // auto or wrap - cellWidth: 'auto' + fontStyle: 'bold', + fontSize: 12, + fillColor: '#337ab7', + // auto or wrap + cellWidth: 'auto' }; - var bodyStyles = { - fontStyle: 'normal', - fontSize: 11, - // auto or wrap or number - cellWidth: 'auto' + fontStyle: 'normal', + fontSize: 11, + // auto or wrap or number + cellWidth: 'auto' }; - // first column with fixed width var columnStyles = { - 0: { cellWidth: 45, fontStyle: 'bold' }, - 1: { fontStyle: 'normal' } + 0: { cellWidth: 45, fontStyle: 'bold' }, + 1: { fontStyle: 'normal' } }; - var topicsString = ""; - var topicReferenceId = indicator.topicReference; - // will be an array representing the topic hierarchy // i.e. [mainTopic, subTopicFirstTier, subTopicSecondTier, ...] var topicHierarchyArray = this.getTopicHierarchyForTopicId(topicReferenceId); - for (let index = 0; index < topicHierarchyArray.length; index++) { - if (index === 0) { - // mainTopic --> first tier - topicsString += topicHierarchyArray[index].topicName; - } - else { - var numberOfWhitespaces = 2 * index; - var whitespaceString = ""; - for (let k = 0; k < numberOfWhitespaces; k++) { - whitespaceString += " "; - } - topicsString += whitespaceString + topicHierarchyArray[index].topicName; - } - - if (index < topicHierarchyArray.length - 1) { - topicsString += "\n"; - } - - } - + if (index === 0) { + // mainTopic --> first tier + topicsString += topicHierarchyArray[index].topicName; + } + else { + var numberOfWhitespaces = 2 * index; + var whitespaceString = ""; + for (let k = 0; k < numberOfWhitespaces; k++) { + whitespaceString += " "; + } + topicsString += whitespaceString + topicHierarchyArray[index].topicName; + } + if (index < topicHierarchyArray.length - 1) { + topicsString += "\n"; + } + } var category = "Basisindikator"; if (indicator.isHeadlineIndicator) { - category = "Leitindikator"; + category = "Leitindikator"; } - // Or JavaScript: jspdf.autoTable({ - head: [['Themenfeld', 'Kategorie', 'Typ', 'Kennzeichen']], - body: [ - [topicsString, category, this.getIndicatorStringFromIndicatorType(indicator.indicatorType), indicator.abbreviation ? indicator.abbreviation : "-"] - // ... - ], - theme: 'grid', - headStyles: headStyles, - bodyStyles: bodyStyles, - startY: initialStartY + head: [['Themenfeld', 'Kategorie', 'Typ', 'Kennzeichen']], + body: [ + [topicsString, category, this.getIndicatorStringFromIndicatorType(indicator.indicatorType), indicator.abbreviation ? indicator.abbreviation : "-"] + // ... + ], + theme: 'grid', + headStyles: headStyles, + bodyStyles: bodyStyles, + startY: initialStartY }); - var linkedIndicatorsString = ""; - for (var [index, linkedIndicator] of indicator.referencedIndicators.entries()) { - linkedIndicatorsString += linkedIndicator.referencedIndicatorName + " - \n " + linkedIndicator.referencedIndicatorDescription; - - if (index < indicator.referencedIndicators.length - 1) { - linkedIndicatorsString += "\n\n"; - } + linkedIndicatorsString += linkedIndicator.referencedIndicatorName + " - \n " + linkedIndicator.referencedIndicatorDescription; + if (index < indicator.referencedIndicators.length - 1) { + linkedIndicatorsString += "\n\n"; + } } - if (linkedIndicatorsString === "") { - linkedIndicatorsString = "-"; + linkedIndicatorsString = "-"; } - var linkedGeoresourcesString = ""; - for (var [k, linkedGeoresource] of indicator.referencedGeoresources.entries()) { - linkedGeoresourcesString += linkedGeoresource.referencedGeoresourceName + " - \n " + linkedGeoresource.referencedGeoresourceDescription; - - if (k < indicator.referencedGeoresources.length - 1) { - linkedGeoresourcesString += "\n\n"; - } + linkedGeoresourcesString += linkedGeoresource.referencedGeoresourceName + " - \n " + linkedGeoresource.referencedGeoresourceDescription; + if (k < indicator.referencedGeoresources.length - 1) { + linkedGeoresourcesString += "\n\n"; + } } - if (linkedGeoresourcesString === "") { - linkedGeoresourcesString = "-"; + linkedGeoresourcesString = "-"; } - // jspdf.autoTable({ // head: [], // body: [ @@ -2279,111 +1825,90 @@ angular // ], // startY: jspdf.autoTable.previous.finalY + 20, // }); - var spatialUnitsString = ""; var processedSpatialUnits = 0; - for (var availableSpatialUnit of this.availableSpatialUnits) { - - for (var applicableSpatialUnit of indicator.applicableSpatialUnits) { - - if (availableSpatialUnit.spatialUnitLevel === applicableSpatialUnit.spatialUnitName) { - spatialUnitsString += applicableSpatialUnit.spatialUnitName; - processedSpatialUnits++; - - if (processedSpatialUnits < indicator.applicableSpatialUnits.length) { - spatialUnitsString += "\n"; - } - } - - } - } - + for (var applicableSpatialUnit of indicator.applicableSpatialUnits) { + if (availableSpatialUnit.spatialUnitLevel === applicableSpatialUnit.spatialUnitName) { + spatialUnitsString += applicableSpatialUnit.spatialUnitName; + processedSpatialUnits++; + if (processedSpatialUnits < indicator.applicableSpatialUnits.length) { + spatialUnitsString += "\n"; + } + } + } + } var datesString = ""; - - if(indicator.applicableDates.length <= 20){ - for (var [j, date] of indicator.applicableDates.entries()) { - var asDate = new Date(date); - - datesString += this.tsToDate_withOptionalUpdateInterval(this.dateToTS(asDate), indicator.metadata.updateInterval); - - if (j < indicator.applicableDates.length - 1) { - datesString += " "; - } - } - } - else{ - datesString += "Zeitreihe umfasst insgesamt " + indicator.applicableDates.length + " Zeitpunkte\n\n"; - - datesString += "frühester Zeitpunkt: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(indicator.applicableDates[0]), indicator.metadata.updateInterval) + "\n"; - datesString += "spätester Zeitpunkt: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(indicator.applicableDates[indicator.applicableDates.length - 1]), indicator.metadata.updateInterval); - - } - + if (indicator.applicableDates.length <= 20) { + for (var [j, date] of indicator.applicableDates.entries()) { + var asDate = new Date(date); + datesString += this.tsToDate_withOptionalUpdateInterval(this.dateToTS(asDate), indicator.metadata.updateInterval); + if (j < indicator.applicableDates.length - 1) { + datesString += " "; + } + } + } + else { + datesString += "Zeitreihe umfasst insgesamt " + indicator.applicableDates.length + " Zeitpunkte\n\n"; + datesString += "frühester Zeitpunkt: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(indicator.applicableDates[0]), indicator.metadata.updateInterval) + "\n"; + datesString += "spätester Zeitpunkt: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(indicator.applicableDates[indicator.applicableDates.length - 1]), indicator.metadata.updateInterval); + } var imgData; var imgWidth; var imgHeight; - - if(indicator.processDescription && indicator.processDescription.includes("$")){ - await html2canvas(document.querySelector("#indicatorProcessDescription")).then(canvas => { - // document.body.appendChild(canvas) - - imgData = canvas.toDataURL('image/png'); - - }); - - var dimensions = await getImageDimensions(imgData); - imgWidth = dimensions.w; - imgHeight = dimensions.h; - } - + if (indicator.processDescription && indicator.processDescription.includes("$")) { + await html2canvas(document.querySelector("#indicatorProcessDescription")).then(canvas => { + // document.body.appendChild(canvas) + imgData = canvas.toDataURL('image/png'); + }); + var dimensions = await getImageDimensions(imgData); + imgWidth = dimensions.w; + imgHeight = dimensions.h; + } jspdf.autoTable({ - head: [], - body: [ - ["Beschreibung", indicator.metadata.description], - ["Maßeinheit", indicator.unit], - ["Methodik", indicator.processDescription ? indicator.processDescription : "-"], - // ["Klassifizierung", "-"], - ["Interpretation", indicator.interpretation ? indicator.interpretation : "-"], - ["Tags", indicator.tags ? JSON.stringify(indicator.tags) : "-"], - ["Verknüpfte Indikatoren", linkedIndicatorsString], - ["Verknüpfte Geodaten", linkedGeoresourcesString] - ], - theme: 'grid', - headStyles: headStyles, - bodyStyles: bodyStyles, - columnStyles: columnStyles, - startY: jspdf.autoTable.previous.finalY + 10, - willDrawCell: function(data) { - if (imgData && data.row.index === 2 && data.column.index === 1 && data.cell.section === 'body') { - data.row.height = 2.5 * data.cell.height; - data.row.maxCellHeight = 2.5 * data.cell.height; - data.cell.height = 2.5 * data.cell.height; - data.cell.text = ""; - } - if (imgData && data.row.index === 2 && data.column.index === 0 && data.cell.section === 'body') { - data.row.height = 2.5 * data.cell.height; - data.row.maxCellHeight = 2.5 * data.cell.height; - data.cell.height = 2.5 * data.cell.height; - } - }, - didDrawCell: function(data) { - if (imgData && data.row.index === 2 && data.column.index === 1 && data.cell.section === 'body') { - var cellHeight = data.cell.height - data.cell.padding('vertical'); - var cellWidth = data.cell.width - data.cell.padding('horizontal'); - var textPos = data.cell.textPos; - - var imgScale = cellHeight / imgHeight; - var width = imgWidth * imgScale; - if (width > cellWidth){ - width = cellWidth; - } - - jspdf.addImage(imgData, "PNG", textPos.x, textPos.y, width, cellHeight); + head: [], + body: [ + ["Beschreibung", indicator.metadata.description], + ["Maßeinheit", indicator.unit], + ["Methodik", indicator.processDescription ? indicator.processDescription : "-"], + // ["Klassifizierung", "-"], + ["Interpretation", indicator.interpretation ? indicator.interpretation : "-"], + ["Tags", indicator.tags ? JSON.stringify(indicator.tags) : "-"], + ["Verknüpfte Indikatoren", linkedIndicatorsString], + ["Verknüpfte Geodaten", linkedGeoresourcesString] + ], + theme: 'grid', + headStyles: headStyles, + bodyStyles: bodyStyles, + columnStyles: columnStyles, + startY: jspdf.autoTable.previous.finalY + 10, + willDrawCell: function (data) { + if (imgData && data.row.index === 2 && data.column.index === 1 && data.cell.section === 'body') { + data.row.height = 2.5 * data.cell.height; + data.row.maxCellHeight = 2.5 * data.cell.height; + data.cell.height = 2.5 * data.cell.height; + data.cell.text = ""; + } + if (imgData && data.row.index === 2 && data.column.index === 0 && data.cell.section === 'body') { + data.row.height = 2.5 * data.cell.height; + data.row.maxCellHeight = 2.5 * data.cell.height; + data.cell.height = 2.5 * data.cell.height; + } + }, + didDrawCell: function (data) { + if (imgData && data.row.index === 2 && data.column.index === 1 && data.cell.section === 'body') { + var cellHeight = data.cell.height - data.cell.padding('vertical'); + var cellWidth = data.cell.width - data.cell.padding('horizontal'); + var textPos = data.cell.textPos; + var imgScale = cellHeight / imgHeight; + var width = imgWidth * imgScale; + if (width > cellWidth) { + width = cellWidth; + } + jspdf.addImage(imgData, "PNG", textPos.x, textPos.y, width, cellHeight); + } } - } }); - // // linked elements // jspdf.autoTable({ // head: [], @@ -2397,30 +1922,28 @@ angular // columnStyles: columnStyles, // startY: jspdf.autoTable.previous.finalY + 10 // }); - // linked elements jspdf.autoTable({ - head: [], - body: [ - ["Datengrundlage", indicator.metadata.databasis ? indicator.metadata.databasis : "-"], - ["Datenquelle", indicator.metadata.datasource ? indicator.metadata.datasource : "-"], - ["Datenhalter und Kontakt", indicator.metadata.contact ? indicator.metadata.contact : "-"], - ["Bemerkung", indicator.metadata.note ? indicator.metadata.note : "-"], - ["Raumbezug", spatialUnitsString], - // $scope.updateInteval is a map mapping the english KEYs to german expressions - ["Zeitbezug / Fortführungsintervall", this.updateInterval.get(indicator.metadata.updateInterval.toUpperCase())], - ["Hinweise zum Referenzdatum", indicator.referenceDateNote ? indicator.referenceDateNote : "-"], - ["Verfügbare Zeitreihen", datesString], - ["Datum der letzten Aktualisierung", this.tsToDate_withOptionalUpdateInterval(this.dateToTS(indicator.metadata.lastUpdate))], - ["Quellen / Literatur", indicator.metadata.literature ? indicator.metadata.literature : "-"] - ], - theme: 'grid', - headStyles: headStyles, - bodyStyles: bodyStyles, - columnStyles: columnStyles, - startY: jspdf.autoTable.previous.finalY + 10 + head: [], + body: [ + ["Datengrundlage", indicator.metadata.databasis ? indicator.metadata.databasis : "-"], + ["Datenquelle", indicator.metadata.datasource ? indicator.metadata.datasource : "-"], + ["Datenhalter und Kontakt", indicator.metadata.contact ? indicator.metadata.contact : "-"], + ["Bemerkung", indicator.metadata.note ? indicator.metadata.note : "-"], + ["Raumbezug", spatialUnitsString], + // $scope.updateInteval is a map mapping the english KEYs to german expressions + ["Zeitbezug / Fortführungsintervall", this.updateInterval.get(indicator.metadata.updateInterval.toUpperCase())], + ["Hinweise zum Referenzdatum", indicator.referenceDateNote ? indicator.referenceDateNote : "-"], + ["Verfügbare Zeitreihen", datesString], + ["Datum der letzten Aktualisierung", this.tsToDate_withOptionalUpdateInterval(this.dateToTS(indicator.metadata.lastUpdate))], + ["Quellen / Literatur", indicator.metadata.literature ? indicator.metadata.literature : "-"] + ], + theme: 'grid', + headStyles: headStyles, + bodyStyles: bodyStyles, + columnStyles: columnStyles, + startY: jspdf.autoTable.previous.finalY + 10 }); - // // jspdf.autoTable({ // head: [], @@ -2434,655 +1957,571 @@ angular // columnStyles: columnStyles, // startY: jspdf.autoTable.previous.finalY + 10 // }); - return jspdf; - }; - - this.generateIndicatorMetadataPdf_asBlob = async function(){ + }; + this.generateIndicatorMetadataPdf_asBlob = async function () { // create PDF from currently selected/displayed indicator! var indicatorMetadata = this.selectedIndicator; var pdfName = indicatorMetadata.indicatorName + ".pdf"; - var jspdf = await this.generateIndicatorMetadataPdf(indicatorMetadata, pdfName); - return jspdf.output("blob", {filename: pdfName}); - }; - - this.generateIndicatorMetadataPdf = async function(indicatorMetadata, pdfName){ + var jspdf = await this.generateIndicatorMetadataPdf(indicatorMetadata, pdfName); + return jspdf.output("blob", { filename: pdfName }); + }; + this.generateIndicatorMetadataPdf = async function (indicatorMetadata, pdfName) { var jspdf = await this.createMetadataPDF_indicator(indicatorMetadata); - jspdf.setProperties({ - title: 'KomMonitor Indikatorenblatt', - subject: pdfName, - author: 'KomMonitor', - keywords: 'Indikator, Metadatenblatt', - creator: 'KomMonitor' + title: 'KomMonitor Indikatorenblatt', + subject: pdfName, + author: 'KomMonitor', + keywords: 'Indikator, Metadatenblatt', + creator: 'KomMonitor' }); return jspdf; - }; - - /** - * creates and returns a pdf for the georesource given as parameter - */ - this.createMetadataPDF_georesource = async function(georesource, pdfName) { - + }; + /** + * creates and returns a pdf for the georesource given as parameter + */ + this.createMetadataPDF_georesource = async function (georesource, pdfName) { var jspdf = new jsPDF(); jspdf.setFontSize(16); // jspdf.text("Metadatenblatt", 70, 6); - //insert logo var img = new Image(); var subPath = location.pathname; img.src = subPath + 'logos/KM_Logo1.png'; jspdf.addImage(img, 'PNG', 193, 5, 12, 12); - jspdf.setFontSize(16); jspdf.setFont('Helvetica', 'bolditalic', 'normal'); var titleArray = jspdf.splitTextToSize("Geodatensatz: " + georesource.datasetName, 180); jspdf.text(titleArray, 14, 25); - - jspdf.setFontSize(11); - var initialStartY = 30; - if (titleArray.length > 1) { - titleArray.forEach(function (item) { - initialStartY += 5; - }); + titleArray.forEach(function (item) { + initialStartY += 5; + }); } - var headStyles = { - fontStyle: 'bold', - fontSize: 12, - fillColor: '#337ab7', - // auto or wrap - cellWidth: 'auto' + fontStyle: 'bold', + fontSize: 12, + fillColor: '#337ab7', + // auto or wrap + cellWidth: 'auto' }; - var bodyStyles = { - fontStyle: 'normal', - fontSize: 11, - // auto or wrap or number - cellWidth: 'auto' + fontStyle: 'normal', + fontSize: 11, + // auto or wrap or number + cellWidth: 'auto' }; - // first column with fixed width var columnStyles = { - 0: { cellWidth: 45, fontStyle: 'bold' }, - 1: { fontStyle: 'normal' } + 0: { cellWidth: 45, fontStyle: 'bold' }, + 1: { fontStyle: 'normal' } }; - var topicsString = ""; - var topicReferenceId = georesource.topicReference; - // will be an array representing the topic hierarchy // i.e. [mainTopic, subTopicFirstTier, subTopicSecondTier, ...] var topicHierarchyArray = this.getTopicHierarchyForTopicId(topicReferenceId); - for (let index = 0; index < topicHierarchyArray.length; index++) { - if (index === 0) { - // mainTopic --> first tier - topicsString += topicHierarchyArray[index].topicName; - } - else { - var numberOfWhitespaces = 2 * index; - var whitespaceString = ""; - for (let k = 0; k < numberOfWhitespaces; k++) { - whitespaceString += " "; - } - topicsString += whitespaceString + topicHierarchyArray[index].topicName; - } - - if (index < topicHierarchyArray.length - 1) { - topicsString += "\n"; - } - - } - + if (index === 0) { + // mainTopic --> first tier + topicsString += topicHierarchyArray[index].topicName; + } + else { + var numberOfWhitespaces = 2 * index; + var whitespaceString = ""; + for (let k = 0; k < numberOfWhitespaces; k++) { + whitespaceString += " "; + } + topicsString += whitespaceString + topicHierarchyArray[index].topicName; + } + if (index < topicHierarchyArray.length - 1) { + topicsString += "\n"; + } + } var category = "Punkt"; if (georesource.isLOI) { - category = "Linie"; + category = "Linie"; } - else if(georesource.isAOI){ - category = "Fläche"; + else if (georesource.isAOI) { + category = "Fläche"; } - // Or JavaScript: jspdf.autoTable({ - head: [['Themenfeld', 'Datentyp', 'letzte Aktualisierung']], - body: [ - [topicsString, category, this.tsToDate_withOptionalUpdateInterval(this.dateToTS(georesource.metadata.lastUpdate))] - // ... - ], - theme: 'grid', - headStyles: headStyles, - bodyStyles: bodyStyles, - startY: initialStartY + head: [['Themenfeld', 'Datentyp', 'letzte Aktualisierung']], + body: [ + [topicsString, category, this.tsToDate_withOptionalUpdateInterval(this.dateToTS(georesource.metadata.lastUpdate))] + // ... + ], + theme: 'grid', + headStyles: headStyles, + bodyStyles: bodyStyles, + startY: initialStartY }); - var datesString = ""; - - if(georesource.availablePeriodsOfValidity.length <= 10){ - for (var [j, period] of georesource.availablePeriodsOfValidity.entries()) { - - var startDate = new Date(period.startDate); - var endDate = period.endDate? new Date(period.endDate) : undefined; - - datesString += "Zeitspanne: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(startDate)); - if(endDate){ - datesString += " - " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(endDate)); + if (georesource.availablePeriodsOfValidity.length <= 10) { + for (var [j, period] of georesource.availablePeriodsOfValidity.entries()) { + var startDate = new Date(period.startDate); + var endDate = period.endDate ? new Date(period.endDate) : undefined; + datesString += "Zeitspanne: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(startDate)); + if (endDate) { + datesString += " - " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(endDate)); + } + else { + datesString += "- 'null' (demnach gültig bis auf weiteres)"; + } + if (j < georesource.availablePeriodsOfValidity.length - 1) { + datesString += "\n"; + } } - else{ - datesString += "- 'null' (demnach gültig bis auf weiteres)"; + } + else { + datesString += "insgesamt " + georesource.availablePeriodsOfValidity.length + " Zeitspannen\n\n"; + var earliestStartDate; + var latestEndDate = -1; // my be null --> enc init with -1 + for (var [j, period] of georesource.availablePeriodsOfValidity.entries()) { + if (!earliestStartDate) { + earliestStartDate = new Date(period.startDate); + } + else { + if (new Date(period.startDate) < earliestStartDate) { + earliestStartDate = new Date(period.startDate); + } + } + if (latestEndDate == -1) { + if (period.endDate) { + latestEndDate = new Date(period.endDate); + } + else if (period.endDate == null) { + latestEndDate = null; + } + } + else { + if (latestEndDate && period.endDate && new Date(period.endDate) > latestEndDate) { + latestEndDate = new Date(period.endDate); + } + } + } + datesString += "frühestes Startdatum: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(earliestStartDate)) + "\n"; + if (latestEndDate != null && latestEndDate != -1) { + datesString += "spätestes Enddatum: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(latestEndDate)) + "\n"; } - - if (j < georesource.availablePeriodsOfValidity.length - 1) { - datesString += "\n"; + else { + datesString += "spätestes Enddatum: ohne explizites Enddatum (demnach gültig bis auf weiteres)\n"; } - } } - else{ - datesString += "insgesamt " + georesource.availablePeriodsOfValidity.length + " Zeitspannen\n\n"; - - var earliestStartDate; - var latestEndDate = -1; // my be null --> enc init with -1 - - for (var [j, period] of georesource.availablePeriodsOfValidity.entries()) { - - if(! earliestStartDate){ - earliestStartDate = new Date(period.startDate); - } - else{ - if(new Date(period.startDate) < earliestStartDate){ - earliestStartDate = new Date(period.startDate); - } - } - - if(latestEndDate == -1){ - if(period.endDate){ - latestEndDate = new Date(period.endDate); - } - else if(period.endDate == null){ - latestEndDate = null; - } - - } - else{ - if(latestEndDate && period.endDate && new Date(period.endDate) > latestEndDate){ - latestEndDate = new Date(period.endDate); - } - } - } - - datesString += "frühestes Startdatum: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(earliestStartDate)) + "\n"; - if(latestEndDate != null && latestEndDate != -1){ - datesString += "spätestes Enddatum: " + this.tsToDate_withOptionalUpdateInterval(this.dateToTS(latestEndDate)) + "\n"; - } - else{ - datesString += "spätestes Enddatum: ohne explizites Enddatum (demnach gültig bis auf weiteres)\n"; - } - - - } - // linked elements jspdf.autoTable({ - head: [], - body: [ - ["Beschreibung", georesource.metadata.description], - ["Datengrundlage", georesource.metadata.databasis ? georesource.metadata.databasis : "-"], - ["Datenquelle", georesource.metadata.datasource ? georesource.metadata.datasource : "-"], - ["Datenhalter und Kontakt", georesource.metadata.contact ? georesource.metadata.contact : "-"], - ["Bemerkung", georesource.metadata.note ? georesource.metadata.note : "-"], - // $scope.updateInteval is a map mapping the english KEYs to german expressions - ["Zeitbezug / Fortführungsintervall", this.updateInterval.get(georesource.metadata.updateInterval.toUpperCase())], - ["Verfügbare Gültigkeitszeiträume", datesString], - ["Quellen / Literatur", georesource.metadata.literature ? georesource.metadata.literature : "-"] - ], - theme: 'grid', - headStyles: headStyles, - bodyStyles: bodyStyles, - columnStyles: columnStyles, - startY: jspdf.autoTable.previous.finalY + 10 + head: [], + body: [ + ["Beschreibung", georesource.metadata.description], + ["Datengrundlage", georesource.metadata.databasis ? georesource.metadata.databasis : "-"], + ["Datenquelle", georesource.metadata.datasource ? georesource.metadata.datasource : "-"], + ["Datenhalter und Kontakt", georesource.metadata.contact ? georesource.metadata.contact : "-"], + ["Bemerkung", georesource.metadata.note ? georesource.metadata.note : "-"], + // $scope.updateInteval is a map mapping the english KEYs to german expressions + ["Zeitbezug / Fortführungsintervall", this.updateInterval.get(georesource.metadata.updateInterval.toUpperCase())], + ["Verfügbare Gültigkeitszeiträume", datesString], + ["Quellen / Literatur", georesource.metadata.literature ? georesource.metadata.literature : "-"] + ], + theme: 'grid', + headStyles: headStyles, + bodyStyles: bodyStyles, + columnStyles: columnStyles, + startY: jspdf.autoTable.previous.finalY + 10 }); - jspdf.setProperties({ - title: 'KomMonitor Geodatenblatt', - subject: pdfName, - author: 'KomMonitor', - keywords: 'Geodaten, Metadatenblatt', - creator: 'KomMonitor' + title: 'KomMonitor Geodatenblatt', + subject: pdfName, + author: 'KomMonitor', + keywords: 'Geodaten, Metadatenblatt', + creator: 'KomMonitor' }); return jspdf; - }; - - this.generateGeoresourceMetadataPdf_asBlob = async function(georesourceMetadata){ + }; + this.generateGeoresourceMetadataPdf_asBlob = async function (georesourceMetadata) { var pdfName = georesourceMetadata.datasetName + ".pdf"; - var jspdf = await this.createMetadataPDF_georesource(georesourceMetadata, pdfName); - return jspdf.output("blob", {filename: pdfName}); - }; - - this.downloadMetadataPDF_georesource = async function(georesourceMetadata){ + var jspdf = await this.createMetadataPDF_georesource(georesourceMetadata, pdfName); + return jspdf.output("blob", { filename: pdfName }); + }; + this.downloadMetadataPDF_georesource = async function (georesourceMetadata) { var pdfName = georesourceMetadata.datasetName + ".pdf"; - var jspdf = await this.createMetadataPDF_georesource(georesourceMetadata, pdfName); + var jspdf = await this.createMetadataPDF_georesource(georesourceMetadata, pdfName); return jspdf.save(pdfName); - }; - - // this.getIndicatorStringFromIndicatorType = function (indicator) { - // var indicatorTypeString; - // if (indicator.indicatorType.includes("DYNAMIC_ABSOLUTE")) { - // indicatorTypeString = "Dynamik-Indikator (absolute)"; - // } - // else if (indicator.indicatorType.includes("DYNAMIC_RELATIVE")) { - // indicatorTypeString = "Dynamik-Indikator (relativ)"; - // } - // else if (indicator.indicatorType.includes("DYNAMIC_STANDARDIZED")) { - // indicatorTypeString = "Dynamik-Indikator (standardisiert)"; - // } - // else if (indicator.indicatorType.includes("STATUS_ABSOLUTE")) { - // indicatorTypeString = "Status-Indikator (absolut)"; - // } - // else if (indicator.indicatorType.includes("STATUS_RELATIVE")) { - // indicatorTypeString = "Status-Indikator (relativ)"; - // } - // else if (indicator.indicatorType.includes("STATUS_STANDARDIZED")) { - // indicatorTypeString = "Status-Indikator (standardisiert)"; - // } - - // return indicatorTypeString; - // }; - - this.dateToTS = function(date) { - if(date){ - return date.valueOf(); - } - - }; - - this.tsToDate = function(ts) { - if(ts){ - var date = new Date(ts); - - return date.toLocaleDateString("de-DE", { - year: 'numeric', - month: 'long', - day: 'numeric' - }); + }; + // this.getIndicatorStringFromIndicatorType = function (indicator) { + // var indicatorTypeString; + // if (indicator.indicatorType.includes("DYNAMIC_ABSOLUTE")) { + // indicatorTypeString = "Dynamik-Indikator (absolute)"; + // } + // else if (indicator.indicatorType.includes("DYNAMIC_RELATIVE")) { + // indicatorTypeString = "Dynamik-Indikator (relativ)"; + // } + // else if (indicator.indicatorType.includes("DYNAMIC_STANDARDIZED")) { + // indicatorTypeString = "Dynamik-Indikator (standardisiert)"; + // } + // else if (indicator.indicatorType.includes("STATUS_ABSOLUTE")) { + // indicatorTypeString = "Status-Indikator (absolut)"; + // } + // else if (indicator.indicatorType.includes("STATUS_RELATIVE")) { + // indicatorTypeString = "Status-Indikator (relativ)"; + // } + // else if (indicator.indicatorType.includes("STATUS_STANDARDIZED")) { + // indicatorTypeString = "Status-Indikator (standardisiert)"; + // } + // return indicatorTypeString; + // }; + this.dateToTS = function (date) { + if (date) { + return date.valueOf(); + } + }; + this.tsToDate = function (ts) { + if (ts) { + var date = new Date(ts); + return date.toLocaleDateString("de-DE", { + year: 'numeric', + month: 'long', + day: 'numeric' + }); } - }; - - this.tsToDate_withOptionalUpdateInterval = function(ts, updateIntervalApiName) { - if(ts){ - var date = new Date(ts); - - /** - * TODO FIXME dateSLider formatter will return only year for now to prevent misleading month and day settings - */ - - // return date.getFullYear(); - - if(updateIntervalApiName){ - if(updateIntervalApiName.toLowerCase() === "yearly"){ - return date.getFullYear(); - } - else if(updateIntervalApiName.toLowerCase() === "half_yearly"){ - return (date.getMonth() + 1) + "/" + date.getFullYear(); - } - else if(updateIntervalApiName.toLowerCase() === "monthly"){ - return (date.getMonth() + 1) + "/" + date.getFullYear(); - } - // else if(updateIntervalApiName.toLowerCase() === "weekly"){ - // return date.toLocaleDateString("de-DE", { - // year: 'numeric', - // month: 'short', - // day: 'numeric' - // }); - // } - // else if(updateIntervalApiName.toLowerCase() === "daily"){ - // return date.toLocaleDateString("de-DE", { - // year: 'numeric', - // month: 'short', - // day: 'numeric' - // }); - // } - else if(updateIntervalApiName.toLowerCase() === "quarterly"){ - var year = date.getFullYear(); - var month = date.getMonth(); - if(month < 4){ - return "Q1/" + year; - } - else if(month < 7){ - return "Q2/" + year; - } - else if(month < 10){ - return "Q3/" + year; + }; + this.tsToDate_withOptionalUpdateInterval = function (ts, updateIntervalApiName) { + if (ts) { + var date = new Date(ts); + /** + * TODO FIXME dateSLider formatter will return only year for now to prevent misleading month and day settings + */ + // return date.getFullYear(); + if (updateIntervalApiName) { + if (updateIntervalApiName.toLowerCase() === "yearly") { + return date.getFullYear(); + } + else if (updateIntervalApiName.toLowerCase() === "half_yearly") { + return (date.getMonth() + 1) + "/" + date.getFullYear(); + } + else if (updateIntervalApiName.toLowerCase() === "monthly") { + return (date.getMonth() + 1) + "/" + date.getFullYear(); + } + // else if(updateIntervalApiName.toLowerCase() === "weekly"){ + // return date.toLocaleDateString("de-DE", { + // year: 'numeric', + // month: 'short', + // day: 'numeric' + // }); + // } + // else if(updateIntervalApiName.toLowerCase() === "daily"){ + // return date.toLocaleDateString("de-DE", { + // year: 'numeric', + // month: 'short', + // day: 'numeric' + // }); + // } + else if (updateIntervalApiName.toLowerCase() === "quarterly") { + var year = date.getFullYear(); + var month = date.getMonth(); + if (month < 4) { + return "Q1/" + year; + } + else if (month < 7) { + return "Q2/" + year; + } + else if (month < 10) { + return "Q3/" + year; + } + else { + return "Q4/" + year; + } + } + else { + // includes daily and weekly, as they are presented equally + return date.toLocaleDateString("de-DE", { + year: 'numeric', + month: 'short', + day: 'numeric' + }); + } } else { - return "Q4/" + year; + return date.toLocaleDateString("de-DE", { + year: 'numeric', + month: 'short', + day: 'numeric' + }); } - } - else{ - // includes daily and weekly, as they are presented equally - return date.toLocaleDateString("de-DE", { - year: 'numeric', - month: 'short', - day: 'numeric' - }); - } - } - else{ - return date.toLocaleDateString("de-DE", { - year: 'numeric', - month: 'short', - day: 'numeric' - }); - } - - } - }; - - this.getSpatialUnitIdFromSpatialUnitName = function(name) { + } + }; + this.getSpatialUnitIdFromSpatialUnitName = function (name) { let result = null; - $(this.availableSpatialUnits).each( (id, obj) => { - if (obj.spatialUnitLevel === name) { - result = obj.spatialUnitId; - return false; - } + $(this.availableSpatialUnits).each((id, obj) => { + if (obj.spatialUnitLevel === name) { + result = obj.spatialUnitId; + return false; + } }); return result; - } - - /** - * creates an array of objects from an array of strings. - * each object in the result has the properties "category" and "name" - * - * example: - * convert ["s1", "s2", ...] ===> [{category: "s1",name: "s1"}, {category: "s2", name: "s2"}, ...] - * @param {array} array - */ - this.createDualListInputArray = function(array, nameProperty, idProperty) { - var result = []; - - if(array && Array.isArray(array)){ - for (var i=0;i [{category: "s1",name: "s1"}, {category: "s2", name: "s2"}, ...] + * @param {array} array + */ + this.createDualListInputArray = function (array, nameProperty, idProperty) { + var result = []; + if (array && Array.isArray(array)) { + for (var i = 0; i < array.length; i++) { + var obj = {}; + obj["category"] = array[i][nameProperty]; + obj["name"] = array[i][nameProperty]; + if (idProperty && array[i][idProperty]) { + obj["id"] = array[i][idProperty]; + } + result.push(obj); + } + } + return result; + }; + this.initializeRoleDualListConfig = function (inputArray, selectedArray, nameProperty) { + var duallistRoleOptions = { + label: 'Rollen', + boxItemsHeight: 'md', + items: this.createDualListInputArray(inputArray, nameProperty), + button: { leftText: "Alle auswählen", rightText: "Alle entfernen" }, + selectedItems: this.createDualListInputArray(selectedArray, nameProperty) + }; + // remove those timestamps from left side + duallistRoleOptions.items = duallistRoleOptions.items.filter(function (unselectedItem) { + return !duallistRoleOptions.selectedItems.find(function (selectedItem) { + return unselectedItem.name === selectedItem.name; + }); + }); + return duallistRoleOptions; + }; + this.getRoleMetadataForRoleName = function (roleName) { + for (const roleMetadata of this.availableRoles) { + if (roleMetadata.roleName === roleName) { + return roleMetadata; + } + } + }; + this.getRoleMetadataForRoleId = function (roleId) { + for (const roleMetadata of this.availableRoles) { + if (roleMetadata.roleId === roleId) { + return roleMetadata; + } + } + }; + this.getRoleMetadataForRoleIds = function (roleIdsArray) { + var rolesMetadata = []; + for (const roleMetadata of this.availableRoles) { + if (roleIdsArray.includes(roleMetadata.roleId)) { + rolesMetadata.push(roleMetadata); + } + } + return rolesMetadata; + }; + this.getAllowedRolesString = function (allowedRoleIds) { + var allowedRoles = []; + for (const organizationalUnit of this.accessControl) { + for (const role of organizationalUnit.roles) { + if (allowedRoleIds.includes(role.roleId)) { + allowedRoles.push(organizationalUnit.name + "-" + role.permissionLevel); + } + } + } + return allowedRoles.join(", "); + }; + this.checkDeletePermission = function () { + for (const role of this.currentKeycloakLoginRoles) { + let roleNameParts = role.split("-"); + const permissionLevel = roleNameParts[roleNameParts.length - 1]; //e.g. kommonitor-creator + if (permissionLevel == "creator") { + return true; + } + } + return false; + }; + this.checkCreatePermission = function () { + for (const role of this.currentKeycloakLoginRoles) { + let roleNameParts = role.split("-"); + const permissionLevel = roleNameParts[roleNameParts.length - 1]; //e.g. kommonitor-creator + if (permissionLevel == "publisher" || permissionLevel == "creator") { + return true; + } + } + return false; + }; + this.checkEditorPermission = function () { + for (const role of this.currentKeycloakLoginRoles) { + let roleNameParts = role.split("-"); + const permissionLevel = roleNameParts[roleNameParts.length - 1]; //e.g. kommonitor-creator + if (permissionLevel == "editor" || permissionLevel == "creator" || permissionLevel == "publisher") { + return true; + } + } + return false; + }; + this.checkAdminPermission = function () { + if (this.currentKeycloakLoginRoles.includes(__env.keycloakKomMonitorAdminRoleName)) { + return true; + } + return false; + }; + $rootScope.$on("onAddedFeatureToSelection", function (event, selectedIndicatorFeatureIds) { + let propertyName = buildIndicatorPropertyName(); + $timeout(function (params) { + thisService.setSelectedFeatureProperty(selectedIndicatorFeatureIds, propertyName); + }); + }); + $rootScope.$on("onRemovedFeatureFromSelection", function (event, selectedIndicatorFeatureIds) { + let propertyName = buildIndicatorPropertyName(); + $timeout(function (params) { + thisService.setSelectedFeatureProperty(selectedIndicatorFeatureIds, propertyName); + }); + }); + function buildIndicatorPropertyName() { + const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; + let propertyName = INDICATOR_DATE_PREFIX + thisService.selectedDate; + return propertyName; } - } - return false; - } - - this.checkAdminPermission = function(){ - if(this.currentKeycloakLoginRoles.includes(__env.keycloakKomMonitorAdminRoleName)){ - return true; - } - return false; - } - - - $rootScope.$on("onAddedFeatureToSelection", function (event, selectedIndicatorFeatureIds) { - let propertyName = buildIndicatorPropertyName(); - - $timeout(function(params) { - thisService.setSelectedFeatureProperty(selectedIndicatorFeatureIds, propertyName); - }); - }); - - $rootScope.$on("onRemovedFeatureFromSelection", function (event, selectedIndicatorFeatureIds) { - let propertyName = buildIndicatorPropertyName(); - - $timeout(function(params) { - thisService.setSelectedFeatureProperty(selectedIndicatorFeatureIds, propertyName); - }); - }); - - function buildIndicatorPropertyName() { - const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; - let propertyName = INDICATOR_DATE_PREFIX + thisService.selectedDate; - return propertyName; - } - - this.reportingDefaultTemplatePageElements = [ - { - "type": "indicatorTitle-landscape", - "dimensions": { - "top": "15px", - "left": "15px", - "width": "720px", - "height": "30px" - }, - "isPlaceholder": true, - "placeholderText": "Titel des Indikators [Einheit]", - "text": "", - "css": "text-align: left; padding-left: 5px; font-weight: bold;" - }, - { - "type": "dataTimestamp-landscape", - "dimensions": { - "top": "50px", - "left": "15px", - "width": "720px", - "height": "30px" - }, - "isPlaceholder": true, - "placeholderText": "Datenstand", - "text": "", - "css": "text-align: left; padding-left: 5px;" - }, - { - "type": "dataTimeseries-landscape", - "dimensions": { - "top": "50px", - "left": "15px", - "width": "720px", - "height": "30px" - }, - "isPlaceholder": true, - "placeholderText": "Zeitreihe von - bis", - "text": "", - "css": "text-align: left; padding-left: 5px;" - }, - { - "type": "reachability-subtitle-landscape", - "dimensions": { - "top": "50px", - "left": "15px", - "width": "720px", - "height": "30px" - }, - "isPlaceholder": true, - "placeholderText": "Aktueller Datenstand, Fortbewegungsmittel, [Indikator]", - "text": "", - "css": "text-align: left; padding-left: 5px;" - }, - { - "type": "communeLogo-landscape", - "dimensions": { - "top": "15px", - "left": "740px", - "width": "75px", - "height": "65px" - }, - "isPlaceholder": true, - "placeholderText": "Logo", - "src": "" - }, - { - "type": "footerHorizontalSpacer-landscape", - "dimensions": { - "top": "535px", - "left": "15px", - "width": "800px", - "height": "0px" - }, - "css": "border-top: solid rgb(148, 148, 148) 1px;" - }, - - { - "type": "footerCreationInfo-landscape", - "dimensions": { - "top": "545px", - "left": "15px", - "width": "720px", - "height": "30px" - }, - "isPlaceholder": true, - "placeholderText": "Erstellt am [Datum] von [Name d. Bearbeiters], [Name d. Kommune]", - "css": "text-align: left; padding-left: 5px;" - }, - { - "type": "pageNumber-landscape", - "dimensions": { - "top": "545px", - "left": "740px", - "width": "75px", - "height": "30px" - }, - "isPlaceholder": true, - "placeholderText": "[Seitenzahl]", - "css": "text-align: right; padding-right: 5px;" - }, - ] - - this.getDefaultReportingTemplatePageElement = function(type) { - let result = this.reportingDefaultTemplatePageElements.filter((el) => { - return el.type === type; - }); - if(typeof(result) === "undefined") { - throw "No DefaultReportingTemplatePageElement exists for type " + type + "." - } else { - return result[0]; - } - } - - - this.generateAndDownloadIndicatorZIP = async function(indicatorData, fileName, fileEnding, jsZipOptions){ - // generate metadata file and include actual dataset and metadata file in download - - var metadataPdf = await this.generateIndicatorMetadataPdf_asBlob(); - var zip = new JSZip(); - zip.file(fileName + fileEnding, indicatorData, jsZipOptions); - zip.file(fileName + "_Metadata.pdf", metadataPdf); - zip.generateAsync({type:"blob"}) - .then(function(content) { - // see FileSaver.js - saveAs(content, fileName + ".zip"); - }); - }; - - this.generateAndDownloadGeoresourceZIP = async function(georesourceMetadata, georesourceData, fileName, fileEnding, jsZipOptions){ - // generate metadata file and include actual dataset and metadata file in download - - var metadataPdf = await this.generateGeoresourceMetadataPdf_asBlob(georesourceMetadata); - var zip = new JSZip(); - zip.file(fileName + fileEnding, georesourceData, jsZipOptions); - zip.file(fileName + "_Metadata.pdf", metadataPdf); - zip.generateAsync({type:"blob"}) - .then(function(content) { - // see FileSaver.js - saveAs(content, fileName + ".zip"); - }); - }; -}]); + this.reportingDefaultTemplatePageElements = [ + { + "type": "indicatorTitle-landscape", + "dimensions": { + "top": "15px", + "left": "15px", + "width": "720px", + "height": "30px" + }, + "isPlaceholder": true, + "placeholderText": "Titel des Indikators [Einheit]", + "text": "", + "css": "text-align: left; padding-left: 5px; font-weight: bold;" + }, + { + "type": "dataTimestamp-landscape", + "dimensions": { + "top": "50px", + "left": "15px", + "width": "720px", + "height": "30px" + }, + "isPlaceholder": true, + "placeholderText": "Datenstand", + "text": "", + "css": "text-align: left; padding-left: 5px;" + }, + { + "type": "dataTimeseries-landscape", + "dimensions": { + "top": "50px", + "left": "15px", + "width": "720px", + "height": "30px" + }, + "isPlaceholder": true, + "placeholderText": "Zeitreihe von - bis", + "text": "", + "css": "text-align: left; padding-left: 5px;" + }, + { + "type": "reachability-subtitle-landscape", + "dimensions": { + "top": "50px", + "left": "15px", + "width": "720px", + "height": "30px" + }, + "isPlaceholder": true, + "placeholderText": "Aktueller Datenstand, Fortbewegungsmittel, [Indikator]", + "text": "", + "css": "text-align: left; padding-left: 5px;" + }, + { + "type": "communeLogo-landscape", + "dimensions": { + "top": "15px", + "left": "740px", + "width": "75px", + "height": "65px" + }, + "isPlaceholder": true, + "placeholderText": "Logo", + "src": "" + }, + { + "type": "footerHorizontalSpacer-landscape", + "dimensions": { + "top": "535px", + "left": "15px", + "width": "800px", + "height": "0px" + }, + "css": "border-top: solid rgb(148, 148, 148) 1px;" + }, + { + "type": "footerCreationInfo-landscape", + "dimensions": { + "top": "545px", + "left": "15px", + "width": "720px", + "height": "30px" + }, + "isPlaceholder": true, + "placeholderText": "Erstellt am [Datum] von [Name d. Bearbeiters], [Name d. Kommune]", + "css": "text-align: left; padding-left: 5px;" + }, + { + "type": "pageNumber-landscape", + "dimensions": { + "top": "545px", + "left": "740px", + "width": "75px", + "height": "30px" + }, + "isPlaceholder": true, + "placeholderText": "[Seitenzahl]", + "css": "text-align: right; padding-right: 5px;" + }, + ]; + this.getDefaultReportingTemplatePageElement = function (type) { + let result = this.reportingDefaultTemplatePageElements.filter((el) => { + return el.type === type; + }); + if (typeof (result) === "undefined") { + throw "No DefaultReportingTemplatePageElement exists for type " + type + "."; + } + else { + return result[0]; + } + }; + this.generateAndDownloadIndicatorZIP = async function (indicatorData, fileName, fileEnding, jsZipOptions) { + // generate metadata file and include actual dataset and metadata file in download + var metadataPdf = await this.generateIndicatorMetadataPdf_asBlob(); + var zip = new JSZip(); + zip.file(fileName + fileEnding, indicatorData, jsZipOptions); + zip.file(fileName + "_Metadata.pdf", metadataPdf); + zip.generateAsync({ type: "blob" }) + .then(function (content) { + // see FileSaver.js + saveAs(content, fileName + ".zip"); + }); + }; + this.generateAndDownloadGeoresourceZIP = async function (georesourceMetadata, georesourceData, fileName, fileEnding, jsZipOptions) { + // generate metadata file and include actual dataset and metadata file in download + var metadataPdf = await this.generateGeoresourceMetadataPdf_asBlob(georesourceMetadata); + var zip = new JSZip(); + zip.file(fileName + fileEnding, georesourceData, jsZipOptions); + zip.file(fileName + "_Metadata.pdf", metadataPdf); + zip.generateAsync({ type: "blob" }) + .then(function (content) { + // see FileSaver.js + saveAs(content, fileName + ".zip"); + }); + }; + }]); +//# sourceMappingURL=kommonitor-data-exchange-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorDataExchangeService/kommonitor-data-exchange-service.module.js.map b/app/util/genericServices/kommonitorDataExchangeService/kommonitor-data-exchange-service.module.js.map new file mode 100644 index 000000000..e992a97a1 --- /dev/null +++ b/app/util/genericServices/kommonitorDataExchangeService/kommonitor-data-exchange-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-data-exchange-service.module.js","sourceRoot":"","sources":["kommonitor-data-exchange-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorDataGridHelperService/kommonitor-data-grid-helper-service.module.js b/app/util/genericServices/kommonitorDataGridHelperService/kommonitor-data-grid-helper-service.module.js index 72262fa72..c3668bdcd 100644 --- a/app/util/genericServices/kommonitorDataGridHelperService/kommonitor-data-grid-helper-service.module.js +++ b/app/util/genericServices/kommonitorDataGridHelperService/kommonitor-data-grid-helper-service.module.js @@ -1,3017 +1,2605 @@ +"use strict"; angular.module('kommonitorDataGridHelper', ['kommonitorDataExchange']); - angular - .module('kommonitorDataGridHelper', []) - .service( - 'kommonitorDataGridHelperService', ['kommonitorDataExchangeService', '$rootScope', '$timeout', '$http', '$httpParamSerializerJQLike', '__env', - function (kommonitorDataExchangeService, $rootScope, $timeout, - $http, $httpParamSerializerJQLike, __env) { - - var self = this; - this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; - - this.resourceType_georesource = "georesource"; - this.resourceType_spatialUnit = "spatialUnit"; - this.resourceType_indicator = "indicator"; - - this.featureTable_spatialUnit_lastUpdate_timestamp_success = undefined; - this.featureTable_spatialUnit_lastUpdate_timestamp_failure = undefined; - this.featureTable_georesource_lastUpdate_timestamp_success = undefined; - this.featureTable_georesource_lastUpdate_timestamp_failure = undefined; - this.featureTable_indicator_lastUpdate_timestamp_success = undefined; - this.featureTable_indicator_lastUpdate_timestamp_failure = undefined; - - this.dataGridOptions_indicators; - this.dataGridOptions_georesources_poi; - this.dataGridOptions_georesources_loi; - this.dataGridOptions_georesources_aoi; - this.dataGridOptions_spatialUnits; - this.dataGridOptions_accessControl; - - function getCurrentTimestampString(){ - let date = new Date(); - let hours = date.getHours(); - if(hours < 10){ - hours = "0" + hours; - } - let minutes = date.getMinutes(); - if(minutes < 10){ - minutes = "0" + minutes; - } - let seconds = date.getSeconds(); - if(seconds < 10){ - seconds = "0" + seconds; - } - return "" + hours + ":" + minutes + ":" + seconds; - } - - function headerHeightGetter() { - var columnHeaderTexts = [ - ...document.querySelectorAll('.ag-header-cell-text'), - ]; - var clientHeights = columnHeaderTexts.map( - headerText => headerText.clientHeight - ); - var tallestHeaderTextHeight = Math.max(...clientHeights); - - return tallestHeaderTextHeight; - } - - function headerHeightSetter(gridOptions) { - var padding = 20; - var height = headerHeightGetter() + padding; - gridOptions.api.setHeaderHeight(height); - } - - var displayEditButtons_indicators = function (params) { - let disabledEditButtons = !params.data.userPermissions.includes("editor") - let editMetadataButtonId = 'btn_georesource_editMetadata_' + params.data.indicatorId; - let editFeaturesButtonId = 'btn_georesource_editFeatures_' + params.data.indicatorId; - - let html = '
        '; - html += ''; - html += ''; - - if(!disabledEditButtons){ - html = html.replaceAll("disabled", "") //enabled - } - - if (kommonitorDataExchangeService.enableKeycloakSecurity) { - // disable button if there is no applicable spatial unit or user has no creator rights - let disabled = params.data.applicableSpatialUnits.length == 0 || !params.data.userPermissions.includes("editor"); - html += ''; - html += ''; - html += '' - html += '
        '; - - return html; - }; - - var displayEditButtons_spatialUnits = function (params) { - - let html = '
        '; - html += ''; - html += ''; - html += '' - html += '
        '; - - return html; - }; - - var displayEditButtons_accessControl = function (params) { - - let html = '
        '; - html += ''; - html += '
        '; - - return html; - }; - - function getDatePicker() { - // function to act as a class - function Datepicker() {} - - // gets called once before the renderer is used - Datepicker.prototype.init = function (params) { - // create the cell - this.eInput = document.createElement('input'); - this.eInput.value = params.value; - this.eInput.classList.add('ag-input'); - this.eInput.style.height = '100%'; - - // https://jqueryui.com/datepicker/ - // $(this.eInput).datepicker({ - // dateFormat: 'yyyy-mm-dd', - // }); - $(this.eInput).datepicker(kommonitorDataExchangeService.datePickerOptions); - - }; - - // gets called once when grid ready to insert the element - Datepicker.prototype.getGui = function () { - return this.eInput; - }; - - // focus and select can be done after the gui is attached - Datepicker.prototype.afterGuiAttached = function () { - this.eInput.focus(); - this.eInput.select(); - }; - - // returns the new value after editing - Datepicker.prototype.getValue = function () { - return this.eInput.value; - }; - - // any cleanup we need to be done here - Datepicker.prototype.destroy = () => { - // but this example is simple, no cleanup, we could - // even leave this method out as it's optional - }; - - // if true, then this editor will appear in a popup - Datepicker.prototype.isPopup = () => { - // and we could leave this method out also, false is the default - return false; - }; - - return Datepicker; - } - - this.buildDataGridColumnConfig_indicators = function (indicatorMetadataArray) { - const columnDefs = [ - { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, filter: false, sortable: false, cellRenderer: 'displayEditButtons_indicators' }, - { headerName: 'Id', field: "indicatorId", pinned: 'left', maxWidth: 125 }, - { headerName: 'Name', field: "indicatorName", pinned: 'left', minWidth: 300 }, - { headerName: 'Einheit', field: "unit", minWidth: 200 }, - { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.description; - } - }, - { - headerName: 'Methodik', minWidth: 400, - cellRenderer: function (params) { - - if(params.data.processDescription && params.data.processDescription.includes("$$")){ - let splitArray = params.data.processDescription.split("$$"); - - for (let index = 0; index < splitArray.length; index++) { - if((index % 2) == 0){ - params.data.processDescription += "
        "; - } - } - } - return params.data.processDescription; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.processDescription; - } - }, - { - headerName: 'Verfügbare Raumeinheiten', field: "applicableSpatialUnits", minWidth: 400, - cellRenderer: function (params) { - /* -
          -
        • - {{::applicableSpatialUnit.spatialUnitName}} -
        • -
        - */ - let html = '
          '; - for (const applicableSpatialUnit of params.data.applicableSpatialUnits) { - html += '
        • '; - html += applicableSpatialUnit.spatialUnitName; - html += '
        • '; - } - html += '
        '; - return html; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if (params.data.applicableSpatialUnits && params.data.applicableSpatialUnits.length > 1){ - return "" + JSON.stringify(params.data.applicableSpatialUnits); - } - return params.data.applicableSpatialUnits; - } - }, - { - headerName: 'Verfügbare Zeitschnitte', field: "applicableDates", minWidth: 400, - cellRenderer: function (params) { - /* -
          -
        • - {{::timestamp}} -
        • -
        - */ - let html = '
          '; - for (const timestamp of params.data.applicableDates) { - html += '
        • '; - html += timestamp; - html += '
        • '; - } - html += '
        '; - return html; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if (params.data.applicableDates && params.data.applicableDates.length > 1){ - return "" + JSON.stringify(params.data.applicableDates); - } - return params.data.applicableDates; + .module('kommonitorDataGridHelper', []) + .service('kommonitorDataGridHelperService', ['kommonitorDataExchangeService', '$rootScope', '$timeout', '$http', '$httpParamSerializerJQLike', '__env', + function (kommonitorDataExchangeService, $rootScope, $timeout, $http, $httpParamSerializerJQLike, __env) { + var self = this; + this.kommonitorDataExchangeServiceInstance = kommonitorDataExchangeService; + this.resourceType_georesource = "georesource"; + this.resourceType_spatialUnit = "spatialUnit"; + this.resourceType_indicator = "indicator"; + this.featureTable_spatialUnit_lastUpdate_timestamp_success = undefined; + this.featureTable_spatialUnit_lastUpdate_timestamp_failure = undefined; + this.featureTable_georesource_lastUpdate_timestamp_success = undefined; + this.featureTable_georesource_lastUpdate_timestamp_failure = undefined; + this.featureTable_indicator_lastUpdate_timestamp_success = undefined; + this.featureTable_indicator_lastUpdate_timestamp_failure = undefined; + this.dataGridOptions_indicators; + this.dataGridOptions_georesources_poi; + this.dataGridOptions_georesources_loi; + this.dataGridOptions_georesources_aoi; + this.dataGridOptions_spatialUnits; + this.dataGridOptions_accessControl; + function getCurrentTimestampString() { + let date = new Date(); + let hours = date.getHours(); + if (hours < 10) { + hours = "0" + hours; } - }, - { headerName: 'Kürzel', field: "abbreviation" }, - { headerName: 'Leitindikator', field: "isHeadlineIndicator" }, - { headerName: 'Indikator-Typ', minWidth: 200, - cellRenderer: function (params) { return kommonitorDataExchangeService.getIndicatorStringFromIndicatorType(params.data.indicatorType); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getIndicatorStringFromIndicatorType(params.data.indicatorType); - } - }, - { headerName: 'Merkmal', field: "characteristicValue", minWidth: 200 }, - { headerName: 'Art der Fortführung', field: "creationType", minWidth: 200 }, - // { headerName: 'Interpretation', minWidth: 400, cellRenderer: function(params){ return params.data.interpretation; } }, - - { headerName: 'Tags/Stichworte', field: "tags", minWidth: 250 }, - { headerName: 'Themenhierarchie', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); + let minutes = date.getMinutes(); + if (minutes < 10) { + minutes = "0" + minutes; } - }, - { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.datasource; + let seconds = date.getSeconds(); + if (seconds < 10) { + seconds = "0" + seconds; } - }, - { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.contact; + return "" + hours + ":" + minutes + ":" + seconds; + } + function headerHeightGetter() { + var columnHeaderTexts = [ + ...document.querySelectorAll('.ag-header-cell-text'), + ]; + var clientHeights = columnHeaderTexts.map(headerText => headerText.clientHeight); + var tallestHeaderTextHeight = Math.max(...clientHeights); + return tallestHeaderTextHeight; + } + function headerHeightSetter(gridOptions) { + var padding = 20; + var height = headerHeightGetter() + padding; + gridOptions.api.setHeaderHeight(height); + } + var displayEditButtons_indicators = function (params) { + let disabledEditButtons = !params.data.userPermissions.includes("editor"); + let editMetadataButtonId = 'btn_georesource_editMetadata_' + params.data.indicatorId; + let editFeaturesButtonId = 'btn_georesource_editFeatures_' + params.data.indicatorId; + let html = '
        '; + html += ''; + html += ''; + if (!disabledEditButtons) { + html = html.replaceAll("disabled", ""); //enabled } - }, - { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); - } - } - ]; - - return columnDefs; - }; - - this.buildDataGridRowData_indicators = function (indicatorMetadataArray) { - return indicatorMetadataArray; - }; - - - this.buildDataGridColumnConfig_georesources_poi = function (georesourceMetadataArray) { - const columnDefs = [ - { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, - headerCheckboxSelection: false, - headerCheckboxSelectionFilteredOnly: true, - filter: false, - sortable: false, cellRenderer: 'displayEditButtons_georesources' }, - { headerName: 'Id', field: "georesourceId", pinned: 'left', maxWidth: 125 }, - { headerName: 'Name', field: "datasetName", pinned: 'left', minWidth: 300 }, - { headerName: 'Symbolfarbe', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + params.data.poiSymbolColor+ "

        "; } }, - { headerName: 'Symbolname', maxWidth: 125, - cellRenderer: function (params) { return params.data.poiSymbolBootstrap3Name + "

        "; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.poiSymbolBootstrap3Name; - } - }, - { headerName: 'Markerfarbe', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + params.data.poiMarkerColor+ "

        "; } }, - { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.description; + if (kommonitorDataExchangeService.enableKeycloakSecurity) { + // disable button if there is no applicable spatial unit or user has no creator rights + let disabled = params.data.applicableSpatialUnits.length == 0 || !params.data.userPermissions.includes("editor"); + html += '
        '; + return html; + }; + var displayEditButtons_georesources = function (params) { + let editMetadataButtonId = 'btn_georesource_editMetadata_' + params.data.georesourceId; + let editFeaturesButtonId = 'btn_georesource_editFeatures_' + params.data.georesourceId; + let html = '
        '; + html += ''; + html += ''; + html += ''; + html += '
        '; + return html; + }; + var displayEditButtons_spatialUnits = function (params) { + let html = '
        '; + html += ''; + html += ''; + html += ''; + html += '
        '; + return html; + }; + var displayEditButtons_accessControl = function (params) { + let html = '
        '; + html += ''; + html += '
        '; + return html; + }; + function getDatePicker() { + // function to act as a class + function Datepicker() { } + // gets called once before the renderer is used + Datepicker.prototype.init = function (params) { + // create the cell + this.eInput = document.createElement('input'); + this.eInput.value = params.value; + this.eInput.classList.add('ag-input'); + this.eInput.style.height = '100%'; + // https://jqueryui.com/datepicker/ + // $(this.eInput).datepicker({ + // dateFormat: 'yyyy-mm-dd', + // }); + $(this.eInput).datepicker(kommonitorDataExchangeService.datePickerOptions); + }; + // gets called once when grid ready to insert the element + Datepicker.prototype.getGui = function () { + return this.eInput; + }; + // focus and select can be done after the gui is attached + Datepicker.prototype.afterGuiAttached = function () { + this.eInput.focus(); + this.eInput.select(); + }; + // returns the new value after editing + Datepicker.prototype.getValue = function () { + return this.eInput.value; + }; + // any cleanup we need to be done here + Datepicker.prototype.destroy = () => { + // but this example is simple, no cleanup, we could + // even leave this method out as it's optional + }; + // if true, then this editor will appear in a popup + Datepicker.prototype.isPopup = () => { + // and we could leave this method out also, false is the default + return false; + }; + return Datepicker; + } + this.buildDataGridColumnConfig_indicators = function (indicatorMetadataArray) { + const columnDefs = [ + { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, filter: false, sortable: false, cellRenderer: 'displayEditButtons_indicators' }, + { headerName: 'Id', field: "indicatorId", pinned: 'left', maxWidth: 125 }, + { headerName: 'Name', field: "indicatorName", pinned: 'left', minWidth: 300 }, + { headerName: 'Einheit', field: "unit", minWidth: 200 }, + { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.description; + } + }, + { + headerName: 'Methodik', minWidth: 400, + cellRenderer: function (params) { + if (params.data.processDescription && params.data.processDescription.includes("$$")) { + let splitArray = params.data.processDescription.split("$$"); + for (let index = 0; index < splitArray.length; index++) { + if ((index % 2) == 0) { + params.data.processDescription += "
        "; + } + } + } + return params.data.processDescription; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.processDescription; + } + }, + { + headerName: 'Verfügbare Raumeinheiten', field: "applicableSpatialUnits", minWidth: 400, + cellRenderer: function (params) { + /* +
          +
        • + {{::applicableSpatialUnit.spatialUnitName}} +
        • +
        + */ + let html = '
          '; + for (const applicableSpatialUnit of params.data.applicableSpatialUnits) { + html += '
        • '; + html += applicableSpatialUnit.spatialUnitName; + html += '
        • '; + } + html += '
        '; + return html; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data.applicableSpatialUnits && params.data.applicableSpatialUnits.length > 1) { + return "" + JSON.stringify(params.data.applicableSpatialUnits); + } + return params.data.applicableSpatialUnits; + } + }, + { + headerName: 'Verfügbare Zeitschnitte', field: "applicableDates", minWidth: 400, + cellRenderer: function (params) { + /* +
          +
        • + {{::timestamp}} +
        • +
        + */ + let html = '
          '; + for (const timestamp of params.data.applicableDates) { + html += '
        • '; + html += timestamp; + html += '
        • '; + } + html += '
        '; + return html; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data.applicableDates && params.data.applicableDates.length > 1) { + return "" + JSON.stringify(params.data.applicableDates); + } + return params.data.applicableDates; + } + }, + { headerName: 'Kürzel', field: "abbreviation" }, + { headerName: 'Leitindikator', field: "isHeadlineIndicator" }, + { headerName: 'Indikator-Typ', minWidth: 200, + cellRenderer: function (params) { return kommonitorDataExchangeService.getIndicatorStringFromIndicatorType(params.data.indicatorType); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getIndicatorStringFromIndicatorType(params.data.indicatorType); + } + }, + { headerName: 'Merkmal', field: "characteristicValue", minWidth: 200 }, + { headerName: 'Art der Fortführung', field: "creationType", minWidth: 200 }, + // { headerName: 'Interpretation', minWidth: 400, cellRenderer: function(params){ return params.data.interpretation; } }, + { headerName: 'Tags/Stichworte', field: "tags", minWidth: 250 }, + { headerName: 'Themenhierarchie', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); + } + }, + { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.datasource; + } + }, + { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.contact; + } + }, + { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); + } + } + ]; + return columnDefs; + }; + this.buildDataGridRowData_indicators = function (indicatorMetadataArray) { + return indicatorMetadataArray; + }; + this.buildDataGridColumnConfig_georesources_poi = function (georesourceMetadataArray) { + const columnDefs = [ + { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, + headerCheckboxSelection: false, + headerCheckboxSelectionFilteredOnly: true, + filter: false, + sortable: false, cellRenderer: 'displayEditButtons_georesources' }, + { headerName: 'Id', field: "georesourceId", pinned: 'left', maxWidth: 125 }, + { headerName: 'Name', field: "datasetName", pinned: 'left', minWidth: 300 }, + { headerName: 'Symbolfarbe', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + params.data.poiSymbolColor + "

        "; } }, + { headerName: 'Symbolname', maxWidth: 125, + cellRenderer: function (params) { return params.data.poiSymbolBootstrap3Name + "

        "; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.poiSymbolBootstrap3Name; + } + }, + { headerName: 'Markerfarbe', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + params.data.poiMarkerColor + "

        "; } }, + { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.description; + } + }, + { + headerName: 'Gültigkeitszeitraum', minWidth: 400, + cellRenderer: function (params) { + /* +
          +
        • +

          {{::periodOfValidity.startDate}} - {{::periodOfValidity.endDate}}

          +

          {{::periodOfValidity.startDate}} - heute

          +
        • +
        + */ + let html = '
          '; + for (const periodOfValidity of params.data.availablePeriodsOfValidity) { + html += '
        • '; + if (periodOfValidity.endDate) { + html += "

          " + periodOfValidity.startDate + " ‐ " + periodOfValidity.endDate + "

          "; + } + else { + html += "

          " + periodOfValidity.startDate + " ‐ heute

          "; + } + html += '
        • '; + } + html += '
        '; + return html; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data.availablePeriodsOfValidity && params.data.availablePeriodsOfValidity.length > 1) { + return "" + JSON.stringify(params.data.availablePeriodsOfValidity); + } + return params.data.availablePeriodsOfValidity; + } + }, + { headerName: 'Themenhierarchie', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); + } + }, + { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.datasource; + } + }, + { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.contact; + } + }, + { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); + } + } + ]; + return columnDefs; + }; + this.buildDataGridColumnConfig_georesources_loi = function (georesourceMetadataArray) { + const columnDefs = [ + { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, headerCheckboxSelection: false, + headerCheckboxSelectionFilteredOnly: true, filter: false, sortable: false, cellRenderer: 'displayEditButtons_georesources' }, + { headerName: 'Id', field: "georesourceId", pinned: 'left', maxWidth: 125 }, + { headerName: 'Name', field: "datasetName", pinned: 'left', minWidth: 300 }, + { headerName: 'Linienfarbe', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + params.data.loiColor + "

        "; } }, + { headerName: 'Linienbreite', maxWidth: 125, field: "loiWidth" }, + { headerName: 'Linienmuster', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + kommonitorDataExchangeService.getLoiDashSvgFromStringValue(params.data.loiDashArrayString) + "
        "; } }, + { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.description; + } + }, + { + headerName: 'Gültigkeitszeitraum', minWidth: 400, + cellRenderer: function (params) { + /* +
          +
        • +

          {{::periodOfValidity.startDate}} - {{::periodOfValidity.endDate}}

          +

          {{::periodOfValidity.startDate}} - heute

          +
        • +
        + */ + let html = '
          '; + for (const periodOfValidity of params.data.availablePeriodsOfValidity) { + html += '
        • '; + if (periodOfValidity.endDate) { + html += "

          " + periodOfValidity.startDate + " ‐ " + periodOfValidity.endDate + "

          "; + } + else { + html += "

          " + periodOfValidity.startDate + " ‐ heute

          "; + } + html += '
        • '; + } + html += '
        '; + return html; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data.availablePeriodsOfValidity && params.data.availablePeriodsOfValidity.length > 1) { + return "" + JSON.stringify(params.data.availablePeriodsOfValidity); + } + return params.data.availablePeriodsOfValidity; + } + }, + { headerName: 'Themenhierarchie', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); + } + }, + { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.datasource; + } + }, + { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.contact; + } + }, + { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); + } + } + ]; + return columnDefs; + }; + this.buildDataGridColumnConfig_georesources_aoi = function (georesourceMetadataArray) { + const columnDefs = [ + { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, headerCheckboxSelection: false, + headerCheckboxSelectionFilteredOnly: true, filter: false, sortable: false, cellRenderer: 'displayEditButtons_georesources' }, + { headerName: 'Id', field: "georesourceId", pinned: 'left', maxWidth: 125 }, + { headerName: 'Name', field: "datasetName", pinned: 'left', minWidth: 300 }, + { headerName: 'Polygonfarbe', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + params.data.aoiColor + "

        "; } }, + { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.description; + } + }, + { + headerName: 'Gültigkeitszeitraum', minWidth: 400, + cellRenderer: function (params) { + /* +
          +
        • +

          {{::periodOfValidity.startDate}} - {{::periodOfValidity.endDate}}

          +

          {{::periodOfValidity.startDate}} - heute

          +
        • +
        + */ + let html = '
          '; + for (const periodOfValidity of params.data.availablePeriodsOfValidity) { + html += '
        • '; + if (periodOfValidity.endDate) { + html += "

          " + periodOfValidity.startDate + " ‐ " + periodOfValidity.endDate + "

          "; + } + else { + html += "

          " + periodOfValidity.startDate + " ‐ heute

          "; + } + html += '
        • '; + } + html += '
        '; + return html; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data.availablePeriodsOfValidity && params.data.availablePeriodsOfValidity.length > 1) { + return "" + JSON.stringify(params.data.availablePeriodsOfValidity); + } + return params.data.availablePeriodsOfValidity; + } + }, + { headerName: 'Themenhierarchie', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); + } + }, + { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.datasource; + } + }, + { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.contact; + } + }, + { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); + } + } + ]; + return columnDefs; + }; + this.buildDataGridRowData_georesources_poi = function (georesourceMetadataArray) { + return georesourceMetadataArray.filter(georesourceMetadata => georesourceMetadata.isPOI); + }; + this.buildDataGridRowData_georesources_loi = function (georesourceMetadataArray) { + return georesourceMetadataArray.filter(georesourceMetadata => georesourceMetadata.isLOI); + }; + this.buildDataGridRowData_georesources_aoi = function (georesourceMetadataArray) { + return georesourceMetadataArray.filter(georesourceMetadata => georesourceMetadata.isAOI); + }; + this.getSelectedGeoresourcesMetadata = function () { + let georesourceMetadataArray = []; + //POI + if (this.dataGridOptions_georesources_poi && this.dataGridOptions_georesources_poi.api) { + let selectedPoiNodes = this.dataGridOptions_georesources_poi.api.getSelectedNodes(); + for (const selectedPoiNode of selectedPoiNodes) { + georesourceMetadataArray.push(selectedPoiNode.data); } - else{ - html += "

        " + periodOfValidity.startDate + " ‐ heute

        "; - } - html += ''; - } - html += ''; - return html; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if (params.data.availablePeriodsOfValidity && params.data.availablePeriodsOfValidity.length > 1){ - return "" + JSON.stringify(params.data.availablePeriodsOfValidity); - } - return params.data.availablePeriodsOfValidity; } - }, - { headerName: 'Themenhierarchie', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); + //LOI + if (this.dataGridOptions_georesources_loi && this.dataGridOptions_georesources_loi.api) { + let selectedLoiNodes = this.dataGridOptions_georesources_loi.api.getSelectedNodes(); + for (const selectedLoiNode of selectedLoiNodes) { + georesourceMetadataArray.push(selectedLoiNode.data); + } } - }, - { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.datasource; + //AOI + if (this.dataGridOptions_georesources_aoi && this.dataGridOptions_georesources_aoi.api) { + let selectedAoiNodes = this.dataGridOptions_georesources_aoi.api.getSelectedNodes(); + for (const selectedAoiNode of selectedAoiNodes) { + georesourceMetadataArray.push(selectedAoiNode.data); + } } - }, - { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.contact; + return georesourceMetadataArray; + }; + this.buildDataGridRowData_spatialUnits = function (spatialUnitMetadataArray) { + return spatialUnitMetadataArray; + }; + this.buildDataGridColumnConfig_spatialUnits = function (spatialUnitMetadataArray) { + const columnDefs = [ + { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, headerCheckboxSelection: false, + headerCheckboxSelectionFilteredOnly: true, filter: false, sortable: false, cellRenderer: 'displayEditButtons_spatialUnits' }, + { headerName: 'Id', field: "spatialUnitId", pinned: 'left', maxWidth: 125 }, + { headerName: 'Name', field: "spatialUnitLevel", pinned: 'left', minWidth: 300 }, + { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.description; + } + }, + { headerName: 'Nächst niedrigere Raumebene', field: "nextLowerHierarchyLevel", minWidth: 250 }, + { headerName: 'Nächst höhere Raumebene', field: "nextUpperHierarchyLevel", minWidth: 250 }, + { + headerName: 'Gültigkeitszeitraum', minWidth: 400, + cellRenderer: function (params) { + /* +
          +
        • +

          {{::periodOfValidity.startDate}} - {{::periodOfValidity.endDate}}

          +

          {{::periodOfValidity.startDate}} - heute

          +
        • +
        + */ + let html = '
          '; + for (const periodOfValidity of params.data.availablePeriodsOfValidity) { + html += '
        • '; + if (periodOfValidity.endDate) { + html += "

          " + periodOfValidity.startDate + " ‐ " + periodOfValidity.endDate + "

          "; + } + else { + html += "

          " + periodOfValidity.startDate + " ‐ heute

          "; + } + html += '
        • '; + } + html += '
        '; + return html; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data.availablePeriodsOfValidity && params.data.availablePeriodsOfValidity.length > 1) { + return "" + JSON.stringify(params.data.availablePeriodsOfValidity); + } + return params.data.availablePeriodsOfValidity; + } + }, + { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.datasource; + } + }, + { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + params.data.metadata.contact; + } + }, + { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); + } + } + ]; + return columnDefs; + }; + this.getSelectedSpatialUnitsMetadata = function () { + let spatialUnitsMetadataArray = []; + if (this.dataGridOptions_spatialUnits && this.dataGridOptions_spatialUnits.api) { + let selectedNodes = this.dataGridOptions_spatialUnits.api.getSelectedNodes(); + for (const selectedNode of selectedNodes) { + spatialUnitsMetadataArray.push(selectedNode.data); + } } - }, - { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); - } - } - ]; - - return columnDefs; - }; - - this.buildDataGridColumnConfig_georesources_loi = function (georesourceMetadataArray) { - const columnDefs = [ - { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, headerCheckboxSelection: false, - headerCheckboxSelectionFilteredOnly: true, filter: false, sortable: false, cellRenderer: 'displayEditButtons_georesources' }, - { headerName: 'Id', field: "georesourceId", pinned: 'left', maxWidth: 125 }, - { headerName: 'Name', field: "datasetName", pinned: 'left', minWidth: 300 }, - { headerName: 'Linienfarbe', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + params.data.loiColor+ "

        "; } }, - { headerName: 'Linienbreite', maxWidth: 125, field: "loiWidth"}, - { headerName: 'Linienmuster', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + kommonitorDataExchangeService.getLoiDashSvgFromStringValue(params.data.loiDashArrayString) + "
        "; } }, - { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.description; + return spatialUnitsMetadataArray; + }; + this.getSelectedAccessControlMetadata = function () { + let accessControlMetadataArray = []; + if (this.dataGridOptions_accessControl && this.dataGridOptions_accessControl.api) { + let selectedNodes = this.dataGridOptions_accessControl.api.getSelectedNodes(); + for (const selectedNode of selectedNodes) { + accessControlMetadataArray.push(selectedNode.data); + } } - }, - { - headerName: 'Gültigkeitszeitraum', minWidth: 400, - cellRenderer: function (params) { - /* -
          -
        • -

          {{::periodOfValidity.startDate}} - {{::periodOfValidity.endDate}}

          -

          {{::periodOfValidity.startDate}} - heute

          -
        • -
        - */ - let html = '
          '; - for (const periodOfValidity of params.data.availablePeriodsOfValidity) { - html += '
        • '; - - if(periodOfValidity.endDate){ - html += "

          " + periodOfValidity.startDate + " ‐ " + periodOfValidity.endDate + "

          " ; + return accessControlMetadataArray; + }; + this.getSelectedScriptsMetadata = function () { + let scriptsMetadataArray = []; + if (this.dataGridOptions_scripts && this.dataGridOptions_scripts.api) { + let selectedNodes = this.dataGridOptions_scripts.api.getSelectedNodes(); + for (const selectedNode of selectedNodes) { + scriptsMetadataArray.push(selectedNode.data); } - else{ - html += "

          " + periodOfValidity.startDate + " ‐ heute

          "; - } - html += '
        • '; - } - html += '
        '; - return html; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if (params.data.availablePeriodsOfValidity && params.data.availablePeriodsOfValidity.length > 1){ - return "" + JSON.stringify(params.data.availablePeriodsOfValidity); - } - return params.data.availablePeriodsOfValidity; } - }, - { headerName: 'Themenhierarchie', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); + return scriptsMetadataArray; + }; + this.buildDataGridOptions_indicators = function (indicatorMetadataArray) { + let columnDefs = this.buildDataGridColumnConfig_indicators(indicatorMetadataArray); + let rowData = this.buildDataGridRowData_indicators(indicatorMetadataArray); + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + components: { + displayEditButtons_indicators: displayEditButtons_indicators + }, + columnDefs: columnDefs, + rowData: rowData, + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + // rowHeight: 200, + onGridReady: function () { + // self.registerClickHandler_indicators(indicatorMetadataArray); + }, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_indicators); + // self.registerClickHandler_indicators(indicatorMetadataArray); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_indicators); + // self.registerClickHandler_indicators(indicatorMetadataArray); + }, + onModelUpdated: function () { + self.registerClickHandler_indicators(indicatorMetadataArray); + }, + onRowDataChanged: function () { + self.registerClickHandler_indicators(indicatorMetadataArray); + }, + // onPaginationChanged: function () { + // self.registerClickHandler_indicators(indicatorMetadataArray); + // }, + onViewportChanged: function () { + self.registerClickHandler_indicators(indicatorMetadataArray); + setTimeout(function () { + let domNode = document.querySelector('#indicatorOverviewTable'); + // if (domNode) { + // MathJax.typesetPromise(); + // } + MathJax.typesetPromise().then(function () { + // setTimeout(function () { + // self.dataGridOptions_indicators.api.resetRowHeights(); + // }, 1000); + // self.dataGridOptions_indicators.api.resetRowHeights(); + }); + // setTimeout(function () { + // self.dataGridOptions_indicators.api.resetRowHeights(); + // }, 1000); + }, 250); + }, + }; + return gridOptions; + }; + this.registerClickHandler_indicators = function (indicatorMetadataArray) { + // for (const indicatorMetadata of indicatorMetadataArray) { + // $( "#btn_indicator_editMetadata_" + indicatorMetadata.indicatorId).click(function() { + // let indicatorId = this.id.split("_")[3]; + // let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); + // $rootScope.$broadcast("onEditIndicatorMetadata", indicatorMetadata); + // }); + // } + //first unbind previous click events + $(".indicatorEditMetadataBtn").off(); + $(".indicatorEditMetadataBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let indicatorId = this.id.split("_")[3]; + let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); + $rootScope.$broadcast("onEditIndicatorMetadata", indicatorMetadata); + }); + //first unbind previous click events + $(".indicatorEditFeaturesBtn").off(); + $(".indicatorEditFeaturesBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let indicatorId = this.id.split("_")[3]; + let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); + $rootScope.$broadcast("onEditIndicatorFeatures", indicatorMetadata); + }); + $(".indicatorEditRoleBasedAccessBtn").off(); + $(".indicatorEditRoleBasedAccessBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let indicatorId = this.id.split("_")[3]; + let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); + $rootScope.$broadcast("onEditIndicatorSpatialUnitRoles", indicatorMetadata); + }); + }; + this.registerClickHandler_georesources = function (georesourceMetadataArray) { + $(".georesourceEditMetadataBtn").off(); + $(".georesourceEditMetadataBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let georesourceId = this.id.split("_")[3]; + let georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceId); + $rootScope.$broadcast("onEditGeoresourceMetadata", georesourceMetadata); + }); + $(".georesourceEditFeaturesBtn").off(); + $(".georesourceEditFeaturesBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let georesourceId = this.id.split("_")[3]; + let georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceId); + $rootScope.$broadcast("onEditGeoresourceFeatures", georesourceMetadata); + }); + $(".georesourceDeleteBtn").off(); + $(".georesourceDeleteBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let spatialUnitId = this.id.split("_")[3]; + let spatialUnitMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(spatialUnitId); + $rootScope.$broadcast("onDeleteGeoresources", [spatialUnitMetadata]); //handler function takes an array + }); + }; + this.buildDataGrid_indicators = function (indicatorMetadataArray) { + if (this.dataGridOptions_indicators && this.dataGridOptions_indicators.api && document.querySelector('#indicatorOverviewTable').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_indicators); + let newRowData = this.buildDataGridRowData_indicators(indicatorMetadataArray); + this.dataGridOptions_indicators.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_indicators); } - }, - { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.datasource; + else { + this.dataGridOptions_indicators = this.buildDataGridOptions_indicators(indicatorMetadataArray); + let gridDiv = document.querySelector('#indicatorOverviewTable'); + new agGrid.Grid(gridDiv, this.dataGridOptions_indicators); } - }, - { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.contact; + }; + this.buildDataGridOptions_georesources_poi = function (georesourceMetadataArray) { + let columnDefs = this.buildDataGridColumnConfig_georesources_poi(georesourceMetadataArray); + let rowData = this.buildDataGridRowData_georesources_poi(georesourceMetadataArray); + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + components: { + displayEditButtons_georesources: displayEditButtons_georesources + }, + columnDefs: columnDefs, + rowData: rowData, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_georesources_poi); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_georesources_poi); + }, + onRowDataChanged: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + onModelUpdated: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + onViewportChanged: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + }; + return gridOptions; + }; + this.buildDataGridOptions_georesources_loi = function (georesourceMetadataArray) { + let columnDefs = this.buildDataGridColumnConfig_georesources_loi(georesourceMetadataArray); + let rowData = this.buildDataGridRowData_georesources_loi(georesourceMetadataArray); + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + components: { + displayEditButtons_georesources: displayEditButtons_georesources + }, + columnDefs: columnDefs, + rowData: rowData, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_georesources_loi); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_georesources_loi); + }, + onRowDataChanged: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + onModelUpdated: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + onViewportChanged: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + }; + return gridOptions; + }; + this.buildDataGridOptions_georesources_aoi = function (georesourceMetadataArray) { + let columnDefs = this.buildDataGridColumnConfig_georesources_aoi(georesourceMetadataArray); + let rowData = this.buildDataGridRowData_georesources_aoi(georesourceMetadataArray); + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + components: { + displayEditButtons_georesources: displayEditButtons_georesources + }, + columnDefs: columnDefs, + rowData: rowData, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_georesources_aoi); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_georesources_aoi); + }, + onRowDataChanged: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + onModelUpdated: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + onViewportChanged: function () { + self.registerClickHandler_georesources(georesourceMetadataArray); + }, + }; + return gridOptions; + }; + this.buildDataGridOptions_spatialUnits = function (spatialUnitMetadataArray) { + let columnDefs = this.buildDataGridColumnConfig_spatialUnits(spatialUnitMetadataArray); + let rowData = this.buildDataGridRowData_spatialUnits(spatialUnitMetadataArray); + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + components: { + displayEditButtons_spatialUnits: displayEditButtons_spatialUnits + }, + columnDefs: columnDefs, + rowData: rowData, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_spatialUnits); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_spatialUnits); + }, + onRowDataChanged: function () { + self.registerClickHandler_spatialUnits(spatialUnitMetadataArray); + }, + onModelUpdated: function () { + self.registerClickHandler_spatialUnits(spatialUnitMetadataArray); + }, + onViewportChanged: function () { + self.registerClickHandler_spatialUnits(spatialUnitMetadataArray); + }, + }; + return gridOptions; + }; + this.registerClickHandler_spatialUnits = function (spatialUnitMetadataArray) { + $(".spatialUnitEditMetadataBtn").off(); + $(".spatialUnitEditMetadataBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let spatialUnitId = this.id.split("_")[3]; + let spatialUnitMetadata = kommonitorDataExchangeService.getSpatialUnitMetadataById(spatialUnitId); + $rootScope.$broadcast("onEditSpatialUnitMetadata", spatialUnitMetadata); + }); + $(".spatialUnitEditFeaturesBtn").off(); + $(".spatialUnitEditFeaturesBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let spatialUnitId = this.id.split("_")[3]; + let spatialUnitMetadata = kommonitorDataExchangeService.getSpatialUnitMetadataById(spatialUnitId); + $rootScope.$broadcast("onEditSpatialUnitFeatures", spatialUnitMetadata); + }); + $(".spatialUnitDeleteBtn").off(); + $(".spatialUnitDeleteBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let spatialUnitId = this.id.split("_")[3]; + let spatialUnitMetadata = kommonitorDataExchangeService.getSpatialUnitMetadataById(spatialUnitId); + $rootScope.$broadcast("onDeleteSpatialUnits", [spatialUnitMetadata]); //handler function takes an array + }); + }; + this.buildDataGrid_georesources = function (georesourceMetadataArray) { + // POI + if (this.dataGridOptions_georesources_poi && this.dataGridOptions_georesources_poi.api && document.querySelector('#poiOverviewTable').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_georesources_poi); + let newRowData = this.buildDataGridRowData_georesources_poi(georesourceMetadataArray); + this.dataGridOptions_georesources_poi.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_georesources_poi); } - }, - { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); - } - } - ]; - - return columnDefs; - }; - - this.buildDataGridColumnConfig_georesources_aoi = function (georesourceMetadataArray) { - const columnDefs = [ - { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, headerCheckboxSelection: false, - headerCheckboxSelectionFilteredOnly: true, filter: false, sortable: false, cellRenderer: 'displayEditButtons_georesources' }, - { headerName: 'Id', field: "georesourceId", pinned: 'left', maxWidth: 125 }, - { headerName: 'Name', field: "datasetName", pinned: 'left', minWidth: 300 }, - { headerName: 'Polygonfarbe', filter: false, sortable: false, maxWidth: 125, cellRenderer: function (params) { return "
        " + params.data.aoiColor+ "

        "; } }, - { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.description; + else { + this.dataGridOptions_georesources_poi = this.buildDataGridOptions_georesources_poi(georesourceMetadataArray); + let gridDiv = document.querySelector('#poiOverviewTable'); + new agGrid.Grid(gridDiv, this.dataGridOptions_georesources_poi); } - }, - { - headerName: 'Gültigkeitszeitraum', minWidth: 400, - cellRenderer: function (params) { - /* -
          -
        • -

          {{::periodOfValidity.startDate}} - {{::periodOfValidity.endDate}}

          -

          {{::periodOfValidity.startDate}} - heute

          -
        • -
        - */ - let html = '
          '; - for (const periodOfValidity of params.data.availablePeriodsOfValidity) { - html += '
        • '; - - if(periodOfValidity.endDate){ - html += "

          " + periodOfValidity.startDate + " ‐ " + periodOfValidity.endDate + "

          " ; - } - else{ - html += "

          " + periodOfValidity.startDate + " ‐ heute

          "; - } - html += '
        • '; - } - html += '
        '; - return html; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if (params.data.availablePeriodsOfValidity && params.data.availablePeriodsOfValidity.length > 1){ - return "" + JSON.stringify(params.data.availablePeriodsOfValidity); - } - return params.data.availablePeriodsOfValidity; + // LOI + if (this.dataGridOptions_georesources_loi && this.dataGridOptions_georesources_loi.api && document.querySelector('#loiOverviewTable').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_georesources_loi); + let newRowData = this.buildDataGridRowData_georesources_loi(georesourceMetadataArray); + this.dataGridOptions_georesources_loi.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_georesources_loi); } - }, - { headerName: 'Themenhierarchie', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getTopicHierarchyDisplayString(params.data.topicReference); + else { + this.dataGridOptions_georesources_loi = this.buildDataGridOptions_georesources_loi(georesourceMetadataArray); + let gridDiv = document.querySelector('#loiOverviewTable'); + new agGrid.Grid(gridDiv, this.dataGridOptions_georesources_loi); } - }, - { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.datasource; + // AOI + if (this.dataGridOptions_georesources_aoi && this.dataGridOptions_georesources_aoi.api && document.querySelector('#aoiOverviewTable').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_georesources_aoi); + let newRowData = this.buildDataGridRowData_georesources_aoi(georesourceMetadataArray); + this.dataGridOptions_georesources_aoi.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_georesources_aoi); } - }, - { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.contact; + else { + this.dataGridOptions_georesources_aoi = this.buildDataGridOptions_georesources_aoi(georesourceMetadataArray); + let gridDiv = document.querySelector('#aoiOverviewTable'); + new agGrid.Grid(gridDiv, this.dataGridOptions_georesources_aoi); } - }, - { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); - } - } - ]; - - return columnDefs; - }; - - this.buildDataGridRowData_georesources_poi = function (georesourceMetadataArray) { - return georesourceMetadataArray.filter(georesourceMetadata => georesourceMetadata.isPOI); - }; - - this.buildDataGridRowData_georesources_loi = function (georesourceMetadataArray) { - return georesourceMetadataArray.filter(georesourceMetadata => georesourceMetadata.isLOI); - }; - - this.buildDataGridRowData_georesources_aoi = function (georesourceMetadataArray) { - return georesourceMetadataArray.filter(georesourceMetadata => georesourceMetadata.isAOI); - }; - - this.getSelectedGeoresourcesMetadata = function(){ - let georesourceMetadataArray = []; - - //POI - if (this.dataGridOptions_georesources_poi && this.dataGridOptions_georesources_poi.api){ - let selectedPoiNodes = this.dataGridOptions_georesources_poi.api.getSelectedNodes(); - - for (const selectedPoiNode of selectedPoiNodes) { - georesourceMetadataArray.push(selectedPoiNode.data); - } - } - - //LOI - if (this.dataGridOptions_georesources_loi && this.dataGridOptions_georesources_loi.api){ - let selectedLoiNodes = this.dataGridOptions_georesources_loi.api.getSelectedNodes(); - - for (const selectedLoiNode of selectedLoiNodes) { - georesourceMetadataArray.push(selectedLoiNode.data); - } - } - - //AOI - if (this.dataGridOptions_georesources_aoi && this.dataGridOptions_georesources_aoi.api){ - let selectedAoiNodes = this.dataGridOptions_georesources_aoi.api.getSelectedNodes(); - - for (const selectedAoiNode of selectedAoiNodes) { - georesourceMetadataArray.push(selectedAoiNode.data); - } - } - - return georesourceMetadataArray; - }; - - this.buildDataGridRowData_spatialUnits = function (spatialUnitMetadataArray) { - return spatialUnitMetadataArray; - }; - - this.buildDataGridColumnConfig_spatialUnits = function (spatialUnitMetadataArray) { - const columnDefs = [ - { headerName: 'Editierfunktionen', pinned: 'left', maxWidth: 150, checkboxSelection: false, headerCheckboxSelection: false, - headerCheckboxSelectionFilteredOnly: true, filter: false, sortable: false, cellRenderer: 'displayEditButtons_spatialUnits' }, - { headerName: 'Id', field: "spatialUnitId", pinned: 'left', maxWidth: 125 }, - { headerName: 'Name', field: "spatialUnitLevel", pinned: 'left', minWidth: 300 }, - { headerName: 'Beschreibung', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.description; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.description; + }; + this.buildDataGrid_spatialUnits = function (spatialUnitMetadataArray) { + if (this.dataGridOptions_spatialUnits && this.dataGridOptions_spatialUnits.api && document.querySelector('#spatialUnitOverviewTable').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_spatialUnits); + let newRowData = this.buildDataGridRowData_spatialUnits(spatialUnitMetadataArray); + this.dataGridOptions_spatialUnits.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_spatialUnits); } - }, - { headerName: 'Nächst niedrigere Raumebene', field: "nextLowerHierarchyLevel", minWidth: 250 }, - { headerName: 'Nächst höhere Raumebene', field: "nextUpperHierarchyLevel", minWidth: 250 }, - { - headerName: 'Gültigkeitszeitraum', minWidth: 400, - cellRenderer: function (params) { - /* -
          -
        • -

          {{::periodOfValidity.startDate}} - {{::periodOfValidity.endDate}}

          -

          {{::periodOfValidity.startDate}} - heute

          -
        • -
        - */ - let html = '
          '; - for (const periodOfValidity of params.data.availablePeriodsOfValidity) { - html += '
        • '; - - if(periodOfValidity.endDate){ - html += "

          " + periodOfValidity.startDate + " ‐ " + periodOfValidity.endDate + "

          " ; - } - else{ - html += "

          " + periodOfValidity.startDate + " ‐ heute

          "; - } - html += '
        • '; - } - html += '
        '; - return html; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if (params.data.availablePeriodsOfValidity && params.data.availablePeriodsOfValidity.length > 1){ - return "" + JSON.stringify(params.data.availablePeriodsOfValidity); - } - return params.data.availablePeriodsOfValidity; + else { + this.dataGridOptions_spatialUnits = this.buildDataGridOptions_spatialUnits(spatialUnitMetadataArray); + let gridDiv = document.querySelector('#spatialUnitOverviewTable'); + new agGrid.Grid(gridDiv, this.dataGridOptions_spatialUnits); } - }, - { headerName: 'Datenquelle', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.datasource; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.datasource; + }; + // FEATURE TABLES + const isDate = (date) => { + return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date)); + }; + this.buildDataGridColumnConfig_featureTable_spatialResource = function (specificHeadersArray, datasetId, resourceType, deleteButtonEnabled) { + const columnDefs = [ + { headerName: 'DB-Record-Id', field: "kommonitorRecordId", pinned: 'left', editable: false, cellClass: "grid-non-editable", maxWidth: 125, + cellRenderer: function (params) { + let html = ""; + // only show delete button, if user has the permission to delete the dataset + // if only editor rights, then user may edit cells, but shall not remove data entries + // if(params.data.userPermissions.includes("creator")){ + // if (resourceType == self.resourceType_spatialUnit){ + // html += ''; + // } + // else { + // html += ''; + // } + // } + if (resourceType == self.resourceType_spatialUnit) { + html += ''; + } + else { + html += ''; + } + html += "
        "; + html += params.data.kommonitorRecordId; + return html; + } + }, + { headerName: 'Feature-Id', field: __env.FEATURE_ID_PROPERTY_NAME, pinned: 'left', editable: false, cellClass: "grid-non-editable", maxWidth: 125 }, + { headerName: 'Name', field: __env.FEATURE_NAME_PROPERTY_NAME, pinned: 'left', minWidth: 150 }, + // { headerName: 'Geometrie', field: "kommonitorGeometry", autoHeight: false, wrapText: false, + // cellRenderer: function (params) { + // let html = JSON.stringify(params.data.kommonitorGeometry); + // return html; + // }, + // filter: 'agTextColumnFilter', + // filterValueGetter: (params) => { + // return JSON.stringify(params.data.kommonitorGeometry); + // }, + // valueGetter: params => { + // return JSON.stringify(params.data.kommonitorGeometry); + // }, + // valueSetter: params => { + // try { + // params.data.kommonitorGeometry = JSON.parse(params.newValue); + // } catch (error) { + // try { + // params.data.kommonitorGeometry = JSON.parse(params.oldValue); + // } catch (error) { + // params.data.kommonitorGeometry = params.oldValue; + // } + // } + // return true; + // }, + // minWidth: 200 + // }, + { headerName: 'Lebenszeitbeginn', field: __env.VALID_START_DATE_PROPERTY_NAME, minWidth: 150, cellEditor: getDatePicker() }, + { headerName: 'Lebenszeitende', field: __env.VALID_END_DATE_PROPERTY_NAME, cellEditor: getDatePicker(), + // cellRenderer: function (params) { + // let html = '

        '; + // if (params.data.validEndDate){ + // html += params.data.validEndDate; + // } + // else{ + // html += "uneingeschränkt gültig"; + // } + // html += "

        "; + // return html; + // }, + // filter: 'agTextColumnFilter', + // filterValueGetter: (params) => { + // if (params.data.validEndDate){ + // return "" + params.data.validEndDate; + // } + // return "uneingeschränkt gültig"; + // }, + minWidth: 150 } + ]; + for (const header of specificHeadersArray) { + columnDefs.push({ headerName: "" + header, field: "" + header, minWidth: 125 }); } - }, - { headerName: 'Datenhalter und Kontakt', minWidth: 400, cellRenderer: function (params) { return params.data.metadata.contact; }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + params.data.metadata.contact; + return columnDefs; + }; + this.buildDataGridRowData_featureTable_spatialResource = function (dataArray) { + if (dataArray[0] && dataArray[0].properties) { + return dataArray.map(dataItem => { + // add geometry and database record ID to properties to be available within data grid object + dataItem.properties.kommonitorGeometry = dataItem.geometry; + dataItem.properties.kommonitorRecordId = dataItem.id; + return dataItem.properties; + }); } - }, - { headerName: 'Rollen', minWidth: 400, cellRenderer: function (params) { return kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return "" + kommonitorDataExchangeService.getAllowedRolesString(params.data.allowedRoles); - } - } - ]; - - return columnDefs; - }; - - this.getSelectedSpatialUnitsMetadata = function(){ - let spatialUnitsMetadataArray = []; - - if (this.dataGridOptions_spatialUnits && this.dataGridOptions_spatialUnits.api){ - let selectedNodes = this.dataGridOptions_spatialUnits.api.getSelectedNodes(); - - for (const selectedNode of selectedNodes) { - spatialUnitsMetadataArray.push(selectedNode.data); - } - } - - return spatialUnitsMetadataArray; - }; - - this.getSelectedAccessControlMetadata = function(){ - let accessControlMetadataArray = []; - - if (this.dataGridOptions_accessControl && this.dataGridOptions_accessControl.api){ - let selectedNodes = this.dataGridOptions_accessControl.api.getSelectedNodes(); - - for (const selectedNode of selectedNodes) { - accessControlMetadataArray.push(selectedNode.data); - } - } - - return accessControlMetadataArray; - }; - - this.getSelectedScriptsMetadata = function(){ - let scriptsMetadataArray = []; - - if (this.dataGridOptions_scripts && this.dataGridOptions_scripts.api){ - let selectedNodes = this.dataGridOptions_scripts.api.getSelectedNodes(); - - for (const selectedNode of selectedNodes) { - scriptsMetadataArray.push(selectedNode.data); - } - } - - return scriptsMetadataArray; - }; - - this.buildDataGridOptions_indicators = function (indicatorMetadataArray) { - let columnDefs = this.buildDataGridColumnConfig_indicators(indicatorMetadataArray); - let rowData = this.buildDataGridRowData_indicators(indicatorMetadataArray); - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - components: { - displayEditButtons_indicators: displayEditButtons_indicators - }, - columnDefs: columnDefs, - rowData: rowData, - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - // rowHeight: 200, - onGridReady: function () { - // self.registerClickHandler_indicators(indicatorMetadataArray); - }, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_indicators); - // self.registerClickHandler_indicators(indicatorMetadataArray); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_indicators); - // self.registerClickHandler_indicators(indicatorMetadataArray); - }, - onModelUpdated: function () { - self.registerClickHandler_indicators(indicatorMetadataArray); - - }, - onRowDataChanged: function () { - self.registerClickHandler_indicators(indicatorMetadataArray); - }, - // onPaginationChanged: function () { - // self.registerClickHandler_indicators(indicatorMetadataArray); - // }, - onViewportChanged: function () { - self.registerClickHandler_indicators(indicatorMetadataArray); - setTimeout(function () { - let domNode = document.querySelector('#indicatorOverviewTable'); - // if (domNode) { - // MathJax.typesetPromise(); - // } - MathJax.typesetPromise().then(function (){ - // setTimeout(function () { - // self.dataGridOptions_indicators.api.resetRowHeights(); - // }, 1000); - // self.dataGridOptions_indicators.api.resetRowHeights(); - }); - - // setTimeout(function () { - // self.dataGridOptions_indicators.api.resetRowHeights(); - // }, 1000); - }, 250); - }, - - }; - - return gridOptions; - }; - - this.registerClickHandler_indicators = function (indicatorMetadataArray) { - - // for (const indicatorMetadata of indicatorMetadataArray) { - // $( "#btn_indicator_editMetadata_" + indicatorMetadata.indicatorId).click(function() { - // let indicatorId = this.id.split("_")[3]; - - // let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); - - // $rootScope.$broadcast("onEditIndicatorMetadata", indicatorMetadata); - // }); - // } - - //first unbind previous click events - $(".indicatorEditMetadataBtn").off(); - $(".indicatorEditMetadataBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let indicatorId = this.id.split("_")[3]; - - let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); - - $rootScope.$broadcast("onEditIndicatorMetadata", indicatorMetadata); - }); - - //first unbind previous click events - $(".indicatorEditFeaturesBtn").off(); - $(".indicatorEditFeaturesBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let indicatorId = this.id.split("_")[3]; - - let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); - - $rootScope.$broadcast("onEditIndicatorFeatures", indicatorMetadata); - }); - - $(".indicatorEditRoleBasedAccessBtn").off(); - $(".indicatorEditRoleBasedAccessBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let indicatorId = this.id.split("_")[3]; - - let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(indicatorId); - - $rootScope.$broadcast("onEditIndicatorSpatialUnitRoles", indicatorMetadata); - }); - - }; - - this.registerClickHandler_georesources = function (georesourceMetadataArray) { - - $(".georesourceEditMetadataBtn").off(); - $(".georesourceEditMetadataBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let georesourceId = this.id.split("_")[3]; - - let georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceId); - - $rootScope.$broadcast("onEditGeoresourceMetadata", georesourceMetadata); - }); - - $(".georesourceEditFeaturesBtn").off(); - $(".georesourceEditFeaturesBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let georesourceId = this.id.split("_")[3]; - - let georesourceMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(georesourceId); - - $rootScope.$broadcast("onEditGeoresourceFeatures", georesourceMetadata); - }); - - $(".georesourceDeleteBtn").off(); - $(".georesourceDeleteBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let spatialUnitId = this.id.split("_")[3]; - - let spatialUnitMetadata = kommonitorDataExchangeService.getGeoresourceMetadataById(spatialUnitId); - - $rootScope.$broadcast("onDeleteGeoresources", [spatialUnitMetadata]); //handler function takes an array - }); - - }; - - this.buildDataGrid_indicators = function (indicatorMetadataArray) { - if (this.dataGridOptions_indicators && this.dataGridOptions_indicators.api && document.querySelector('#indicatorOverviewTable').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_indicators); - let newRowData = this.buildDataGridRowData_indicators(indicatorMetadataArray); - this.dataGridOptions_indicators.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_indicators); - } - else { - this.dataGridOptions_indicators = this.buildDataGridOptions_indicators(indicatorMetadataArray); - let gridDiv = document.querySelector('#indicatorOverviewTable'); - new agGrid.Grid(gridDiv, this.dataGridOptions_indicators); - } - }; - - this.buildDataGridOptions_georesources_poi = function (georesourceMetadataArray) { - let columnDefs = this.buildDataGridColumnConfig_georesources_poi(georesourceMetadataArray); - let rowData = this.buildDataGridRowData_georesources_poi(georesourceMetadataArray); - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - components: { - displayEditButtons_georesources: displayEditButtons_georesources - }, - columnDefs: columnDefs, - rowData: rowData, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_georesources_poi); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_georesources_poi); - }, - onRowDataChanged: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - onModelUpdated: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - onViewportChanged: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - - }; - - return gridOptions; - }; - - this.buildDataGridOptions_georesources_loi = function (georesourceMetadataArray) { - let columnDefs = this.buildDataGridColumnConfig_georesources_loi(georesourceMetadataArray); - let rowData = this.buildDataGridRowData_georesources_loi(georesourceMetadataArray); - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - components: { - displayEditButtons_georesources: displayEditButtons_georesources - }, - columnDefs: columnDefs, - rowData: rowData, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_georesources_loi); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_georesources_loi); - }, - onRowDataChanged: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - onModelUpdated: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - onViewportChanged: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - - }; - - return gridOptions; - }; - - this.buildDataGridOptions_georesources_aoi = function (georesourceMetadataArray) { - let columnDefs = this.buildDataGridColumnConfig_georesources_aoi(georesourceMetadataArray); - let rowData = this.buildDataGridRowData_georesources_aoi(georesourceMetadataArray); - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - components: { - displayEditButtons_georesources: displayEditButtons_georesources - }, - columnDefs: columnDefs, - rowData: rowData, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_georesources_aoi); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_georesources_aoi); - }, - onRowDataChanged: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - onModelUpdated: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - onViewportChanged: function () { - self.registerClickHandler_georesources(georesourceMetadataArray); - }, - - }; - - return gridOptions; - }; - - this.buildDataGridOptions_spatialUnits = function (spatialUnitMetadataArray) { - let columnDefs = this.buildDataGridColumnConfig_spatialUnits(spatialUnitMetadataArray); - let rowData = this.buildDataGridRowData_spatialUnits(spatialUnitMetadataArray); - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - components: { - displayEditButtons_spatialUnits: displayEditButtons_spatialUnits - }, - columnDefs: columnDefs, - rowData: rowData, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_spatialUnits); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_spatialUnits); - }, - onRowDataChanged: function () { - self.registerClickHandler_spatialUnits(spatialUnitMetadataArray); - }, - onModelUpdated: function () { - self.registerClickHandler_spatialUnits(spatialUnitMetadataArray); - - }, - onViewportChanged: function () { - self.registerClickHandler_spatialUnits(spatialUnitMetadataArray); - }, - - }; - - return gridOptions; - }; - - this.registerClickHandler_spatialUnits = function (spatialUnitMetadataArray) { - - $(".spatialUnitEditMetadataBtn").off(); - $(".spatialUnitEditMetadataBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let spatialUnitId = this.id.split("_")[3]; - - let spatialUnitMetadata = kommonitorDataExchangeService.getSpatialUnitMetadataById(spatialUnitId); - - $rootScope.$broadcast("onEditSpatialUnitMetadata", spatialUnitMetadata); - }); - - $(".spatialUnitEditFeaturesBtn").off(); - $(".spatialUnitEditFeaturesBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let spatialUnitId = this.id.split("_")[3]; - - let spatialUnitMetadata = kommonitorDataExchangeService.getSpatialUnitMetadataById(spatialUnitId); - - $rootScope.$broadcast("onEditSpatialUnitFeatures", spatialUnitMetadata); - }); - - $(".spatialUnitDeleteBtn").off(); - $(".spatialUnitDeleteBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let spatialUnitId = this.id.split("_")[3]; - - let spatialUnitMetadata = kommonitorDataExchangeService.getSpatialUnitMetadataById(spatialUnitId); - - $rootScope.$broadcast("onDeleteSpatialUnits", [spatialUnitMetadata]); //handler function takes an array - }); - - }; - - this.buildDataGrid_georesources = function (georesourceMetadataArray) { - // POI - if (this.dataGridOptions_georesources_poi && this.dataGridOptions_georesources_poi.api && document.querySelector('#poiOverviewTable').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_georesources_poi); - let newRowData = this.buildDataGridRowData_georesources_poi(georesourceMetadataArray); - this.dataGridOptions_georesources_poi.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_georesources_poi); - } - else { - this.dataGridOptions_georesources_poi = this.buildDataGridOptions_georesources_poi(georesourceMetadataArray); - let gridDiv = document.querySelector('#poiOverviewTable'); - new agGrid.Grid(gridDiv, this.dataGridOptions_georesources_poi); - } - - // LOI - if (this.dataGridOptions_georesources_loi && this.dataGridOptions_georesources_loi.api && document.querySelector('#loiOverviewTable').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_georesources_loi); - let newRowData = this.buildDataGridRowData_georesources_loi(georesourceMetadataArray); - this.dataGridOptions_georesources_loi.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_georesources_loi); - } - else { - this.dataGridOptions_georesources_loi = this.buildDataGridOptions_georesources_loi(georesourceMetadataArray); - let gridDiv = document.querySelector('#loiOverviewTable'); - new agGrid.Grid(gridDiv, this.dataGridOptions_georesources_loi); - } - - // AOI - if (this.dataGridOptions_georesources_aoi && this.dataGridOptions_georesources_aoi.api && document.querySelector('#aoiOverviewTable').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_georesources_aoi); - let newRowData = this.buildDataGridRowData_georesources_aoi(georesourceMetadataArray); - this.dataGridOptions_georesources_aoi.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_georesources_aoi); - } - else { - this.dataGridOptions_georesources_aoi = this.buildDataGridOptions_georesources_aoi(georesourceMetadataArray); - let gridDiv = document.querySelector('#aoiOverviewTable'); - new agGrid.Grid(gridDiv, this.dataGridOptions_georesources_aoi); - } - }; - - this.buildDataGrid_spatialUnits = function (spatialUnitMetadataArray) { - - if (this.dataGridOptions_spatialUnits && this.dataGridOptions_spatialUnits.api && document.querySelector('#spatialUnitOverviewTable').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_spatialUnits); - let newRowData = this.buildDataGridRowData_spatialUnits(spatialUnitMetadataArray); - this.dataGridOptions_spatialUnits.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_spatialUnits); - } - else { - this.dataGridOptions_spatialUnits = this.buildDataGridOptions_spatialUnits(spatialUnitMetadataArray); - let gridDiv = document.querySelector('#spatialUnitOverviewTable'); - new agGrid.Grid(gridDiv, this.dataGridOptions_spatialUnits); - } - }; - - // FEATURE TABLES - - const isDate = (date) => { - return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date)); - } - - this.buildDataGridColumnConfig_featureTable_spatialResource = function(specificHeadersArray, datasetId, resourceType, deleteButtonEnabled){ - const columnDefs = [ - { headerName: 'DB-Record-Id', field: "kommonitorRecordId", pinned: 'left', editable: false, cellClass: "grid-non-editable", maxWidth: 125, - cellRenderer: function (params) { - let html = ""; - - // only show delete button, if user has the permission to delete the dataset - // if only editor rights, then user may edit cells, but shall not remove data entries - // if(params.data.userPermissions.includes("creator")){ - // if (resourceType == self.resourceType_spatialUnit){ - // html += ''; - // } - // else { - // html += ''; + return dataArray; + }; + this.buildDataGridOptions_featureTable_spatialResource = function (specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled) { + let columnDefs = this.buildDataGridColumnConfig_featureTable_spatialResource(specificHeadersArray, datasetId, resourceType, deleteButtonEnabled); + let rowData = this.buildDataGridRowData_featureTable_spatialResource(dataArray); + let gridOptions = { + defaultColDef: { + editable: true, + // enables the fill handle + enableFillHandle: false, + cellEditor: 'agLargeTextCellEditor', + onCellValueChanged: function (newValueParams) { + /* https://www.ag-grid.com/javascript-data-grid/cell-editing/ + interface NewValueParams { + // The value before the change + oldValue: any; + // The value after the change + newValue: any; + // Row node for the given row + node: RowNode | null; + // Data associated with the node + data: any; + // Column for this callback + column: Column; + // ColDef provided for this column + colDef: ColDef; + api: GridApi; + columnApi: ColumnApi; + // The context as provided on `gridOptions.context` + context: any; + } + */ + // make sure that date properties are actually set + if (!newValueParams.data.validStartDate) { + newValueParams.data.validStartDate = newValueParams.oldValue; + } + if (!isDate(newValueParams.data.validStartDate)) { + newValueParams.data.validStartDate = newValueParams.oldValue; + } + if (newValueParams.data.validEndDate == "") { + newValueParams.data.validEndDate = undefined; + } + if (newValueParams.data.validEndDate) { + if (!isDate(newValueParams.data.validEndDate)) { + newValueParams.data.validEndDate = newValueParams.oldValue; + } + } + // take the modified data from newValueParams.data + // take geometry info from newValueParams.data.geometry and remove that property afterwards + // take kommonitorRecordId info from newValueParams.data.kommonitorRecordId and remove that property afterwards + // then build GeoJSON and send modification request to data Management component + let geoJSON = { + "type": "Feature", + geometry: "", + properties: "", + id: "" + }; + // clone properties + geoJSON.geometry = JSON.parse(JSON.stringify(newValueParams.data.kommonitorGeometry)); + geoJSON.id = JSON.parse(JSON.stringify(newValueParams.data.kommonitorRecordId)); + geoJSON.properties = JSON.parse(JSON.stringify(newValueParams.data)); + // now delete information + delete geoJSON.properties.kommonitorGeometry; + delete geoJSON.properties.kommonitorRecordId; + let url = __env.apiUrl + __env.basePath; + if (resourceType == self.resourceType_georesource) { + url += "/georesources/"; + } + else { + url += "/spatial-units/"; + } + url += datasetId + "/singleFeature/" + newValueParams.data[__env.FEATURE_ID_PROPERTY_NAME] + "/singleFeatureRecord/" + newValueParams.data.kommonitorRecordId; + $http({ + url: url, + method: "PUT", + data: geoJSON, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + console.log("Successfully updated database record"); + // on success mark grid cell with green background and set update information + newValueParams.colDef.cellStyle = (p) => p.rowIndex.toString() === newValueParams.node.id ? { 'background-color': '#9DC89F' } : ""; + newValueParams.api.refreshCells({ + force: true, + columns: [newValueParams.column.getId()], + rowNodes: [newValueParams.node] + }); + if (resourceType == self.resourceType_georesource) { + self.featureTable_georesource_lastUpdate_timestamp_success = getCurrentTimestampString(); + } + else { + self.featureTable_spatialUnit_lastUpdate_timestamp_success = getCurrentTimestampString(); + } + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while updating database record. Error is:\n" + error); + // reset cell value as an error occurred + newValueParams.data[newValueParams.column.colId] = newValueParams.oldValue; + // on failure mark grid cell with red background and set update failure information + newValueParams.colDef.cellStyle = (p) => p.rowIndex.toString() === newValueParams.node.id ? { 'background-color': '#E79595' } : ""; + newValueParams.api.refreshCells({ + force: true, + columns: [newValueParams.column.getId()], + rowNodes: [newValueParams.node] + }); + if (resourceType == self.resourceType_georesource) { + self.featureTable_georesource_lastUpdate_timestamp_failure = timestamp_string; + } + else { + self.featureTable_spatialUnit_lastUpdate_timestamp_failure = timestamp_string; + } + throw error; + }); + }, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + columnDefs: columnDefs, + rowData: rowData, + // enables undo / redo + undoRedoCellEditing: true, + // restricts the number of undo / redo steps to 10 + undoRedoCellEditingLimit: 10, + // enables flashing to help see cell changes + enableCellChangeFlash: true, + suppressRowClickSelection: true, + // rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + // onFirstDataRendered: function () { + // headerHeightSetter(this); + // }, + // onColumnResized: function () { + // headerHeightSetter(this); // } - - // } - - if (resourceType == self.resourceType_spatialUnit){ - html += ''; - } - else { - html += ''; - } - - html += "
        "; - - html += params.data.kommonitorRecordId; - - return html; - } - }, - { headerName: 'Feature-Id', field: __env.FEATURE_ID_PROPERTY_NAME, pinned: 'left', editable: false, cellClass: "grid-non-editable", maxWidth: 125 }, - { headerName: 'Name', field: __env.FEATURE_NAME_PROPERTY_NAME, pinned: 'left', minWidth: 150 }, - // { headerName: 'Geometrie', field: "kommonitorGeometry", autoHeight: false, wrapText: false, - // cellRenderer: function (params) { - // let html = JSON.stringify(params.data.kommonitorGeometry); - - // return html; - // }, - // filter: 'agTextColumnFilter', - // filterValueGetter: (params) => { - // return JSON.stringify(params.data.kommonitorGeometry); - // }, - // valueGetter: params => { - // return JSON.stringify(params.data.kommonitorGeometry); - // }, - // valueSetter: params => { - // try { - // params.data.kommonitorGeometry = JSON.parse(params.newValue); - // } catch (error) { - // try { - // params.data.kommonitorGeometry = JSON.parse(params.oldValue); - // } catch (error) { - // params.data.kommonitorGeometry = params.oldValue; - // } - - // } - // return true; - // }, - // minWidth: 200 - // }, - { headerName: 'Lebenszeitbeginn', field: __env.VALID_START_DATE_PROPERTY_NAME, minWidth: 150, cellEditor: getDatePicker() }, - { headerName: 'Lebenszeitende', field: __env.VALID_END_DATE_PROPERTY_NAME, cellEditor: getDatePicker(), - // cellRenderer: function (params) { - // let html = '

        '; - - // if (params.data.validEndDate){ - // html += params.data.validEndDate; - // } - // else{ - // html += "uneingeschränkt gültig"; - // } - - // html += "

        "; - - // return html; - // }, - // filter: 'agTextColumnFilter', - // filterValueGetter: (params) => { - // if (params.data.validEndDate){ - // return "" + params.data.validEndDate; - // } - // return "uneingeschränkt gültig"; - // }, - minWidth: 150 } - ]; - - for (const header of specificHeadersArray) { - columnDefs.push({ headerName: "" + header, field: "" + header, minWidth: 125 }); - } - - return columnDefs; - }; - - this.buildDataGridRowData_featureTable_spatialResource = function(dataArray){ - - - if(dataArray[0] && dataArray[0].properties){ - return dataArray.map(dataItem => { - // add geometry and database record ID to properties to be available within data grid object - dataItem.properties.kommonitorGeometry = dataItem.geometry; - dataItem.properties.kommonitorRecordId = dataItem.id; - return dataItem.properties; - } - ); - } - - return dataArray; - }; - - this.buildDataGridOptions_featureTable_spatialResource = function(specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled){ - let columnDefs = this.buildDataGridColumnConfig_featureTable_spatialResource(specificHeadersArray, datasetId, resourceType, deleteButtonEnabled); - let rowData = this.buildDataGridRowData_featureTable_spatialResource(dataArray); - - let gridOptions = { - defaultColDef: { - editable: true, - // enables the fill handle - enableFillHandle: false, - cellEditor: 'agLargeTextCellEditor', - onCellValueChanged: function(newValueParams){ - /* https://www.ag-grid.com/javascript-data-grid/cell-editing/ - interface NewValueParams { - // The value before the change - oldValue: any; - // The value after the change - newValue: any; - // Row node for the given row - node: RowNode | null; - // Data associated with the node - data: any; - // Column for this callback - column: Column; - // ColDef provided for this column - colDef: ColDef; - api: GridApi; - columnApi: ColumnApi; - // The context as provided on `gridOptions.context` - context: any; - } - */ - - // make sure that date properties are actually set - if (! newValueParams.data.validStartDate){ - newValueParams.data.validStartDate = newValueParams.oldValue; - } - if (!isDate(newValueParams.data.validStartDate)){ - newValueParams.data.validStartDate = newValueParams.oldValue; - } - if(newValueParams.data.validEndDate == ""){ - newValueParams.data.validEndDate = undefined; - } - if(newValueParams.data.validEndDate){ - if (!isDate(newValueParams.data.validEndDate)){ - newValueParams.data.validEndDate = newValueParams.oldValue; - } - } - - // take the modified data from newValueParams.data - // take geometry info from newValueParams.data.geometry and remove that property afterwards - // take kommonitorRecordId info from newValueParams.data.kommonitorRecordId and remove that property afterwards - // then build GeoJSON and send modification request to data Management component - let geoJSON = { - "type": "Feature", - geometry: "", - properties: "", - id: "" - }; - - // clone properties - geoJSON.geometry = JSON.parse(JSON.stringify(newValueParams.data.kommonitorGeometry)); - geoJSON.id = JSON.parse(JSON.stringify(newValueParams.data.kommonitorRecordId)); - geoJSON.properties = JSON.parse(JSON.stringify(newValueParams.data)); - - // now delete information - delete geoJSON.properties.kommonitorGeometry; - delete geoJSON.properties.kommonitorRecordId; - - let url = __env.apiUrl + __env.basePath; - if(resourceType == self.resourceType_georesource){ - url += "/georesources/"; - } - else { - url += "/spatial-units/"; - } - - url += datasetId + "/singleFeature/" + newValueParams.data[__env.FEATURE_ID_PROPERTY_NAME] + "/singleFeatureRecord/" + newValueParams.data.kommonitorRecordId; - - $http({ - url: url, - method: "PUT", - data: geoJSON, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - console.log("Successfully updated database record"); - - // on success mark grid cell with green background and set update information - newValueParams.colDef.cellStyle = (p) => - p.rowIndex.toString() === newValueParams.node.id ? {'background-color': '#9DC89F'} : ""; - - newValueParams.api.refreshCells({ - force: true, - columns: [newValueParams.column.getId()], - rowNodes: [newValueParams.node] - }); - - if(resourceType == self.resourceType_georesource){ - self.featureTable_georesource_lastUpdate_timestamp_success = getCurrentTimestampString(); - } - else { - self.featureTable_spatialUnit_lastUpdate_timestamp_success = getCurrentTimestampString(); - } - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while updating database record. Error is:\n" + error); - - // reset cell value as an error occurred - newValueParams.data[newValueParams.column.colId] = newValueParams.oldValue; - - // on failure mark grid cell with red background and set update failure information - newValueParams.colDef.cellStyle = (p) => - p.rowIndex.toString() === newValueParams.node.id ? {'background-color': '#E79595'} : ""; - - newValueParams.api.refreshCells({ - force: true, - columns: [newValueParams.column.getId()], - rowNodes: [newValueParams.node] - }); - if(resourceType == self.resourceType_georesource){ - self.featureTable_georesource_lastUpdate_timestamp_failure = timestamp_string; - } - else { - self.featureTable_spatialUnit_lastUpdate_timestamp_failure = timestamp_string; - } - throw error; - }); - }, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - columnDefs: columnDefs, - rowData: rowData, - // enables undo / redo - undoRedoCellEditing: true, - // restricts the number of undo / redo steps to 10 - undoRedoCellEditingLimit: 10, - // enables flashing to help see cell changes - enableCellChangeFlash: true, - suppressRowClickSelection: true, - // rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - // onFirstDataRendered: function () { - // headerHeightSetter(this); - // }, - // onColumnResized: function () { - // headerHeightSetter(this); - // } - onRowDataChanged: function () { - self.registerClickHandler_featureTable_spatialResource(resourceType); - }, - onModelUpdated: function () { - self.registerClickHandler_featureTable_spatialResource(resourceType); - - }, - onViewportChanged: function () { - self.registerClickHandler_featureTable_spatialResource(resourceType); - }, - - }; - - return gridOptions; - }; - - this.registerClickHandler_featureTable_spatialResource = function (resourceType) { - - let className = ""; - let url = __env.apiUrl + __env.basePath; - - if (resourceType == this.resourceType_georesource){ - className = ".georesourceDeleteFeatureRecordBtn"; - url += "/georesources/"; - } - else{ - className = ".spatialUnitDeleteFeatureRecordBtn"; - url += "/spatial-units/"; - } - - $(className).off(); - $(className).on("click", function (event) { - - // ensure that only the target button gets clicked - event.stopPropagation(); - event.stopImmediatePropagation(); - $rootScope.$broadcast("showLoadingIcon_" + resourceType); - - // id example is id="btn__spatialUnit__deleteFeatureEntry__' + datasetId + '__' + params.data[__env.FEATURE_ID_PROPERTY_NAME] + '__' + params.data.kommonitorRecordId + '" - let idArray = this.id.split("__"); - - let datasetId = idArray[3]; - let featureId = idArray[4]; - let recordId = idArray[5]; - - url += datasetId + "/singleFeature/" + featureId + "/singleFeatureRecord/" + recordId; - - $http({ + onRowDataChanged: function () { + self.registerClickHandler_featureTable_spatialResource(resourceType); + }, + onModelUpdated: function () { + self.registerClickHandler_featureTable_spatialResource(resourceType); + }, + onViewportChanged: function () { + self.registerClickHandler_featureTable_spatialResource(resourceType); + }, + }; + return gridOptions; + }; + this.registerClickHandler_featureTable_spatialResource = function (resourceType) { + let className = ""; + let url = __env.apiUrl + __env.basePath; + if (resourceType == this.resourceType_georesource) { + className = ".georesourceDeleteFeatureRecordBtn"; + url += "/georesources/"; + } + else { + className = ".spatialUnitDeleteFeatureRecordBtn"; + url += "/spatial-units/"; + } + $(className).off(); + $(className).on("click", function (event) { + // ensure that only the target button gets clicked + event.stopPropagation(); + event.stopImmediatePropagation(); + $rootScope.$broadcast("showLoadingIcon_" + resourceType); + // id example is id="btn__spatialUnit__deleteFeatureEntry__' + datasetId + '__' + params.data[__env.FEATURE_ID_PROPERTY_NAME] + '__' + params.data.kommonitorRecordId + '" + let idArray = this.id.split("__"); + let datasetId = idArray[3]; + let featureId = idArray[4]; + let recordId = idArray[5]; + url += datasetId + "/singleFeature/" + featureId + "/singleFeatureRecord/" + recordId; + $http({ url: url, method: "DELETE" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - console.log("Successfully deleted database record"); - - if(resourceType == self.resourceType_georesource){ + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + console.log("Successfully deleted database record"); + if (resourceType == self.resourceType_georesource) { self.featureTable_georesource_lastUpdate_timestamp_success = getCurrentTimestampString(); - } - else { + } + else { self.featureTable_spatialUnit_lastUpdate_timestamp_success = getCurrentTimestampString(); - } - - $rootScope.$broadcast("onDeleteFeatureEntry_" + resourceType); - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while deleting database record. Error is:\n" + error); - $rootScope.$broadcast("hideLoadingIcon_" + resourceType); - if(resourceType == self.resourceType_georesource){ + } + $rootScope.$broadcast("onDeleteFeatureEntry_" + resourceType); + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while deleting database record. Error is:\n" + error); + $rootScope.$broadcast("hideLoadingIcon_" + resourceType); + if (resourceType == self.resourceType_georesource) { self.featureTable_georesource_lastUpdate_timestamp_failure = getCurrentTimestampString(); - } - else { + } + else { self.featureTable_spatialUnit_lastUpdate_timestamp_failure = getCurrentTimestampString(); - } - throw error; - }); - }); - - }; - - this.buildDataGrid_featureTable_spatialResource = function (domElementId, specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled) { - - let dataGridOptions_featureTable; - - dataGridOptions_featureTable = this.buildDataGridOptions_featureTable_spatialResource(specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled); - - let gridDiv = document.querySelector('#' + domElementId); - while (gridDiv.firstChild) { - gridDiv.removeChild(gridDiv.firstChild); - } - new agGrid.Grid(gridDiv, dataGridOptions_featureTable); - }; - - // INDICATORS FEATURE TABLE - this.buildDataGridColumnConfig_featureTable_indicatorResource = function(specificHeadersArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId){ - const columnDefs = [ - { headerName: 'DB-Record-Id', field: "fid", pinned: 'left', editable: false, cellClass: "grid-non-editable", maxWidth: 125, - cellRenderer: function (params) { - let html = ""; - - // only show delete button, if user has the permission to delete the dataset - // if only editor rights, then user may edit cells, but shall not remove data entries - // if(params.data.userPermissions.includes("creator")){ - // html += ''; - - - // } - - html += ''; - - html += "  "; - html += params.data.fid; - - return html; - } - }, - { headerName: 'Feature-Id', field: __env.FEATURE_ID_PROPERTY_NAME, pinned: 'left', editable: false, cellClass: "grid-non-editable", maxWidth: 125 }, - { headerName: 'Name', field: __env.FEATURE_NAME_PROPERTY_NAME, pinned: 'left', minWidth: 200, editable: false, cellClass: "grid-non-editable", }, - // { headerName: 'Id', field: __env.FEATURE_ID_PROPERTY_NAME, maxWidth: 125 }, - // { headerName: 'Name', field: __env.FEATURE_NAME_PROPERTY_NAME, minWidth: 300 }, - { headerName: 'Lebenszeitbeginn', field: __env.VALID_START_DATE_PROPERTY_NAME, minWidth: 125, editable: false, cellClass: "grid-non-editable" }, - { headerName: 'Lebenszeitende', field: __env.VALID_END_DATE_PROPERTY_NAME, editable: false, cellClass: "grid-non-editable", - minWidth: 125 } - ]; - - for (const header of specificHeadersArray) { - columnDefs.push({ headerName: "" + header, field: "" + header, minWidth: 125 }); - } - - return columnDefs; - }; - - this.buildDataGridRowData_featureTable_indicatorResource = function(dataArray){ - - return dataArray.map(dataItem => { - // remove arisonFrom property as this is currently never used - delete dataItem.arisenFrom; - return dataItem; - } - ); - }; - - this.buildDataGridOptions_featureTable_indicatorResource = function(specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId){ - let columnDefs = this.buildDataGridColumnConfig_featureTable_indicatorResource(specificHeadersArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId); - let rowData = this.buildDataGridRowData_featureTable_indicatorResource(dataArray); - - let gridOptions = { - defaultColDef: { - editable: true, - // enables the fill handle - enableFillHandle: false, - cellEditor: 'agLargeTextCellEditor', - onCellValueChanged: function(newValueParams){ - /* https://www.ag-grid.com/javascript-data-grid/cell-editing/ - interface NewValueParams { - // The value before the change - oldValue: any; - // The value after the change - newValue: any; - // Row node for the given row - node: RowNode | null; - // Data associated with the node - data: any; - // Column for this callback - column: Column; - // ColDef provided for this column - colDef: ColDef; - api: GridApi; - columnApi: ColumnApi; - // The context as provided on `gridOptions.context` - context: any; - } - */ - - // take the modified data from newValueParams.data - // then build JSON and send modification request to data Management component - let json = JSON.parse(JSON.stringify(newValueParams.data)); - - // now delete information - only ID and fid shall remain for indicator record update - delete json[__env.VALID_START_DATE_PROPERTY_NAME]; - delete json[__env.VALID_END_DATE_PROPERTY_NAME]; - delete json[__env.FEATURE_NAME_PROPERTY_NAME]; - - /* - for indicators we should check if an empty/null/undefined value has been set by user and transmit it as null value - */ - for (const key in json) { - if (Object.hasOwnProperty.call(json, key)) { - const element = json[key]; - - if(key.includes(__env.indicatorDatePrefix)){ - if (element == ""){ - json[key] = null; - } } - - } - } - - let url = __env.apiUrl + __env.basePath + "/indicators/"; - - url += datasetId + "/" + spatialUnitId + "/singleFeature/" + newValueParams.data[__env.FEATURE_ID_PROPERTY_NAME] + "/singleFeatureRecord/" + newValueParams.data.fid; - - $http({ - url: url, - method: "PUT", - data: json, - headers: { - 'Content-Type': "application/json" + throw error; + }); + }); + }; + this.buildDataGrid_featureTable_spatialResource = function (domElementId, specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled) { + let dataGridOptions_featureTable; + dataGridOptions_featureTable = this.buildDataGridOptions_featureTable_spatialResource(specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled); + let gridDiv = document.querySelector('#' + domElementId); + while (gridDiv.firstChild) { + gridDiv.removeChild(gridDiv.firstChild); + } + new agGrid.Grid(gridDiv, dataGridOptions_featureTable); + }; + // INDICATORS FEATURE TABLE + this.buildDataGridColumnConfig_featureTable_indicatorResource = function (specificHeadersArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId) { + const columnDefs = [ + { headerName: 'DB-Record-Id', field: "fid", pinned: 'left', editable: false, cellClass: "grid-non-editable", maxWidth: 125, + cellRenderer: function (params) { + let html = ""; + // only show delete button, if user has the permission to delete the dataset + // if only editor rights, then user may edit cells, but shall not remove data entries + // if(params.data.userPermissions.includes("creator")){ + // html += ''; + // } + html += ''; + html += "  "; + html += params.data.fid; + return html; } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - console.log("Successfully updated database record"); - - // on success mark grid cell with green background and set update information - newValueParams.colDef.cellStyle = (p) => - p.rowIndex.toString() === newValueParams.node.id ? {'background-color': '#9DC89F'} : ""; - - newValueParams.api.refreshCells({ - force: true, - columns: [newValueParams.column.getId()], - rowNodes: [newValueParams.node] - }); - - self.featureTable_indicator_lastUpdate_timestamp_success = getCurrentTimestampString(); - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while updating database record. Error is:\n" + error); - - // reset cell value as an error occurred - newValueParams.data[newValueParams.column.colId] = newValueParams.oldValue; - - // on failure mark grid cell with red background and set update failure information - newValueParams.colDef.cellStyle = (p) => - p.rowIndex.toString() === newValueParams.node.id ? {'background-color': '#E79595'} : ""; - - newValueParams.api.refreshCells({ - force: true, - columns: [newValueParams.column.getId()], - rowNodes: [newValueParams.node] - }); - self.featureTable_indicator_lastUpdate_timestamp_failure = timestamp_string; - throw error; - }); - }, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - columnDefs: columnDefs, - rowData: rowData, - // enables undo / redo - undoRedoCellEditing: true, - // restricts the number of undo / redo steps to 10 - undoRedoCellEditingLimit: 10, - // enables flashing to help see cell changes - enableCellChangeFlash: true, - suppressRowClickSelection: true, - // rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onViewportChanged: function () { - self.registerClickHandler_featureTable_indicatorResource(resourceType); - }, - - }; - - return gridOptions; - }; - - this.registerClickHandler_featureTable_indicatorResource = function (resourceType) { - - let className = ".indicatorDeleteFeatureRecordBtn"; - let url = __env.apiUrl + __env.basePath + "/indicators/"; - - $(className).off(); - $(className).on("click", function (event) { - - // ensure that only the target button gets clicked - event.stopPropagation(); - event.stopImmediatePropagation(); - $rootScope.$broadcast("showLoadingIcon_" + resourceType); - - // id example is "btn__indicator__deleteFeatureEntry__' + datasetId + '__' + spatialUnitId + '__' + params.data[__env.FEATURE_ID_PROPERTY_NAME] + '__' + params.data.kommonitorRecordId + '" class="btn btn-danger btn-sm indicatorDeleteFeatureRecordBtn" - let idArray = this.id.split("__"); - - let datasetId = idArray[3]; - let spatialUnitId = idArray[4]; - let featureId = idArray[5]; - let recordId = idArray[6]; - - url += datasetId + "/" + spatialUnitId + "/singleFeature/" + featureId + "/singleFeatureRecord/" + recordId; - - $http({ + }, + { headerName: 'Feature-Id', field: __env.FEATURE_ID_PROPERTY_NAME, pinned: 'left', editable: false, cellClass: "grid-non-editable", maxWidth: 125 }, + { headerName: 'Name', field: __env.FEATURE_NAME_PROPERTY_NAME, pinned: 'left', minWidth: 200, editable: false, cellClass: "grid-non-editable", }, + // { headerName: 'Id', field: __env.FEATURE_ID_PROPERTY_NAME, maxWidth: 125 }, + // { headerName: 'Name', field: __env.FEATURE_NAME_PROPERTY_NAME, minWidth: 300 }, + { headerName: 'Lebenszeitbeginn', field: __env.VALID_START_DATE_PROPERTY_NAME, minWidth: 125, editable: false, cellClass: "grid-non-editable" }, + { headerName: 'Lebenszeitende', field: __env.VALID_END_DATE_PROPERTY_NAME, editable: false, cellClass: "grid-non-editable", + minWidth: 125 } + ]; + for (const header of specificHeadersArray) { + columnDefs.push({ headerName: "" + header, field: "" + header, minWidth: 125 }); + } + return columnDefs; + }; + this.buildDataGridRowData_featureTable_indicatorResource = function (dataArray) { + return dataArray.map(dataItem => { + // remove arisonFrom property as this is currently never used + delete dataItem.arisenFrom; + return dataItem; + }); + }; + this.buildDataGridOptions_featureTable_indicatorResource = function (specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId) { + let columnDefs = this.buildDataGridColumnConfig_featureTable_indicatorResource(specificHeadersArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId); + let rowData = this.buildDataGridRowData_featureTable_indicatorResource(dataArray); + let gridOptions = { + defaultColDef: { + editable: true, + // enables the fill handle + enableFillHandle: false, + cellEditor: 'agLargeTextCellEditor', + onCellValueChanged: function (newValueParams) { + /* https://www.ag-grid.com/javascript-data-grid/cell-editing/ + interface NewValueParams { + // The value before the change + oldValue: any; + // The value after the change + newValue: any; + // Row node for the given row + node: RowNode | null; + // Data associated with the node + data: any; + // Column for this callback + column: Column; + // ColDef provided for this column + colDef: ColDef; + api: GridApi; + columnApi: ColumnApi; + // The context as provided on `gridOptions.context` + context: any; + } + */ + // take the modified data from newValueParams.data + // then build JSON and send modification request to data Management component + let json = JSON.parse(JSON.stringify(newValueParams.data)); + // now delete information - only ID and fid shall remain for indicator record update + delete json[__env.VALID_START_DATE_PROPERTY_NAME]; + delete json[__env.VALID_END_DATE_PROPERTY_NAME]; + delete json[__env.FEATURE_NAME_PROPERTY_NAME]; + /* + for indicators we should check if an empty/null/undefined value has been set by user and transmit it as null value + */ + for (const key in json) { + if (Object.hasOwnProperty.call(json, key)) { + const element = json[key]; + if (key.includes(__env.indicatorDatePrefix)) { + if (element == "") { + json[key] = null; + } + } + } + } + let url = __env.apiUrl + __env.basePath + "/indicators/"; + url += datasetId + "/" + spatialUnitId + "/singleFeature/" + newValueParams.data[__env.FEATURE_ID_PROPERTY_NAME] + "/singleFeatureRecord/" + newValueParams.data.fid; + $http({ + url: url, + method: "PUT", + data: json, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + console.log("Successfully updated database record"); + // on success mark grid cell with green background and set update information + newValueParams.colDef.cellStyle = (p) => p.rowIndex.toString() === newValueParams.node.id ? { 'background-color': '#9DC89F' } : ""; + newValueParams.api.refreshCells({ + force: true, + columns: [newValueParams.column.getId()], + rowNodes: [newValueParams.node] + }); + self.featureTable_indicator_lastUpdate_timestamp_success = getCurrentTimestampString(); + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while updating database record. Error is:\n" + error); + // reset cell value as an error occurred + newValueParams.data[newValueParams.column.colId] = newValueParams.oldValue; + // on failure mark grid cell with red background and set update failure information + newValueParams.colDef.cellStyle = (p) => p.rowIndex.toString() === newValueParams.node.id ? { 'background-color': '#E79595' } : ""; + newValueParams.api.refreshCells({ + force: true, + columns: [newValueParams.column.getId()], + rowNodes: [newValueParams.node] + }); + self.featureTable_indicator_lastUpdate_timestamp_failure = timestamp_string; + throw error; + }); + }, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + columnDefs: columnDefs, + rowData: rowData, + // enables undo / redo + undoRedoCellEditing: true, + // restricts the number of undo / redo steps to 10 + undoRedoCellEditingLimit: 10, + // enables flashing to help see cell changes + enableCellChangeFlash: true, + suppressRowClickSelection: true, + // rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onViewportChanged: function () { + self.registerClickHandler_featureTable_indicatorResource(resourceType); + }, + }; + return gridOptions; + }; + this.registerClickHandler_featureTable_indicatorResource = function (resourceType) { + let className = ".indicatorDeleteFeatureRecordBtn"; + let url = __env.apiUrl + __env.basePath + "/indicators/"; + $(className).off(); + $(className).on("click", function (event) { + // ensure that only the target button gets clicked + event.stopPropagation(); + event.stopImmediatePropagation(); + $rootScope.$broadcast("showLoadingIcon_" + resourceType); + // id example is "btn__indicator__deleteFeatureEntry__' + datasetId + '__' + spatialUnitId + '__' + params.data[__env.FEATURE_ID_PROPERTY_NAME] + '__' + params.data.kommonitorRecordId + '" class="btn btn-danger btn-sm indicatorDeleteFeatureRecordBtn" + let idArray = this.id.split("__"); + let datasetId = idArray[3]; + let spatialUnitId = idArray[4]; + let featureId = idArray[5]; + let recordId = idArray[6]; + url += datasetId + "/" + spatialUnitId + "/singleFeature/" + featureId + "/singleFeatureRecord/" + recordId; + $http({ url: url, method: "DELETE" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - console.log("Successfully deleted database record"); - - $rootScope.$broadcast("onDeleteFeatureEntry_" + resourceType); - self.featureTable_indicator_lastUpdate_timestamp_success = getCurrentTimestampString(); - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while deleting database record. Error is:\n" + error); - $rootScope.$broadcast("hideLoadingIcon_" + resourceType); - self.featureTable_indicator_lastUpdate_timestamp_failure = getCurrentTimestampString(); - throw error; - }); - }); - - }; - - this.buildDataGrid_featureTable_indicatorResource = function (domElementId, specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId) { - - let dataGridOptions_featureTable = this.buildDataGridOptions_featureTable_indicatorResource(specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId); - - let gridDiv = document.querySelector('#' + domElementId); - while (gridDiv.firstChild) { - gridDiv.removeChild(gridDiv.firstChild); - } - new agGrid.Grid(gridDiv, dataGridOptions_featureTable); - }; - - - // ROLE OVERVIEW TABLE - - this.buildDataGridColumnConfig_accessControl = function(isRealmAdmin){ - let columnDefs = []; - // Only show edit column if user is Realm Admin - if (isRealmAdmin) { - columnDefs.push({ headerName: 'Editierfunktionen', maxWidth: 200, checkboxSelection: (row) => {return row.data.name != "public" && row.data.name != "kommonitor"}, filter: false, sortable: false, cellRenderer: 'displayEditButtons_accessControl' }); - } - - return columnDefs.concat([ - //{ headerName: 'Id', field: "organizationalUnitId", minWidth: 400 }, - { headerName: 'Organisationseinheit', field: "name", minWidth: 300 }, - { headerName: 'Rollen', field: "roleString", minWidth: 300 }, - { headerName: 'Beschreibung', field: "description", minWidth: 400 }, - { headerName: 'Kontakt', field: "contact", minWidth: 400 }, - ]); - }; - - this.buildDataGridRowData_accessControl = function(dataArray){ - let data = JSON.parse(JSON.stringify(dataArray)); - for (let elem of data) { - elem.roleString = ""; - for (let role of elem.roles) { - elem.roleString += role.permissionLevel + ", "; - } - elem.roleString = elem.roleString.substring(0, elem.roleString.length - 2); - } - return data; - }; - - this.buildDataGridOptions_accessControl = function(accessControlArray){ - let columnDefs = this.buildDataGridColumnConfig_accessControl(kommonitorDataExchangeService.isRealmAdmin); - let rowData = this.buildDataGridRowData_accessControl(accessControlArray); - - let components = {}; - if (kommonitorDataExchangeService.isRealmAdmin) { - components = {displayEditButtons_accessControl: displayEditButtons_accessControl}; - } else { - components = {} - } - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - components: components, - columnDefs: columnDefs, - rowData: rowData, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_accessControl); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_accessControl); - }, - onRowDataChanged: function () { - self.registerClickHandler_accessControl(accessControlArray); - }, - onModelUpdated: function () { - self.registerClickHandler_accessControl(accessControlArray); - }, - - onViewportChanged: function () { - self.registerClickHandler_accessControl(accessControlArray); - }, - - }; - - return gridOptions; - }; - - this.registerClickHandler_accessControl = function (roleMetadataArray) { - - $(".roleEditMetadataBtn").off(); - $(".roleEditMetadataBtn").on("click", function (event) { - // ensure that only the target button gets clicked - // manually open modal - event.stopPropagation(); - let modalId = document.getElementById(this.id).getAttribute("data-target"); - $(modalId).modal('show'); - - let id = this.id.split("_")[3]; - - let roleMetadata = kommonitorDataExchangeService.getAccessControlById(id); - - $rootScope.$broadcast("onEditRoleMetadata", roleMetadata); - }); - }; - - this.buildDataGrid_accessControl = function (accessControlArray) { - - if (this.dataGridOptions_accessControl && this.dataGridOptions_accessControl.api && document.querySelector('#roleOverviewTable').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_accessControl); - let newRowData = this.buildDataGridRowData_accessControl(accessControlArray); - this.dataGridOptions_accessControl.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_accessControl); - } - else { - this.dataGridOptions_accessControl = this.buildDataGridOptions_accessControl(accessControlArray); - let gridDiv = document.querySelector('#roleOverviewTable'); - new agGrid.Grid(gridDiv, this.dataGridOptions_accessControl); - } - }; - - - // SCRIPT OVERVIEW TABLE - - this.buildDataGridColumnConfig_scripts = function(){ - const columnDefs = [ - { headerName: 'Id', field: "scriptId", pinned: 'left', maxWidth: 125, checkboxSelection: true, headerCheckboxSelection: true, - headerCheckboxSelectionFilteredOnly: true }, - { headerName: 'Name', field: "name", pinned: 'left', maxWidth: 300 }, - { headerName: 'Ziel-Indikatoren-Id', field: "indicatorId", maxWidth: 125 }, - { headerName: 'Ziel-Indikatoren-Name', minWidth: 200, cellRenderer: function (params) { - return kommonitorDataExchangeService.getIndicatorNameFromIndicatorId(params.data.indicatorId); - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return kommonitorDataExchangeService.getIndicatorNameFromIndicatorId(params.data.indicatorId); - } - }, - { headerName: 'Beschreibung', field: "description", minWidth: 300 }, - { headerName: 'notwendige Basis-Indikatoren', minWidth: 300, cellRenderer: function (params) { - - /* - - - - - - - - - - - - - -
        IdName
        {{::baseIndicatorId}}{{::$ctrl.kommonitorDataExchangeServiceInstance.getIndicatorNameFromIndicatorId(baseIndicatorId)}}
        - */ - if(params.data && params.data.requiredIndicatorIds && params.data.requiredIndicatorIds.length > 0){ - let html = ''; - - for (const baseIndicatorId of params.data.requiredIndicatorIds) { - html += ""; - html += ""; - html += ""; - html += ""; + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + console.log("Successfully deleted database record"); + $rootScope.$broadcast("onDeleteFeatureEntry_" + resourceType); + self.featureTable_indicator_lastUpdate_timestamp_success = getCurrentTimestampString(); + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while deleting database record. Error is:\n" + error); + $rootScope.$broadcast("hideLoadingIcon_" + resourceType); + self.featureTable_indicator_lastUpdate_timestamp_failure = getCurrentTimestampString(); + throw error; + }); + }); + }; + this.buildDataGrid_featureTable_indicatorResource = function (domElementId, specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId) { + let dataGridOptions_featureTable = this.buildDataGridOptions_featureTable_indicatorResource(specificHeadersArray, dataArray, datasetId, resourceType, deleteButtonEnabled, spatialUnitId); + let gridDiv = document.querySelector('#' + domElementId); + while (gridDiv.firstChild) { + gridDiv.removeChild(gridDiv.firstChild); + } + new agGrid.Grid(gridDiv, dataGridOptions_featureTable); + }; + // ROLE OVERVIEW TABLE + this.buildDataGridColumnConfig_accessControl = function (isRealmAdmin) { + let columnDefs = []; + // Only show edit column if user is Realm Admin + if (isRealmAdmin) { + columnDefs.push({ headerName: 'Editierfunktionen', maxWidth: 200, checkboxSelection: (row) => { return row.data.name != "public" && row.data.name != "kommonitor"; }, filter: false, sortable: false, cellRenderer: 'displayEditButtons_accessControl' }); + } + return columnDefs.concat([ + //{ headerName: 'Id', field: "organizationalUnitId", minWidth: 400 }, + { headerName: 'Organisationseinheit', field: "name", minWidth: 300 }, + { headerName: 'Rollen', field: "roleString", minWidth: 300 }, + { headerName: 'Beschreibung', field: "description", minWidth: 400 }, + { headerName: 'Kontakt', field: "contact", minWidth: 400 }, + ]); + }; + this.buildDataGridRowData_accessControl = function (dataArray) { + let data = JSON.parse(JSON.stringify(dataArray)); + for (let elem of data) { + elem.roleString = ""; + for (let role of elem.roles) { + elem.roleString += role.permissionLevel + ", "; + } + elem.roleString = elem.roleString.substring(0, elem.roleString.length - 2); + } + return data; + }; + this.buildDataGridOptions_accessControl = function (accessControlArray) { + let columnDefs = this.buildDataGridColumnConfig_accessControl(kommonitorDataExchangeService.isRealmAdmin); + let rowData = this.buildDataGridRowData_accessControl(accessControlArray); + let components = {}; + if (kommonitorDataExchangeService.isRealmAdmin) { + components = { displayEditButtons_accessControl: displayEditButtons_accessControl }; + } + else { + components = {}; + } + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + components: components, + columnDefs: columnDefs, + rowData: rowData, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_accessControl); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_accessControl); + }, + onRowDataChanged: function () { + self.registerClickHandler_accessControl(accessControlArray); + }, + onModelUpdated: function () { + self.registerClickHandler_accessControl(accessControlArray); + }, + onViewportChanged: function () { + self.registerClickHandler_accessControl(accessControlArray); + }, + }; + return gridOptions; + }; + this.registerClickHandler_accessControl = function (roleMetadataArray) { + $(".roleEditMetadataBtn").off(); + $(".roleEditMetadataBtn").on("click", function (event) { + // ensure that only the target button gets clicked + // manually open modal + event.stopPropagation(); + let modalId = document.getElementById(this.id).getAttribute("data-target"); + $(modalId).modal('show'); + let id = this.id.split("_")[3]; + let roleMetadata = kommonitorDataExchangeService.getAccessControlById(id); + $rootScope.$broadcast("onEditRoleMetadata", roleMetadata); + }); + }; + this.buildDataGrid_accessControl = function (accessControlArray) { + if (this.dataGridOptions_accessControl && this.dataGridOptions_accessControl.api && document.querySelector('#roleOverviewTable').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_accessControl); + let newRowData = this.buildDataGridRowData_accessControl(accessControlArray); + this.dataGridOptions_accessControl.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_accessControl); + } + else { + this.dataGridOptions_accessControl = this.buildDataGridOptions_accessControl(accessControlArray); + let gridDiv = document.querySelector('#roleOverviewTable'); + new agGrid.Grid(gridDiv, this.dataGridOptions_accessControl); + } + }; + // SCRIPT OVERVIEW TABLE + this.buildDataGridColumnConfig_scripts = function () { + const columnDefs = [ + { headerName: 'Id', field: "scriptId", pinned: 'left', maxWidth: 125, checkboxSelection: true, headerCheckboxSelection: true, + headerCheckboxSelectionFilteredOnly: true }, + { headerName: 'Name', field: "name", pinned: 'left', maxWidth: 300 }, + { headerName: 'Ziel-Indikatoren-Id', field: "indicatorId", maxWidth: 125 }, + { headerName: 'Ziel-Indikatoren-Name', minWidth: 200, cellRenderer: function (params) { + return kommonitorDataExchangeService.getIndicatorNameFromIndicatorId(params.data.indicatorId); + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return kommonitorDataExchangeService.getIndicatorNameFromIndicatorId(params.data.indicatorId); + } + }, + { headerName: 'Beschreibung', field: "description", minWidth: 300 }, + { headerName: 'notwendige Basis-Indikatoren', minWidth: 300, cellRenderer: function (params) { + /* +
        IdName
        " + baseIndicatorId + "" + kommonitorDataExchangeService.getIndicatorNameFromIndicatorId(baseIndicatorId) + "
        + + + + + + + + + + + + +
        IdName
        {{::baseIndicatorId}}{{::$ctrl.kommonitorDataExchangeServiceInstance.getIndicatorNameFromIndicatorId(baseIndicatorId)}}
        + */ + if (params.data && params.data.requiredIndicatorIds && params.data.requiredIndicatorIds.length > 0) { + let html = ''; + for (const baseIndicatorId of params.data.requiredIndicatorIds) { + html += ""; + html += ""; + html += ""; + html += ""; + } + html += "
        IdName
        " + baseIndicatorId + "" + kommonitorDataExchangeService.getIndicatorNameFromIndicatorId(baseIndicatorId) + "
        "; + return html; + } + else { + return "keine"; + } + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data && params.data.requiredIndicatorIds && params.data.requiredIndicatorIds.length > 0) { + let string = JSON.stringify(params.data.requiredIndicatorIds); + for (const baseIndicatorId of params.data.requiredIndicatorIds) { + string += kommonitorDataExchangeService.getIndicatorNameFromIndicatorId(baseIndicatorId); + } + return string; + } + else { + return "keine"; + } + } + }, + { headerName: 'notwendige Basis-Georessourcen', minWidth: 300, cellRenderer: function (params) { + if (params.data && params.data.requiredGeoresourceIds && params.data.requiredGeoresourceIds.length > 0) { + let html = ''; + for (const baseGeoresourceId of params.data.requiredGeoresourceIds) { + html += ""; + html += ""; + html += ""; + html += ""; + } + html += "
        IdName
        " + baseGeoresourceId + "" + kommonitorDataExchangeService.getGeoresourceNameFromGeoresourceId(baseGeoresourceId) + "
        "; + return html; + } + else { + return "keine"; + } + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data && params.data.requiredGeoresourceIds && params.data.requiredGeoresourceIds.length > 0) { + let string = JSON.stringify(params.data.requiredGeoresourceIds); + for (const baseIndicatorId of params.data.requiredGeoresourceIds) { + string += kommonitorDataExchangeService.getGeoresourceNameFromGeoresourceId(baseIndicatorId); + } + return string; + } + else { + return "keine"; + } + } + }, + { headerName: 'Prozessparameter', field: "", minWidth: 1000, cellRenderer: function (params) { + /* + + + + + + + + + + + + + + + + + + + +
        NameBeschreibungDatentypStandard-Werterlaubter Wertebereich
        {{::processParameter.name}}{{::processParameter.description}}{{::processParameter.dataType}}{{::processParameter.defaultValue}}
        erlaubter Wertebereich {{::processParameter.minParameterValueForNumericInputs}} - {{::processParameter.maxParameterValueForNumericInputs}}
        + */ + if (params.data && params.data.variableProcessParameters && params.data.variableProcessParameters.length > 0) { + let html = ''; + for (const processParameter of params.data.variableProcessParameters) { + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + } + html += "
        NameBeschreibungDatentypStandard-Werterlaubter Wertebereich
        " + processParameter.name + "" + processParameter.description + "" + processParameter.dataType + "" + processParameter.defaultValue + ""; + if (processParameter.dataType == "integer" || processParameter.dataType == "double") { + html += "erlaubter Wertebereich

        "; + html += "" + processParameter.minParameterValueForNumericInputs + " ‐ " + processParameter.maxParameterValueForNumericInputs; + } + html += "
        "; + return html; + } + else { + return "keine"; + } + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data && params.data.variableProcessParameters && params.data.variableProcessParameters.length > 0) { + return JSON.stringify(params.data.variableProcessParameters); + } + else { + return "keine"; + } + } } - - html += ""; - return html; - } - else{ - return "keine"; - } - - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - - if(params.data && params.data.requiredIndicatorIds && params.data.requiredIndicatorIds.length > 0){ - let string = JSON.stringify(params.data.requiredIndicatorIds); - - for (const baseIndicatorId of params.data.requiredIndicatorIds) { - string += kommonitorDataExchangeService.getIndicatorNameFromIndicatorId(baseIndicatorId); - } - - return string; - } - else{ - return "keine"; - } - } - }, - { headerName: 'notwendige Basis-Georessourcen', minWidth: 300, cellRenderer: function (params) { - if(params.data && params.data.requiredGeoresourceIds && params.data.requiredGeoresourceIds.length > 0){ - let html = ''; - - for (const baseGeoresourceId of params.data.requiredGeoresourceIds) { - html += ""; - html += ""; - html += ""; - html += ""; + ]; + return columnDefs; + }; + this.buildDataGridRowData_scripts = function (dataArray) { + return dataArray; + }; + this.buildDataGridOptions_scripts = function (scriptsArray) { + let columnDefs = this.buildDataGridColumnConfig_scripts(); + let rowData = this.buildDataGridRowData_scripts(scriptsArray); + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + columnDefs: columnDefs, + rowData: rowData, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_scripts); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_scripts); } - - html += "
        IdName
        " + baseGeoresourceId + "" + kommonitorDataExchangeService.getGeoresourceNameFromGeoresourceId(baseGeoresourceId) + "
        "; - return html; - } - else{ - return "keine"; - } - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if(params.data && params.data.requiredGeoresourceIds && params.data.requiredGeoresourceIds.length > 0){ - let string = JSON.stringify(params.data.requiredGeoresourceIds); - - for (const baseIndicatorId of params.data.requiredGeoresourceIds) { - string += kommonitorDataExchangeService.getGeoresourceNameFromGeoresourceId(baseIndicatorId); - } - - return string; - } - else{ - return "keine"; - } - } - }, - { headerName: 'Prozessparameter', field: "", minWidth: 1000, cellRenderer: function (params) { - /* - - - - - - - - - - - - - - - - - - - -
        NameBeschreibungDatentypStandard-Werterlaubter Wertebereich
        {{::processParameter.name}}{{::processParameter.description}}{{::processParameter.dataType}}{{::processParameter.defaultValue}}
        erlaubter Wertebereich {{::processParameter.minParameterValueForNumericInputs}} - {{::processParameter.maxParameterValueForNumericInputs}}
        - */ - if(params.data && params.data.variableProcessParameters && params.data.variableProcessParameters.length > 0){ - let html = ''; - - for (const processParameter of params.data.variableProcessParameters) { - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; + }; + return gridOptions; + }; + this.buildDataGrid_scripts = function (scriptsArray) { + if (this.dataGridOptions_scripts && this.dataGridOptions_scripts.api && document.querySelector('#scriptOverviewTable').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_scripts); + let newRowData = this.buildDataGridRowData_scripts(scriptsArray); + this.dataGridOptions_scripts.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_scripts); + } + else { + this.dataGridOptions_scripts = this.buildDataGridOptions_scripts(scriptsArray); + let gridDiv = document.querySelector('#scriptOverviewTable'); + new agGrid.Grid(gridDiv, this.dataGridOptions_scripts); + } + }; + // DEFAULT JOBS OVERVIEW TABLE + this.buildDataGridColumnConfig_defaultJobs = function () { + const columnDefs = [ + { headerName: 'Job-Id', field: "jobId", pinned: 'left', maxWidth: 125, checkboxSelection: true, headerCheckboxSelection: true, + headerCheckboxSelectionFilteredOnly: true }, + { headerName: 'Script-Id', field: "jobData.scriptId", pinned: 'left', maxWidth: 125 }, + { headerName: 'Ziel-Indikator', pinned: 'left', maxWidth: 250, cellRenderer: function (params) { + if (params.data.jobData && params.data.jobData.targetIndicatorId) { + let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(params.data.jobData.targetIndicatorId); + if (indicatorMetadata) { + return indicatorMetadata.indicatorName; + } + } + return ""; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + if (params.data.jobData && params.data.jobData.targetIndicatorId) { + let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(params.data.jobData.targetIndicatorId); + if (indicatorMetadata) { + return indicatorMetadata.indicatorName; + } + } + return ""; } - - html += "
        NameBeschreibungDatentypStandard-Werterlaubter Wertebereich
        " + processParameter.name + "" + processParameter.description + "" + processParameter.dataType + "" + processParameter.defaultValue + "" ; - - if(processParameter.dataType == "integer" || processParameter.dataType == "double"){ - html += "erlaubter Wertebereich

        "; - html += "" + processParameter.minParameterValueForNumericInputs + " ‐ " + processParameter.maxParameterValueForNumericInputs; - } - - html += "
        "; - return html; - } - else{ - return "keine"; - } - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if(params.data && params.data.variableProcessParameters && params.data.variableProcessParameters.length > 0){ - return JSON.stringify(params.data.variableProcessParameters); - } - else{ - return "keine"; - } - } - } - ]; - - return columnDefs; - }; - - this.buildDataGridRowData_scripts = function(dataArray){ - - return dataArray; - }; - - this.buildDataGridOptions_scripts = function(scriptsArray){ - let columnDefs = this.buildDataGridColumnConfig_scripts(); - let rowData = this.buildDataGridRowData_scripts(scriptsArray); - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - columnDefs: columnDefs, - rowData: rowData, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_scripts); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_scripts); + }, + { headerName: 'Job-Status', field: "status", maxWidth: 125 }, + { headerName: 'Job-Fortschritt', field: "progress", maxWidth: 125 }, + { headerName: 'Job-Data', minWidth: 500, cellRenderer: function (params) { + return kommonitorDataExchangeService.syntaxHighlightJSON(params.data.jobData); + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return params.data.jobData; + } + }, + { headerName: 'Job-Logs', maxWidth: 150, cellRenderer: function (params) { + if (params.data.logs) { + var logJSON = JSON.stringify(params.data.logs); + var blob = new Blob([logJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + let html = ''; + return html; + } + else { + return "Dieser Job umfasst keine Logs"; + } + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return params.data.logs; + } + }, + { headerName: 'Job-Summary', minWidth: 1000, cellRenderer: function (params) { + let html = ""; + if (params.data.spatialUnitIntegrationSummary && params.data.spatialUnitIntegrationSummary.length > 0) { + html += ''; + for (const item of params.data.spatialUnitIntegrationSummary) { + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + if (item.errorsOccurred && item.errorsOccurred.length > 0) { + html += ""; + } + else { + html += ""; + } + html += ""; + } + html += "
        Raumeinheits-IdRaumeinheits-NameAnzahl integrierter Indikatoren-FeaturesAnzahl integrierter Zeitstempelintegrierte ZeitstempelFehlermeldung
        " + item.spatialUnitId + "" + item.spatialUnitName + "" + item.numberOfIntegratedIndicatorFeatures + "" + item.numberOfIntegratedTargetDates + "" + item.integratedTargetDates + "" + kommonitorDataExchangeService.syntaxHighlightJSON(item.errorsOccurred) + "keine Fehlermeldungen vorhanden
        "; + } + else { + html += "Dieser Job umfasst keine Informationen zur erfolgreichen/gescheiterten Datenintegration"; + } + return html; + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return JSON.stringify(params.data.spatialUnitIntegrationSummary); + } + } + ]; + return columnDefs; + }; + this.buildDataGridRowData_defaultJobs = function (dataArray) { + dataArray.sort((a, b) => b.jobId - a.jobId); + return dataArray; + }; + this.buildDataGridOptions_defaultJobs = function (jobsArray) { + let columnDefs = this.buildDataGridColumnConfig_defaultJobs(); + let rowData = this.buildDataGridRowData_defaultJobs(jobsArray); + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + columnDefs: columnDefs, + rowData: rowData, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_scripts); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_scripts); + } + }; + return gridOptions; + }; + this.buildDataGrid_defaultJobs = function (jobsArray) { + if (this.dataGridOptions_defaultJobs && this.dataGridOptions_defaultJobs.api && document.querySelector('#jobExecutionTable_defaultComputation').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_defaultJobs); + let newRowData = this.buildDataGridRowData_defaultJobs(jobsArray); + this.dataGridOptions_defaultJobs.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_defaultJobs); } - - }; - - return gridOptions; - }; - - this.buildDataGrid_scripts = function (scriptsArray) { - - if (this.dataGridOptions_scripts && this.dataGridOptions_scripts.api && document.querySelector('#scriptOverviewTable').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_scripts); - let newRowData = this.buildDataGridRowData_scripts(scriptsArray); - this.dataGridOptions_scripts.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_scripts); - } - else { - this.dataGridOptions_scripts = this.buildDataGridOptions_scripts(scriptsArray); - let gridDiv = document.querySelector('#scriptOverviewTable'); - new agGrid.Grid(gridDiv, this.dataGridOptions_scripts); + else { + this.dataGridOptions_defaultJobs = this.buildDataGridOptions_defaultJobs(jobsArray); + let gridDiv = document.querySelector('#jobExecutionTable_defaultComputation'); + new agGrid.Grid(gridDiv, this.dataGridOptions_defaultJobs); + } + }; + // CUSTOMIZED JOBS OVERVIEW TABLE + this.buildDataGridColumnConfig_customizedJobs = function () { + const columnDefs = [ + { headerName: 'Job-Id', field: "jobId", pinned: 'left', maxWidth: 125, checkboxSelection: true, headerCheckboxSelection: true, + headerCheckboxSelectionFilteredOnly: true }, + { headerName: 'Job-Status', field: "status", maxWidth: 125 }, + { headerName: 'Job-Fortschritt', field: "progress", maxWidth: 125 }, + { headerName: 'Job-Data', minWidth: 500, cellRenderer: function (params) { + return kommonitorDataExchangeService.syntaxHighlightJSON(params.data.jobData); + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return params.data.jobData; + } + }, + { headerName: 'Job-Logs', maxWidth: 150, cellRenderer: function (params) { + if (params.data.logs) { + var logJSON = JSON.stringify(params.data.logs); + var blob = new Blob([logJSON], { type: "application/json" }); + var data = URL.createObjectURL(blob); + let html = ''; + return html; + } + else { + return "Dieser Job umfasst keine Logs"; + } + }, + filter: 'agTextColumnFilter', + filterValueGetter: (params) => { + return params.data.logs; + } + } + ]; + return columnDefs; + }; + this.buildDataGridRowData_customizedJobs = function (dataArray) { + dataArray.sort((a, b) => b.jobId - a.jobId); + return dataArray; + }; + this.buildDataGridOptions_customizedJobs = function (jobsArray) { + let columnDefs = this.buildDataGridColumnConfig_customizedJobs(); + let rowData = this.buildDataGridRowData_customizedJobs(jobsArray); + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: true, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + columnDefs: columnDefs, + rowData: rowData, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: true, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 10, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + headerHeightSetter(self.dataGridOptions_scripts); + }, + onColumnResized: function () { + headerHeightSetter(self.dataGridOptions_scripts); + } + }; + return gridOptions; + }; + this.buildDataGrid_customizedJobs = function (jobsArray) { + if (this.dataGridOptions_customizedJobs && this.dataGridOptions_customizedJobs.api && document.querySelector('#jobExecutionTable_customizedComputation').childElementCount > 0) { + this.saveGridStore(this.dataGridOptions_customizedJobs); + let newRowData = this.buildDataGridRowData_customizedJobs(jobsArray); + this.dataGridOptions_customizedJobs.api.setRowData(newRowData); + this.restoreGridStore(this.dataGridOptions_customizedJobs); + } + else { + this.dataGridOptions_customizedJobs = this.buildDataGridOptions_customizedJobs(jobsArray); + let gridDiv = document.querySelector('#jobExecutionTable_customizedComputation'); + new agGrid.Grid(gridDiv, this.dataGridOptions_customizedJobs); + } + }; + function anyHigherRoleIsChecked(roles, roleSuffix) { + let filteresRoles = []; + if (roleSuffix == "viewer") { + filteresRoles = roles.filter(function (role) { + if (role.isChecked && (role.permissionLevel == "editor" || role.permissionLevel == "creator")) { + return true; + } + }); + } + else if (roleSuffix == "editor") { + filteresRoles = roles.filter(function (role) { + if (role.isChecked && role.permissionLevel == "creator") { + return true; + } + }); + } + return filteresRoles.length > 0; } - }; - - // DEFAULT JOBS OVERVIEW TABLE - - this.buildDataGridColumnConfig_defaultJobs = function(){ - const columnDefs = [ - { headerName: 'Job-Id', field: "jobId", pinned: 'left', maxWidth: 125, checkboxSelection: true, headerCheckboxSelection: true, - headerCheckboxSelectionFilteredOnly: true }, - { headerName: 'Script-Id', field: "jobData.scriptId", pinned: 'left', maxWidth: 125 }, - { headerName: 'Ziel-Indikator', pinned: 'left', maxWidth: 250, cellRenderer: function (params) { - if(params.data.jobData && params.data.jobData.targetIndicatorId){ - let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(params.data.jobData.targetIndicatorId); - if (indicatorMetadata){ - return indicatorMetadata.indicatorName; - } + ; + function CheckboxRenderer_viewer() { } + CheckboxRenderer_viewer.prototype.init = function (params) { + this.params = params; + let isChecked = false; + let exists = false; + let className; + for (const role of params.data.roles) { + if (role.permissionLevel == "viewer") { + exists = true; + isChecked = role.isChecked; + className = role.roleId; + break; + } + } + if (exists) { + this.eGui = document.createElement('input'); + this.eGui.className = className; + this.eGui.type = 'checkbox'; + this.eGui.checked = isChecked; + this.checkedHandler = this.checkedHandler.bind(this); + this.eGui.addEventListener('click', this.checkedHandler); + // if higher role rights are checked as well + if (isChecked && anyHigherRoleIsChecked(params.data.roles, "viewer")) { + this.eGui.disabled = true; + } + } + }; + CheckboxRenderer_viewer.prototype.checkedHandler = function (e) { + let checked = e.target.checked; + for (const role of this.params.data.roles) { + if (role.permissionLevel == "viewer") { + role.isChecked = checked; + break; + } } - return ""; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - if(params.data.jobData && params.data.jobData.targetIndicatorId){ - let indicatorMetadata = kommonitorDataExchangeService.getIndicatorMetadataById(params.data.jobData.targetIndicatorId); - if (indicatorMetadata){ - return indicatorMetadata.indicatorName; + }; + CheckboxRenderer_viewer.prototype.getGui = function (params) { + return this.eGui; + }; + CheckboxRenderer_viewer.prototype.destroy = function (params) { + if (this.eGui) { + this.eGui.removeEventListener('click', this.checkedHandler); + } + }; + function CheckboxRenderer_editor() { } + CheckboxRenderer_editor.prototype.init = function (params) { + this.params = params; + let isChecked = false; + let exists = false; + let className; + for (const role of params.data.roles) { + if (role.permissionLevel == "editor") { + exists = true; + isChecked = role.isChecked; + className = role.roleId; + break; } - } - return ""; - } - }, - { headerName: 'Job-Status', field: "status", maxWidth: 125 }, - { headerName: 'Job-Fortschritt', field: "progress", maxWidth: 125 }, - { headerName: 'Job-Data', minWidth: 500, cellRenderer: function (params) { - return kommonitorDataExchangeService.syntaxHighlightJSON(params.data.jobData); - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return params.data.jobData; - } - }, - { headerName: 'Job-Logs', maxWidth: 150, cellRenderer: function (params) { - if(params.data.logs){ - - var logJSON = JSON.stringify(params.data.logs); - - var blob = new Blob([logJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - let html = ''; - return html; - } - else{ - return "Dieser Job umfasst keine Logs"; } - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return params.data.logs; - } - }, - { headerName: 'Job-Summary', minWidth: 1000, cellRenderer: function (params) { - - let html = ""; - if(params.data.spatialUnitIntegrationSummary && params.data.spatialUnitIntegrationSummary.length > 0){ - html += ''; - - for (const item of params.data.spatialUnitIntegrationSummary) { - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - if(item.errorsOccurred && item.errorsOccurred.length > 0){ - html += ""; + if (exists) { + this.eGui = document.createElement('input'); + this.eGui.className = className; + this.eGui.type = 'checkbox'; + this.eGui.checked = isChecked; + this.checkedHandler = this.checkedHandler.bind(this); + this.eGui.addEventListener('click', this.checkedHandler); + // if higher role rights are checked as well + if (isChecked && anyHigherRoleIsChecked(params.data.roles, "editor")) { + this.eGui.disabled = true; + } + } + }; + CheckboxRenderer_editor.prototype.checkedHandler = function (e) { + let checked = e.target.checked; + for (const role of this.params.data.roles) { + if (role.permissionLevel == "viewer") { + if (checked) { + role.isChecked = true; + $('.' + role.roleId).attr('disabled', true); + $('.' + role.roleId).prop("checked", true); } - else{ - html += ""; + else { + $('.' + role.roleId).attr('disabled', false); } - - html += ""; - } - html += "
        Raumeinheits-IdRaumeinheits-NameAnzahl integrierter Indikatoren-FeaturesAnzahl integrierter Zeitstempelintegrierte ZeitstempelFehlermeldung
        " + item.spatialUnitId + "" + item.spatialUnitName + "" + item.numberOfIntegratedIndicatorFeatures + "" + item.numberOfIntegratedTargetDates + "" + item.integratedTargetDates + "" + kommonitorDataExchangeService.syntaxHighlightJSON(item.errorsOccurred) + "keine Fehlermeldungen vorhanden
        "; } - else{ - html += "Dieser Job umfasst keine Informationen zur erfolgreichen/gescheiterten Datenintegration"; + else if (role.permissionLevel == "editor") { + role.isChecked = checked; } - - return html; - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return JSON.stringify(params.data.spatialUnitIntegrationSummary); - } - } - - ]; - - return columnDefs; - }; - - this.buildDataGridRowData_defaultJobs = function(dataArray){ - - dataArray.sort((a, b) => b.jobId - a.jobId); - - return dataArray; - }; - - this.buildDataGridOptions_defaultJobs = function(jobsArray){ - let columnDefs = this.buildDataGridColumnConfig_defaultJobs(); - let rowData = this.buildDataGridRowData_defaultJobs(jobsArray); - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - columnDefs: columnDefs, - rowData: rowData, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_scripts); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_scripts); } - - }; - - return gridOptions; - }; - - this.buildDataGrid_defaultJobs = function (jobsArray) { - - if (this.dataGridOptions_defaultJobs && this.dataGridOptions_defaultJobs.api && document.querySelector('#jobExecutionTable_defaultComputation').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_defaultJobs); - let newRowData = this.buildDataGridRowData_defaultJobs(jobsArray); - this.dataGridOptions_defaultJobs.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_defaultJobs); - } - else { - this.dataGridOptions_defaultJobs = this.buildDataGridOptions_defaultJobs(jobsArray); - let gridDiv = document.querySelector('#jobExecutionTable_defaultComputation'); - new agGrid.Grid(gridDiv, this.dataGridOptions_defaultJobs); - } - }; - - // CUSTOMIZED JOBS OVERVIEW TABLE - - this.buildDataGridColumnConfig_customizedJobs = function(){ - const columnDefs = [ - { headerName: 'Job-Id', field: "jobId", pinned: 'left', maxWidth: 125, checkboxSelection: true, headerCheckboxSelection: true, - headerCheckboxSelectionFilteredOnly: true}, - { headerName: 'Job-Status', field: "status", maxWidth: 125 }, - { headerName: 'Job-Fortschritt', field: "progress", maxWidth: 125 }, - { headerName: 'Job-Data', minWidth: 500, cellRenderer: function (params) { - return kommonitorDataExchangeService.syntaxHighlightJSON(params.data.jobData); - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return params.data.jobData; - } - }, - { headerName: 'Job-Logs', maxWidth: 150, cellRenderer: function (params) { - if(params.data.logs){ - - var logJSON = JSON.stringify(params.data.logs); - - var blob = new Blob([logJSON], {type: "application/json"}); - var data = URL.createObjectURL(blob); - - let html = ''; - return html; - } - else{ - return "Dieser Job umfasst keine Logs"; - } - }, - filter: 'agTextColumnFilter', - filterValueGetter: (params) => { - return params.data.logs; - } - } - - ]; - - return columnDefs; - }; - - this.buildDataGridRowData_customizedJobs = function(dataArray){ - - dataArray.sort((a, b) => b.jobId - a.jobId); - - return dataArray; - }; - - this.buildDataGridOptions_customizedJobs = function(jobsArray){ - let columnDefs = this.buildDataGridColumnConfig_customizedJobs(); - let rowData = this.buildDataGridRowData_customizedJobs(jobsArray); - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: true, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - columnDefs: columnDefs, - rowData: rowData, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: true, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 10, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - headerHeightSetter(self.dataGridOptions_scripts); - }, - onColumnResized: function () { - headerHeightSetter(self.dataGridOptions_scripts); + }; + CheckboxRenderer_editor.prototype.getGui = function (params) { + return this.eGui; + }; + CheckboxRenderer_editor.prototype.destroy = function (params) { + if (this.eGui) { + this.eGui.removeEventListener('click', this.checkedHandler); } - - }; - - return gridOptions; - }; - - this.buildDataGrid_customizedJobs = function (jobsArray) { - - if (this.dataGridOptions_customizedJobs && this.dataGridOptions_customizedJobs.api && document.querySelector('#jobExecutionTable_customizedComputation').childElementCount > 0) { - - this.saveGridStore(this.dataGridOptions_customizedJobs); - let newRowData = this.buildDataGridRowData_customizedJobs(jobsArray); - this.dataGridOptions_customizedJobs.api.setRowData(newRowData); - this.restoreGridStore(this.dataGridOptions_customizedJobs); - } - else { - this.dataGridOptions_customizedJobs = this.buildDataGridOptions_customizedJobs(jobsArray); - let gridDiv = document.querySelector('#jobExecutionTable_customizedComputation'); - new agGrid.Grid(gridDiv, this.dataGridOptions_customizedJobs); - } - }; - - function anyHigherRoleIsChecked(roles, roleSuffix){ - let filteresRoles = []; - - if(roleSuffix == "viewer"){ - filteresRoles = roles.filter(function(role){ - if (role.isChecked && (role.permissionLevel == "editor" || role.permissionLevel == "creator")){ - return true; + }; + function CheckboxRenderer_creator() { } + CheckboxRenderer_creator.prototype.init = function (params) { + this.params = params; + let isChecked = false; + let exists = false; + let className; + for (const role of params.data.roles) { + if (role.permissionLevel == "creator") { + exists = true; + isChecked = role.isChecked; + className = role.roleId; + break; + } } - }); - } - else if (roleSuffix == "editor"){ - filteresRoles = roles.filter(function(role){ - if (role.isChecked && role.permissionLevel == "creator"){ - return true; + if (exists) { + this.eGui = document.createElement('input'); + this.eGui.className = className; + this.eGui.type = 'checkbox'; + this.eGui.checked = isChecked; + this.checkedHandler = this.checkedHandler.bind(this); + this.eGui.addEventListener('click', this.checkedHandler); } - }); - } - - return filteresRoles.length > 0; - }; - - function CheckboxRenderer_viewer() {} - - CheckboxRenderer_viewer.prototype.init = function(params) { - this.params = params; - - let isChecked = false; - let exists = false; - let className; - for (const role of params.data.roles) { - if (role.permissionLevel == "viewer"){ - exists = true; - isChecked = role.isChecked; - className = role.roleId; - break; - } - } - - if(exists){ - this.eGui = document.createElement('input'); - this.eGui.className = className; - this.eGui.type = 'checkbox'; - this.eGui.checked = isChecked; - - this.checkedHandler = this.checkedHandler.bind(this); - this.eGui.addEventListener('click', this.checkedHandler); - // if higher role rights are checked as well - if(isChecked && anyHigherRoleIsChecked(params.data.roles, "viewer")){ - this.eGui.disabled = true; - } - } - }; - - CheckboxRenderer_viewer.prototype.checkedHandler = function(e) { - let checked = e.target.checked; - for (const role of this.params.data.roles) { - if (role.permissionLevel == "viewer"){ - role.isChecked = checked; - break; - } - } - }; - - CheckboxRenderer_viewer.prototype.getGui = function(params) { - return this.eGui; - }; - - CheckboxRenderer_viewer.prototype.destroy = function(params) { - if(this.eGui){ - this.eGui.removeEventListener('click', this.checkedHandler); - } - }; - - function CheckboxRenderer_editor() {} - - CheckboxRenderer_editor.prototype.init = function(params) { - this.params = params; - - let isChecked = false; - let exists = false; - let className; - for (const role of params.data.roles) { - if (role.permissionLevel == "editor"){ - exists = true; - isChecked = role.isChecked; - className = role.roleId; - break; - } - } - - if(exists){ - this.eGui = document.createElement('input'); - this.eGui.className = className; - this.eGui.type = 'checkbox'; - this.eGui.checked = isChecked; - - this.checkedHandler = this.checkedHandler.bind(this); - this.eGui.addEventListener('click', this.checkedHandler); - // if higher role rights are checked as well - if(isChecked && anyHigherRoleIsChecked(params.data.roles, "editor")){ - this.eGui.disabled = true; - } - } - }; - - CheckboxRenderer_editor.prototype.checkedHandler = function(e) { - let checked = e.target.checked; - for (const role of this.params.data.roles) { - if (role.permissionLevel == "viewer"){ - if (checked){ - role.isChecked = true; - $('.' + role.roleId).attr('disabled', true); - $('.' + role.roleId).prop("checked", true); - } - else{ - $('.' + role.roleId).attr('disabled', false); + }; + CheckboxRenderer_creator.prototype.checkedHandler = function (e) { + let checked = e.target.checked; + for (const role of this.params.data.roles) { + if (role.permissionLevel == "editor") { + if (checked) { + role.isChecked = true; + $('.' + role.roleId).attr('disabled', true); + $('.' + role.roleId).prop("checked", true); + } + else { + $('.' + role.roleId).attr('disabled', false); + } + } + else if (role.permissionLevel == "viewer") { + if (checked) { + role.isChecked = true; + $('.' + role.roleId).attr('disabled', true); + $('.' + role.roleId).prop("checked", true); + } + else { + $('.' + role.roleId).attr('disabled', true); + } + } + else if (role.permissionLevel == "creator" || role.permissionLevel == "editor" || role.permissionLevel == "viewer") { + role.isChecked = checked; + } } - } - else if (role.permissionLevel == "editor"){ - role.isChecked = checked; - } - } - }; - - CheckboxRenderer_editor.prototype.getGui = function(params) { - return this.eGui; - }; - - CheckboxRenderer_editor.prototype.destroy = function(params) { - if(this.eGui){ - this.eGui.removeEventListener('click', this.checkedHandler); - } - }; - - function CheckboxRenderer_creator() {} - - CheckboxRenderer_creator.prototype.init = function(params) { - this.params = params; - - let isChecked = false; - let exists = false; - let className; - for (const role of params.data.roles) { - if (role.permissionLevel == "creator"){ - exists = true; - isChecked = role.isChecked; - className = role.roleId; - break; - } - } - - if(exists){ - this.eGui = document.createElement('input'); - this.eGui.className = className; - this.eGui.type = 'checkbox'; - this.eGui.checked = isChecked; - - this.checkedHandler = this.checkedHandler.bind(this); - this.eGui.addEventListener('click', this.checkedHandler); - } - }; - - CheckboxRenderer_creator.prototype.checkedHandler = function(e) { - let checked = e.target.checked; - for (const role of this.params.data.roles) { - if (role.permissionLevel == "editor"){ - if (checked){ - role.isChecked = true; - $('.' + role.roleId).attr('disabled', true); - $('.' + role.roleId).prop("checked", true); - } - else{ - $('.' + role.roleId).attr('disabled', false); + }; + CheckboxRenderer_creator.prototype.getGui = function (params) { + return this.eGui; + }; + CheckboxRenderer_creator.prototype.destroy = function (params) { + if (this.eGui) { + this.eGui.removeEventListener('click', this.checkedHandler); + } + }; + this.buildRoleManagementGridRowData = function (accessControlMetadata, selectedRoleIds) { + let data = JSON.parse(JSON.stringify(accessControlMetadata)); + for (let elem of data) { + for (let role of elem.roles) { + role.isChecked = false; + if (selectedRoleIds && selectedRoleIds.includes(role.roleId)) { + role.isChecked = true; + } + } + } + let array = []; + array.push(data[0]); + array.push(data[1]); + data.splice(0, 2); + data.sort(function (a, b) { + if (a.name < b.name) { + return -1; + } + if (a.name > b.name) { + return 1; + } + return 0; + }); + array = array.concat(data); + return array; + }; + this.buildRoleManagementGridColumnConfig = function () { + let columnDefs = []; + return columnDefs.concat([ + { headerName: 'Organisationseinheit', field: "name", minWidth: 200 }, + { headerName: 'lesen', field: "roles", filter: false, sortable: false, maxWidth: 100, cellRenderer: 'checkboxRenderer_viewer', }, + { headerName: 'editieren', field: "roles", filter: false, sortable: false, maxWidth: 100, cellRenderer: 'checkboxRenderer_editor', }, + { headerName: 'löschen', field: "roles", filter: false, sortable: false, maxWidth: 100, cellRenderer: 'checkboxRenderer_creator', } + ]); + }; + this.buildRoleManagementGridOptions = function (accessControlMetadata, selectedRoleIds) { + let columnDefs = this.buildRoleManagementGridColumnConfig(); + let rowData = this.buildRoleManagementGridRowData(accessControlMetadata, selectedRoleIds); + let components = { + checkboxRenderer_viewer: CheckboxRenderer_viewer, + checkboxRenderer_editor: CheckboxRenderer_editor, + checkboxRenderer_creator: CheckboxRenderer_creator + }; + let gridOptions = { + defaultColDef: { + editable: false, + sortable: true, + flex: 1, + minWidth: 200, + filter: true, + floatingFilter: false, + // filterParams: { + // newRowsAction: 'keep' + // }, + resizable: true, + wrapText: true, + autoHeight: true, + cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, + headerComponentParams: { + template: '', + }, + }, + components: components, + floatingFilter: false, + columnDefs: columnDefs, + rowData: rowData, + rowHeight: 10, + suppressRowClickSelection: true, + rowSelection: 'multiple', + enableCellTextSelection: false, + ensureDomOrder: true, + pagination: true, + paginationPageSize: 5, + suppressColumnVirtualisation: true, + onFirstDataRendered: function () { + }, + onColumnResized: function () { + self.registerClickHandler_accessControl(accessControlMetadata); + }, + onRowDataChanged: function () { + self.registerClickHandler_accessControl(accessControlMetadata); + }, + onModelUpdated: function () { + self.registerClickHandler_accessControl(accessControlMetadata); + }, + onViewportChanged: function () { + self.registerClickHandler_accessControl(accessControlMetadata); + }, + }; + return gridOptions; + }; + this.buildRoleManagementGrid = function (tableDOMId, currentTableOptionsObject, accessControlMetadata, selectedRoleIds) { + if (currentTableOptionsObject && currentTableOptionsObject.api) { + let newRowData = this.buildRoleManagementGridRowData(accessControlMetadata, selectedRoleIds); + currentTableOptionsObject.api.setRowData(newRowData); } - } - else if (role.permissionLevel == "viewer"){ - if (checked){ - role.isChecked = true; - $('.' + role.roleId).attr('disabled', true); - $('.' + role.roleId).prop("checked", true); - } - else{ - $('.' + role.roleId).attr('disabled', true); + else { + currentTableOptionsObject = this.buildRoleManagementGridOptions(accessControlMetadata, selectedRoleIds); + let gridDiv = document.querySelector('#' + tableDOMId); + new agGrid.Grid(gridDiv, currentTableOptionsObject); } - } - else if (role.permissionLevel == "creator" || role.permissionLevel == "editor" || role.permissionLevel == "viewer"){ - role.isChecked = checked; - } - } - }; - - CheckboxRenderer_creator.prototype.getGui = function(params) { - return this.eGui; - }; - - CheckboxRenderer_creator.prototype.destroy = function(params) { - if(this.eGui){ - this.eGui.removeEventListener('click', this.checkedHandler); - } - }; - - this.buildRoleManagementGridRowData = function(accessControlMetadata, selectedRoleIds){ - let data = JSON.parse(JSON.stringify(accessControlMetadata)); - for (let elem of data) { - for (let role of elem.roles) { - role.isChecked = false; - if (selectedRoleIds && selectedRoleIds.includes(role.roleId)){ - role.isChecked = true; + return currentTableOptionsObject; + }; + this.getSelectedRoleIds_roleManagementGrid = function (roleManagementTableOptions) { + let ids = []; + if (roleManagementTableOptions && roleManagementTableOptions.api) { + roleManagementTableOptions.api.forEachNode(function (node, index) { + for (const role of node.data.roles) { + if (role && role.isChecked) { + ids.push(role.roleId); + } + } + }); } - } - } - - let array = []; - array.push(data[0]); - array.push(data[1]); - - data.splice(0,2); - data.sort(function (a, b) { - if (a.name < b.name) { - return -1; - } - if (a.name > b.name) { - return 1; - } - return 0; - }); - - array = array.concat(data); - - return array; - }; - - this.buildRoleManagementGridColumnConfig = function(){ - let columnDefs = []; - - return columnDefs.concat([ - { headerName: 'Organisationseinheit', field: "name", minWidth: 200 }, - { headerName: 'lesen', field: "roles", filter: false, sortable: false, maxWidth: 100, cellRenderer: 'checkboxRenderer_viewer', }, - { headerName: 'editieren', field: "roles", filter: false, sortable: false, maxWidth: 100, cellRenderer: 'checkboxRenderer_editor', }, - { headerName: 'löschen', field: "roles", filter: false, sortable: false, maxWidth: 100, cellRenderer: 'checkboxRenderer_creator', } - ]); - }; - - this.buildRoleManagementGridOptions = function(accessControlMetadata, selectedRoleIds){ - let columnDefs = this.buildRoleManagementGridColumnConfig(); - let rowData = this.buildRoleManagementGridRowData(accessControlMetadata, selectedRoleIds); - - let components = { - checkboxRenderer_viewer: CheckboxRenderer_viewer, - checkboxRenderer_editor: CheckboxRenderer_editor, - checkboxRenderer_creator: CheckboxRenderer_creator - }; - - let gridOptions = { - defaultColDef: { - editable: false, - sortable: true, - flex: 1, - minWidth: 200, - filter: true, - floatingFilter: false, - // filterParams: { - // newRowsAction: 'keep' - // }, - resizable: true, - wrapText: true, - autoHeight: true, - cellStyle: { 'font-size': '12px;', 'white-space': 'normal !important', "line-height": "20px !important", "word-break": "break-word !important", "padding-top": "17px", "padding-bottom": "17px" }, - headerComponentParams: { - template: - '', - }, - }, - components: components, - floatingFilter: false, - columnDefs: columnDefs, - rowData: rowData, - rowHeight: 10, - suppressRowClickSelection: true, - rowSelection: 'multiple', - enableCellTextSelection: false, - ensureDomOrder: true, - pagination: true, - paginationPageSize: 5, - suppressColumnVirtualisation: true, - onFirstDataRendered: function () { - }, - onColumnResized: function () { - self.registerClickHandler_accessControl(accessControlMetadata); - }, - onRowDataChanged: function () { - self.registerClickHandler_accessControl(accessControlMetadata); - }, - onModelUpdated: function () { - self.registerClickHandler_accessControl(accessControlMetadata); - }, - onViewportChanged: function () { - self.registerClickHandler_accessControl(accessControlMetadata); - }, - - }; - - return gridOptions; - }; - - this.buildRoleManagementGrid = function(tableDOMId, currentTableOptionsObject, accessControlMetadata, selectedRoleIds){ - if (currentTableOptionsObject && currentTableOptionsObject.api) { - - let newRowData = this.buildRoleManagementGridRowData(accessControlMetadata, selectedRoleIds); - currentTableOptionsObject.api.setRowData(newRowData); - } - else { - currentTableOptionsObject = this.buildRoleManagementGridOptions(accessControlMetadata, selectedRoleIds); - let gridDiv = document.querySelector('#' + tableDOMId); - new agGrid.Grid(gridDiv, currentTableOptionsObject); - } - return currentTableOptionsObject; - }; - - this.getSelectedRoleIds_roleManagementGrid = function(roleManagementTableOptions){ - let ids = []; - if (roleManagementTableOptions && roleManagementTableOptions.api){ - - roleManagementTableOptions.api.forEachNode(function(node, index){ - for (const role of node.data.roles) { - if(role && role.isChecked){ - ids.push(role.roleId); - } + return ids; + }; + this.saveGridStore = function (gridOptions) { + window.colState = gridOptions.columnApi.getColumnState(); + window.filterState = gridOptions.api.getFilterModel(); + }; + this.restoreGridStore = function (gridOptions) { + // gridOptions.columnApi.setColumnState(window.colState); + // gridOptions.columnApi.setColumnGroupState(window.groupState); + if (window.colState) { + gridOptions.columnApi.applyColumnState({ state: window.colState, applyOrder: true }); } - }) - } - return ids; - }; - - this.saveGridStore = function (gridOptions) { - window.colState = gridOptions.columnApi.getColumnState(); - window.filterState = gridOptions.api.getFilterModel(); - - }; - - this.restoreGridStore = function (gridOptions) { - // gridOptions.columnApi.setColumnState(window.colState); - // gridOptions.columnApi.setColumnGroupState(window.groupState); - if (window.colState) { - gridOptions.columnApi.applyColumnState({ state: window.colState, applyOrder: true }); - } - - if (window.filterState) { - gridOptions.api.setFilterModel(window.filterState); - } - }; - + if (window.filterState) { + gridOptions.api.setFilterModel(window.filterState); + } + }; }]); +//# sourceMappingURL=kommonitor-data-grid-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorDataGridHelperService/kommonitor-data-grid-helper-service.module.js.map b/app/util/genericServices/kommonitorDataGridHelperService/kommonitor-data-grid-helper-service.module.js.map new file mode 100644 index 000000000..d05651885 --- /dev/null +++ b/app/util/genericServices/kommonitorDataGridHelperService/kommonitor-data-grid-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-data-grid-helper-service.module.js","sourceRoot":"","sources":["kommonitor-data-grid-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorDiagramHelperService/kommonitor-diagram-helper-service.module.js b/app/util/genericServices/kommonitorDiagramHelperService/kommonitor-diagram-helper-service.module.js index b25aaf9af..fc84ed1f0 100644 --- a/app/util/genericServices/kommonitorDiagramHelperService/kommonitor-diagram-helper-service.module.js +++ b/app/util/genericServices/kommonitorDiagramHelperService/kommonitor-diagram-helper-service.module.js @@ -1,5 +1,5 @@ +"use strict"; angular.module('kommonitorDiagramHelper', ['kommonitorMap', 'kommonitorDataExchange']); - /** * a common serviceInstance that holds all needed properties for a WPS service. * @@ -10,2063 +10,1771 @@ angular.module('kommonitorDiagramHelper', ['kommonitorMap', 'kommonitorDataExcha * parameters for each WPS operation represented by different Angular components */ angular - .module('kommonitorDiagramHelper', ["kommonitorFilterHelper"]) - .service( - 'kommonitorDiagramHelperService', ['$rootScope', '$timeout', 'kommonitorMapService', 'kommonitorDataExchangeService', + .module('kommonitorDiagramHelper', ["kommonitorFilterHelper"]) + .service('kommonitorDiagramHelperService', ['$rootScope', '$timeout', 'kommonitorMapService', 'kommonitorDataExchangeService', 'kommonitorFilterHelperService', '$http', '__env', '$q', - function ($rootScope, $timeout, - kommonitorMapService, kommonitorDataExchangeService, kommonitorFilterHelperService, $http, __env, $q) { - - const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; - const defaultColorForHoveredFeatures = __env.defaultColorForHoveredFeatures; - const defaultColorForClickedFeatures = __env.defaultColorForClickedFeatures; - - var numberOfDecimals = __env.numberOfDecimals; - var defaultColorForZeroValues = __env.defaultColorForZeroValues; - var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; - var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; - - const defaultColorForOutliers_high = __env.defaultColorForOutliers_high; - const defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; - const defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; - const defaultColorForOutliers_low = __env.defaultColorForOutliers_low; - const defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; - const defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; - - this.indicatorPropertyName = ""; - - this.barChartOptions = {}; - this.lineChartOptions = {}; - this.histogramChartOptions = {}; - this.radarChartOptions = {}; - this.regressionChartOptions = {}; - - this.isCloserToTargetDate = function(date, closestDate, targetDate){ - var targetYear = targetDate.split("-")[0]; - var targetMonth = targetDate.split("-")[1]; - var targetDay = targetDate.split("-")[2]; - - var closestDateComps = closestDate.split("-"); - var closestDateYear = closestDateComps[0]; - var closestDateMonth = closestDateComps[1]; - var closestDateDay = closestDateComps[2]; - - var dateComps = date.split("-"); - var year = dateComps[0]; - var month = dateComps[1]; - var day = dateComps[2]; - - var monthDiff_closestDate = Math.abs(targetMonth - closestDateMonth); - var monthDiff_date = Math.abs(targetMonth - month); - - if(monthDiff_date <= monthDiff_closestDate){ - var dayDiff_closestDate = Math.abs(targetDay - closestDateDay); - var dayDiff_date = Math.abs(targetDay - day); - - if(dayDiff_date < dayDiff_closestDate){ - return true; - } - } - return false; - }; - - this.findClostestTimestamForTargetDate = function(indicatorForRadar, targetDate){ - var applicableDates = indicatorForRadar.indicatorMetadata.applicableDates; - - var targetYear = targetDate.split("-")[0]; - var targetMonth = targetDate.split("-")[1]; - var targetDay = targetDate.split("-")[2]; - - var closestDate = undefined; - - for (var date of applicableDates) { - var dateComps = date.split("-"); - var year = dateComps[0]; - var month = dateComps[1]; - var day = dateComps[2]; - - if(targetDate.includes(year)){ - if(! closestDate){ - closestDate = date; + function ($rootScope, $timeout, kommonitorMapService, kommonitorDataExchangeService, kommonitorFilterHelperService, $http, __env, $q) { + const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; + const defaultColorForHoveredFeatures = __env.defaultColorForHoveredFeatures; + const defaultColorForClickedFeatures = __env.defaultColorForClickedFeatures; + var numberOfDecimals = __env.numberOfDecimals; + var defaultColorForZeroValues = __env.defaultColorForZeroValues; + var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; + var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; + const defaultColorForOutliers_high = __env.defaultColorForOutliers_high; + const defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; + const defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; + const defaultColorForOutliers_low = __env.defaultColorForOutliers_low; + const defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; + const defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; + this.indicatorPropertyName = ""; + this.barChartOptions = {}; + this.lineChartOptions = {}; + this.histogramChartOptions = {}; + this.radarChartOptions = {}; + this.regressionChartOptions = {}; + this.isCloserToTargetDate = function (date, closestDate, targetDate) { + var targetYear = targetDate.split("-")[0]; + var targetMonth = targetDate.split("-")[1]; + var targetDay = targetDate.split("-")[2]; + var closestDateComps = closestDate.split("-"); + var closestDateYear = closestDateComps[0]; + var closestDateMonth = closestDateComps[1]; + var closestDateDay = closestDateComps[2]; + var dateComps = date.split("-"); + var year = dateComps[0]; + var month = dateComps[1]; + var day = dateComps[2]; + var monthDiff_closestDate = Math.abs(targetMonth - closestDateMonth); + var monthDiff_date = Math.abs(targetMonth - month); + if (monthDiff_date <= monthDiff_closestDate) { + var dayDiff_closestDate = Math.abs(targetDay - closestDateDay); + var dayDiff_date = Math.abs(targetDay - day); + if (dayDiff_date < dayDiff_closestDate) { + return true; + } } - else{ - if(this.isCloserToTargetDate(date, closestDate, targetDate)){ - closestDate = date; - } + return false; + }; + this.findClostestTimestamForTargetDate = function (indicatorForRadar, targetDate) { + var applicableDates = indicatorForRadar.indicatorMetadata.applicableDates; + var targetYear = targetDate.split("-")[0]; + var targetMonth = targetDate.split("-")[1]; + var targetDay = targetDate.split("-")[2]; + var closestDate = undefined; + for (var date of applicableDates) { + var dateComps = date.split("-"); + var year = dateComps[0]; + var month = dateComps[1]; + var day = dateComps[2]; + if (targetDate.includes(year)) { + if (!closestDate) { + closestDate = date; + } + else { + if (this.isCloserToTargetDate(date, closestDate, targetDate)) { + closestDate = date; + } + } + } } - - } - } - - return closestDate; - }; - - // an array of only the properties and metadata of all indicatorFeatures - this.indicatorPropertiesForCurrentSpatialUnitAndTime; - - this.filterSameUnitAndSameTime = false; - - this.setupIndicatorPropertiesForCurrentSpatialUnitAndTime = function (filterBySameUnitAndSameTime) { - - $rootScope.$broadcast("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup begin"); - - this.indicatorPropertiesForCurrentSpatialUnitAndTime = []; - - kommonitorDataExchangeService.displayableIndicators.forEach(indicatorMetadata => { - var targetYear = kommonitorDataExchangeService.selectedDate.split("-")[0]; - var indicatorCandidateYears = [] - indicatorMetadata.applicableDates.forEach((date, i) => { - indicatorCandidateYears.push(date.split("-")[0]); - }); - - - // if (indicatorCandidateYears.includes(targetYear) && indicatorMetadata.applicableSpatialUnits.some(o => o.spatialUnitName === kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel)) { - // var selectableIndicatorEntry = {}; - // selectableIndicatorEntry.indicatorProperties = null; - // // per default show no indicators on radar - // selectableIndicatorEntry.isSelected = false; - // selectableIndicatorEntry.indicatorMetadata = indicatorMetadata; - // selectableIndicatorEntry.closestTimestamp = undefined; - - // this.indicatorPropertiesForCurrentSpatialUnitAndTime.push(selectableIndicatorEntry); - // } - - if (indicatorMetadata.applicableSpatialUnits.some(o => o.spatialUnitName === kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel)) { - var canBeAdded = true; - - if(filterBySameUnitAndSameTime){ - if(indicatorCandidateYears.includes(targetYear)){ - canBeAdded = true; - } - else{ - canBeAdded = false; - } + return closestDate; + }; + // an array of only the properties and metadata of all indicatorFeatures + this.indicatorPropertiesForCurrentSpatialUnitAndTime; + this.filterSameUnitAndSameTime = false; + this.setupIndicatorPropertiesForCurrentSpatialUnitAndTime = function (filterBySameUnitAndSameTime) { + $rootScope.$broadcast("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup begin"); + this.indicatorPropertiesForCurrentSpatialUnitAndTime = []; + kommonitorDataExchangeService.displayableIndicators.forEach(indicatorMetadata => { + var targetYear = kommonitorDataExchangeService.selectedDate.split("-")[0]; + var indicatorCandidateYears = []; + indicatorMetadata.applicableDates.forEach((date, i) => { + indicatorCandidateYears.push(date.split("-")[0]); + }); + // if (indicatorCandidateYears.includes(targetYear) && indicatorMetadata.applicableSpatialUnits.some(o => o.spatialUnitName === kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel)) { + // var selectableIndicatorEntry = {}; + // selectableIndicatorEntry.indicatorProperties = null; + // // per default show no indicators on radar + // selectableIndicatorEntry.isSelected = false; + // selectableIndicatorEntry.indicatorMetadata = indicatorMetadata; + // selectableIndicatorEntry.closestTimestamp = undefined; + // this.indicatorPropertiesForCurrentSpatialUnitAndTime.push(selectableIndicatorEntry); + // } + if (indicatorMetadata.applicableSpatialUnits.some(o => o.spatialUnitName === kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel)) { + var canBeAdded = true; + if (filterBySameUnitAndSameTime) { + if (indicatorCandidateYears.includes(targetYear)) { + canBeAdded = true; + } + else { + canBeAdded = false; + } + } + if (canBeAdded) { + var selectableIndicatorEntry = {}; + selectableIndicatorEntry.indicatorProperties = null; + // per default show no indicators on radar + selectableIndicatorEntry.isSelected = false; + selectableIndicatorEntry.indicatorMetadata = indicatorMetadata; + // selectableIndicatorEntry.closestTimestamp = undefined; + this.indicatorPropertiesForCurrentSpatialUnitAndTime.push(selectableIndicatorEntry); + } + } + }); + $rootScope.$broadcast("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup completed"); + }; + this.fetchIndicatorPropertiesIfNotExists = async function (index) { + if (this.indicatorPropertiesForCurrentSpatialUnitAndTime[index].indicatorProperties === null || this.indicatorPropertiesForCurrentSpatialUnitAndTime[index].indicatorProperties === undefined) { + // var dateComps = kommonitorDataExchangeService.selectedDate.split("-"); + // + // var year = dateComps[0]; + // var month = dateComps[1]; + // var day = dateComps[2]; + this.indicatorPropertiesForCurrentSpatialUnitAndTime[index].indicatorProperties = await this.fetchIndicatorProperties(this.indicatorPropertiesForCurrentSpatialUnitAndTime[index].indicatorMetadata, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitId); } - - if (canBeAdded){ - var selectableIndicatorEntry = {}; - selectableIndicatorEntry.indicatorProperties = null; - // per default show no indicators on radar - selectableIndicatorEntry.isSelected = false; - selectableIndicatorEntry.indicatorMetadata = indicatorMetadata; - // selectableIndicatorEntry.closestTimestamp = undefined; - - this.indicatorPropertiesForCurrentSpatialUnitAndTime.push(selectableIndicatorEntry); + }; + this.fetchIndicatorProperties = function (indicatorMetadata, spatialUnitId) { + return $http({ + url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/indicators/" + indicatorMetadata.indicatorId + "/" + spatialUnitId + "/without-geometry", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + kommonitorDataExchangeService.displayMapApplicationError(error); + }); + }; + this.getColorFromBrewInstance = function (brewInstance, feature, targetDate) { + var color; + for (var index = 0; index < brewInstance.breaks.length; index++) { + if (kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(feature.properties, targetDate) == kommonitorDataExchangeService.getIndicatorValue_asNumber(brewInstance.breaks[index])) { + if (index < brewInstance.breaks.length - 1) { + // min value + color = brewInstance.colors[index]; + break; + } + else { + //max value + if (brewInstance.colors[index]) { + color = brewInstance.colors[index]; + } + else { + color = brewInstance.colors[index - 1]; + } + break; + } + } + else { + if (kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(feature.properties, targetDate) < kommonitorDataExchangeService.getIndicatorValue_asNumber(brewInstance.breaks[index + 1])) { + color = brewInstance.colors[index]; + break; + } + } } - - } - }); - - $rootScope.$broadcast("allIndicatorPropertiesForCurrentSpatialUnitAndTime setup completed"); - }; - - this.fetchIndicatorPropertiesIfNotExists = async function(index){ - if(this.indicatorPropertiesForCurrentSpatialUnitAndTime[index].indicatorProperties === null || this.indicatorPropertiesForCurrentSpatialUnitAndTime[index].indicatorProperties === undefined){ - // var dateComps = kommonitorDataExchangeService.selectedDate.split("-"); - // - // var year = dateComps[0]; - // var month = dateComps[1]; - // var day = dateComps[2]; - - this.indicatorPropertiesForCurrentSpatialUnitAndTime[index].indicatorProperties = await this.fetchIndicatorProperties(this.indicatorPropertiesForCurrentSpatialUnitAndTime[index].indicatorMetadata, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitId); - } - }; - - this.fetchIndicatorProperties = function (indicatorMetadata, spatialUnitId) { - return $http({ - url: kommonitorDataExchangeService.getBaseUrlToKomMonitorDataAPI_spatialResource() + "/indicators/" + indicatorMetadata.indicatorId + "/" + spatialUnitId + "/without-geometry", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - return response.data; - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - kommonitorDataExchangeService.displayMapApplicationError(error); - }); - }; - - this.getColorFromBrewInstance = function(brewInstance, feature, targetDate){ - var color; - for (var index=0; index < brewInstance.breaks.length; index++){ - - if(kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(feature.properties, targetDate) == kommonitorDataExchangeService.getIndicatorValue_asNumber(brewInstance.breaks[index])){ - if(index < brewInstance.breaks.length -1){ - // min value - color = brewInstance.colors[index]; - break; + return color; + }; + this.getColorForFeature = function (feature, indicatorMetadataAndGeoJSON, targetDate, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue) { + var color; + if (!targetDate.includes(INDICATOR_DATE_PREFIX)) { + targetDate = INDICATOR_DATE_PREFIX + targetDate; } - else { - //max value - if (brewInstance.colors[index]){ - color = brewInstance.colors[index]; - } - else{ - color = brewInstance.colors[index - 1]; - } - break; + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[targetDate])) { + color = defaultColorForNoDataValues; } - } - else{ - if(kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(feature.properties, targetDate) < kommonitorDataExchangeService.getIndicatorValue_asNumber(brewInstance.breaks[index + 1])) { - color = brewInstance.colors[index]; - break; + else if (kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + color = defaultColorForFilteredValues; } - } - } - - return color; - }; - - this.getColorForFeature = function(feature, indicatorMetadataAndGeoJSON, targetDate, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue){ - var color; - - if(!targetDate.includes(INDICATOR_DATE_PREFIX)){ - targetDate = INDICATOR_DATE_PREFIX + targetDate; - } - - if(kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[targetDate])){ - color = defaultColorForNoDataValues; - } - else if(kommonitorFilterHelperService.featureIsCurrentlyFiltered(feature.properties[__env.FEATURE_ID_PROPERTY_NAME])){ - color = defaultColorForFilteredValues; - } - else if(kommonitorDataExchangeService.classifyZeroSeparately && kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(feature.properties, targetDate) === 0 ){ - color = defaultColorForZeroValues; - } - else if(feature.properties["outlier"] !== undefined && feature.properties["outlier"].includes("low") && kommonitorDataExchangeService.useOutlierDetectionOnIndicator){ - color = defaultColorForOutliers_low; - } - else if(feature.properties["outlier"] !== undefined && feature.properties["outlier"].includes("high") && kommonitorDataExchangeService.useOutlierDetectionOnIndicator){ - color = defaultColorForOutliers_high; - } - else if(isMeasureOfValueChecked){ - - if(kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(feature.properties, targetDate) >= +Number(measureOfValue).toFixed(numberOfDecimals)){ - color = this.getColorFromBrewInstance(gtMeasureOfValueBrew, feature, targetDate); - } - else { - color = this.getColorFromBrewInstance(ltMeasureOfValueBrew, feature, targetDate); - } - - } - else{ - if(indicatorMetadataAndGeoJSON.indicatorType.includes('DYNAMIC')){ - - if(feature.properties[targetDate] < 0){ - - color = this.getColorFromBrewInstance(dynamicDecreaseBrew, feature, targetDate); + else if (kommonitorDataExchangeService.classifyZeroSeparately && kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(feature.properties, targetDate) === 0) { + color = defaultColorForZeroValues; } - else{ - color = this.getColorFromBrewInstance(dynamicIncreaseBrew, feature, targetDate); + else if (feature.properties["outlier"] !== undefined && feature.properties["outlier"].includes("low") && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { + color = defaultColorForOutliers_low; } - - } - else{ - - if(containsNegativeValues(indicatorMetadataAndGeoJSON.geoJSON, targetDate)){ - if(kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[targetDate]) >= 0){ - if(kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[targetDate] == 0 || feature.properties[targetDate] == "0")){ - color = defaultColorForZeroValues; - // if(__env.useTransparencyOnIndicator){ - // fillOpacity = __env.defaultFillOpacityForZeroFeatures; - // } + else if (feature.properties["outlier"] !== undefined && feature.properties["outlier"].includes("high") && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { + color = defaultColorForOutliers_high; + } + else if (isMeasureOfValueChecked) { + if (kommonitorDataExchangeService.getIndicatorValueFromArray_asNumber(feature.properties, targetDate) >= +Number(measureOfValue).toFixed(numberOfDecimals)) { + color = this.getColorFromBrewInstance(gtMeasureOfValueBrew, feature, targetDate); } - else{ - color = this.getColorFromBrewInstance(dynamicIncreaseBrew, feature, targetDate); + else { + color = this.getColorFromBrewInstance(ltMeasureOfValueBrew, feature, targetDate); } - } - else{ - if(kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[targetDate] == 0 || feature.properties[targetDate] == "0")){ - color = defaultColorForZeroValues; - // if(__env.useTransparencyOnIndicator){ - // fillOpacity = __env.defaultFillOpacityForZeroFeatures; - // } + } + else { + if (indicatorMetadataAndGeoJSON.indicatorType.includes('DYNAMIC')) { + if (feature.properties[targetDate] < 0) { + color = this.getColorFromBrewInstance(dynamicDecreaseBrew, feature, targetDate); + } + else { + color = this.getColorFromBrewInstance(dynamicIncreaseBrew, feature, targetDate); + } } - else{ - color = this.getColorFromBrewInstance(dynamicDecreaseBrew, feature, targetDate); + else { + if (containsNegativeValues(indicatorMetadataAndGeoJSON.geoJSON, targetDate)) { + if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[targetDate]) >= 0) { + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[targetDate] == 0 || feature.properties[targetDate] == "0")) { + color = defaultColorForZeroValues; + // if(__env.useTransparencyOnIndicator){ + // fillOpacity = __env.defaultFillOpacityForZeroFeatures; + // } + } + else { + color = this.getColorFromBrewInstance(dynamicIncreaseBrew, feature, targetDate); + } + } + else { + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[targetDate] == 0 || feature.properties[targetDate] == "0")) { + color = defaultColorForZeroValues; + // if(__env.useTransparencyOnIndicator){ + // fillOpacity = __env.defaultFillOpacityForZeroFeatures; + // } + } + else { + color = this.getColorFromBrewInstance(dynamicDecreaseBrew, feature, targetDate); + } + } + } + else { + color = this.getColorFromBrewInstance(defaultBrew, feature, targetDate); + } } - } } - else{ - color = this.getColorFromBrewInstance(defaultBrew, feature, targetDate); + return color; + }; + this.getBarChartOptions = function () { + return self.barChartOptions; + }; + this.getGeoMapChartOptions = function () { + return self.geoMapChartOptions; + }; + this.getHistogramChartOptions = function () { + return self.histogramChartOptions; + }; + this.getLineChartOptions = function () { + return self.lineChartOptions; + }; + this.prepareAllDiagramResources_forCurrentMapIndicator = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates) { + this.prepareAllDiagramResources(indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates, false); + }; + this.prepareAllDiagramResources_forReportingIndicator = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates) { + this.prepareAllDiagramResources(indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates, true); + }; + this.prepareAllDiagramResources = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates, forceUseSubmittedIndicatorForTimeseries) { + self.indicatorPropertyName = INDICATOR_DATE_PREFIX + date; + var featureNamesArray = new Array(); + var indicatorValueArray = new Array(); + var indicatorValueBarChartArray = new Array(); + //sort array of features + var cartographicFeatures = indicatorMetadataAndGeoJSON.geoJSON.features; + cartographicFeatures.sort(compareFeaturesByIndicatorValue); + for (var j = 0; j < cartographicFeatures.length; j++) { + // diff occurs when balance mode is activated + // then, cartographicFeatures display balance over time period, which shall be reflected in bar chart and histogram + // the other diagrams must use the "normal" unbalanced indicator instead --> selectedFeatures + var cartographicFeature = cartographicFeatures[j]; + var indicatorValue; + if (kommonitorDataExchangeService.indicatorValueIsNoData(cartographicFeature.properties[self.indicatorPropertyName])) { + indicatorValue = null; + } + else { + indicatorValue = kommonitorDataExchangeService.getIndicatorValue_asNumber(cartographicFeature.properties[self.indicatorPropertyName]); + } + var featureName = cartographicFeature.properties[__env.FEATURE_NAME_PROPERTY_NAME]; + featureNamesArray.push(featureName); + indicatorValueArray.push(indicatorValue); + var color = this.getColorForFeature(cartographicFeature, indicatorMetadataAndGeoJSON, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); + var seriesItem = { + value: indicatorValue, + name: featureName, + itemStyle: { + color: color + // borderWidth: 1, + // borderColor: 'black' + } + }; + indicatorValueBarChartArray.push(seriesItem); } - } - } - - return color; - }; - - this.getBarChartOptions = function () { - return self.barChartOptions; - }; - - this.getGeoMapChartOptions = function () { - return self.geoMapChartOptions; - }; - - this.getHistogramChartOptions = function () { - return self.histogramChartOptions; - }; - - this.getLineChartOptions = function () { - return self.lineChartOptions; - }; - - this.prepareAllDiagramResources_forCurrentMapIndicator = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates) { - this.prepareAllDiagramResources(indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates, false); - }; - - this.prepareAllDiagramResources_forReportingIndicator = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates) { - this.prepareAllDiagramResources(indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates, true); - }; - - this.prepareAllDiagramResources = function (indicatorMetadataAndGeoJSON, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue, filterOutFutureDates, forceUseSubmittedIndicatorForTimeseries) { - - self.indicatorPropertyName = INDICATOR_DATE_PREFIX + date; - - var featureNamesArray = new Array(); - var indicatorValueArray = new Array(); - var indicatorValueBarChartArray = new Array(); - - //sort array of features - var cartographicFeatures = indicatorMetadataAndGeoJSON.geoJSON.features; - cartographicFeatures.sort(compareFeaturesByIndicatorValue); - - for (var j = 0; j < cartographicFeatures.length; j++) { - // diff occurs when balance mode is activated - // then, cartographicFeatures display balance over time period, which shall be reflected in bar chart and histogram - // the other diagrams must use the "normal" unbalanced indicator instead --> selectedFeatures - var cartographicFeature = cartographicFeatures[j]; - - var indicatorValue; - if (kommonitorDataExchangeService.indicatorValueIsNoData(cartographicFeature.properties[self.indicatorPropertyName])) { - indicatorValue = null; - } - else { - indicatorValue = kommonitorDataExchangeService.getIndicatorValue_asNumber(cartographicFeature.properties[self.indicatorPropertyName]); - } - - var featureName = cartographicFeature.properties[__env.FEATURE_NAME_PROPERTY_NAME] - featureNamesArray.push(featureName); - indicatorValueArray.push(indicatorValue); - - var color = this.getColorForFeature(cartographicFeature, indicatorMetadataAndGeoJSON, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); - - var seriesItem = { - value: indicatorValue, - name: featureName, - itemStyle: { - color: color - // borderWidth: 1, - // borderColor: 'black' + // TIMESERIES + var indicatorTimeSeriesDatesArray = indicatorMetadataAndGeoJSON.applicableDates; + if (filterOutFutureDates) { + // remove all timestamps that are newer than the given date + var dateInDateFormat = Date.parse(date); + indicatorTimeSeriesDatesArray = indicatorTimeSeriesDatesArray.filter(t => { + var tInDateFormat = Date.parse(t); + if (tInDateFormat <= dateInDateFormat) { + return true; + } + else { + return false; + } + }); } - }; - - indicatorValueBarChartArray.push(seriesItem); - - } - - // TIMESERIES - var indicatorTimeSeriesDatesArray = indicatorMetadataAndGeoJSON.applicableDates; - - if(filterOutFutureDates){ - // remove all timestamps that are newer than the given date - var dateInDateFormat = Date.parse(date); - indicatorTimeSeriesDatesArray = indicatorTimeSeriesDatesArray.filter( t => { - var tInDateFormat = Date.parse(t); - if (tInDateFormat <= dateInDateFormat) { - return true; - } else { - return false; + var indicatorTimeSeriesAverageArray = new Array(indicatorTimeSeriesDatesArray.length); + var indicatorTimeSeriesMaxArray = new Array(indicatorTimeSeriesDatesArray.length); + var indicatorTimeSeriesMinArray = new Array(indicatorTimeSeriesDatesArray.length); + var indicatorTimeSeriesCountArray = new Array(indicatorTimeSeriesDatesArray.length); + // initialize timeSeries arrays + for (var i = 0; i < indicatorTimeSeriesDatesArray.length; i++) { + indicatorTimeSeriesAverageArray[i] = 0; + indicatorTimeSeriesCountArray[i] = 0; } - }); - } - - var indicatorTimeSeriesAverageArray = new Array(indicatorTimeSeriesDatesArray.length); - var indicatorTimeSeriesMaxArray = new Array(indicatorTimeSeriesDatesArray.length); - var indicatorTimeSeriesMinArray = new Array(indicatorTimeSeriesDatesArray.length); - var indicatorTimeSeriesCountArray = new Array(indicatorTimeSeriesDatesArray.length); - - // initialize timeSeries arrays - for (var i = 0; i < indicatorTimeSeriesDatesArray.length; i++) { - indicatorTimeSeriesAverageArray[i] = 0; - indicatorTimeSeriesCountArray[i] = 0; - } - - let indicatorMetadataForTimeseries = indicatorMetadataAndGeoJSON; - - if(!forceUseSubmittedIndicatorForTimeseries && kommonitorDataExchangeService.isBalanceChecked){ - indicatorMetadataForTimeseries = kommonitorDataExchangeService.selectedIndicator; - } - // we must use the original selectedIndicator in case balance mode is active - // otherwise balance timestamp will have balance values - for (var t = 0; t < indicatorMetadataForTimeseries.geoJSON.features.length; t++) { - var indicatorFeature = indicatorMetadataForTimeseries.geoJSON.features[t]; - // continue timeSeries arrays by adding and counting all time series values - for (var i = 0; i < indicatorTimeSeriesDatesArray.length; i++) { - var datePropertyName = INDICATOR_DATE_PREFIX + indicatorTimeSeriesDatesArray[i]; - if (!kommonitorDataExchangeService.indicatorValueIsNoData(indicatorFeature.properties[datePropertyName])) { - // indicatorTimeSeriesAverageArray[i] += selectedFeature.properties[datePropertyName]; - indicatorTimeSeriesAverageArray[i] += indicatorFeature.properties[datePropertyName]; - indicatorTimeSeriesCountArray[i]++; - - // min stack - if (indicatorTimeSeriesMinArray[i] === undefined || indicatorTimeSeriesMinArray[i] === null){ - indicatorTimeSeriesMinArray[i] = indicatorFeature.properties[datePropertyName]; - } - else{ - if(indicatorFeature.properties[datePropertyName] < indicatorTimeSeriesMinArray[i]){ - indicatorTimeSeriesMinArray[i] = indicatorFeature.properties[datePropertyName]; - } - } - - // max stack - if (indicatorTimeSeriesMaxArray[i] === undefined || indicatorTimeSeriesMaxArray[i] === null){ - indicatorTimeSeriesMaxArray[i] = indicatorFeature.properties[datePropertyName]; - } - else{ - if(indicatorFeature.properties[datePropertyName] > indicatorTimeSeriesMaxArray[i]){ - indicatorTimeSeriesMaxArray[i] = indicatorFeature.properties[datePropertyName]; + let indicatorMetadataForTimeseries = indicatorMetadataAndGeoJSON; + if (!forceUseSubmittedIndicatorForTimeseries && kommonitorDataExchangeService.isBalanceChecked) { + indicatorMetadataForTimeseries = kommonitorDataExchangeService.selectedIndicator; + } + // we must use the original selectedIndicator in case balance mode is active + // otherwise balance timestamp will have balance values + for (var t = 0; t < indicatorMetadataForTimeseries.geoJSON.features.length; t++) { + var indicatorFeature = indicatorMetadataForTimeseries.geoJSON.features[t]; + // continue timeSeries arrays by adding and counting all time series values + for (var i = 0; i < indicatorTimeSeriesDatesArray.length; i++) { + var datePropertyName = INDICATOR_DATE_PREFIX + indicatorTimeSeriesDatesArray[i]; + if (!kommonitorDataExchangeService.indicatorValueIsNoData(indicatorFeature.properties[datePropertyName])) { + // indicatorTimeSeriesAverageArray[i] += selectedFeature.properties[datePropertyName]; + indicatorTimeSeriesAverageArray[i] += indicatorFeature.properties[datePropertyName]; + indicatorTimeSeriesCountArray[i]++; + // min stack + if (indicatorTimeSeriesMinArray[i] === undefined || indicatorTimeSeriesMinArray[i] === null) { + indicatorTimeSeriesMinArray[i] = indicatorFeature.properties[datePropertyName]; + } + else { + if (indicatorFeature.properties[datePropertyName] < indicatorTimeSeriesMinArray[i]) { + indicatorTimeSeriesMinArray[i] = indicatorFeature.properties[datePropertyName]; + } + } + // max stack + if (indicatorTimeSeriesMaxArray[i] === undefined || indicatorTimeSeriesMaxArray[i] === null) { + indicatorTimeSeriesMaxArray[i] = indicatorFeature.properties[datePropertyName]; + } + else { + if (indicatorFeature.properties[datePropertyName] > indicatorTimeSeriesMaxArray[i]) { + indicatorTimeSeriesMaxArray[i] = indicatorFeature.properties[datePropertyName]; + } + } + } } - } } - } - } - - // finish timeSeries arrays by computing averages of all time series values - for (var i = 0; i < indicatorTimeSeriesDatesArray.length; i++) { - indicatorTimeSeriesAverageArray[i] = kommonitorDataExchangeService.getIndicatorValue_asNumber(indicatorTimeSeriesAverageArray[i] / indicatorTimeSeriesCountArray[i]); - } - - // setHistogramChartOptions(indicatorMetadataAndGeoJSON, indicatorValueArray, spatialUnitName, date); - - setLineChartOptions(indicatorMetadataAndGeoJSON, indicatorTimeSeriesDatesArray, indicatorTimeSeriesAverageArray, indicatorTimeSeriesMaxArray, indicatorTimeSeriesMinArray, spatialUnitName, date); - - setBarChartOptions(indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); - - setGeoMapChartOptions(indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); - }; - - var compareFeaturesByIndicatorValue = function (featureA, featureB) { - if (featureA.properties[self.indicatorPropertyName] < featureB.properties[self.indicatorPropertyName]) - return -1; - if (featureA.properties[self.indicatorPropertyName] > featureB.properties[self.indicatorPropertyName]) - return 1; - return 0; - }; - - var setBarChartOptions = function (indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue) { - - // specify chart configuration item and data - var labelOption = { - normal: { - show: true, - position: 'insideBottom', - align: 'left', - verticalAlign: 'middle', - rotate: 90, - formatter: '{c}', - } - }; - - // default fontSize of echarts - var fontSize = 18; - var barChartTitel = 'Ranking - ' + spatialUnitName + ' - '; - if (indicatorMetadataAndGeoJSON.fromDate) { - barChartTitel += "Bilanz " + indicatorMetadataAndGeoJSON.fromDate + " - " + indicatorMetadataAndGeoJSON.toDate; - fontSize = 14; - } - else { - barChartTitel += date; - } - - var legendConfig = setupVisualMap(indicatorMetadataAndGeoJSON, featureNamesArray, - indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, - ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, - measureOfValue); - - var barOption = { - // grid get rid of whitespace around chart - grid: { - left: '4%', - top: 32, - right: '4%', - bottom: 32, - containLabel: true - }, - title: { - text: barChartTitel, - left: 'center', - textStyle: { - fontSize: fontSize - }, - show: false - // top: 15 - }, - tooltip: { - trigger: 'item', - confine: 'true', - formatter: function (params) { - var value = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(params.value); - return "" + params.name + ": " + value + " [" + indicatorMetadataAndGeoJSON.unit + "]"; - }, - axisPointer: { - type: 'line', - crossStyle: { - color: '#999' - } + // finish timeSeries arrays by computing averages of all time series values + for (var i = 0; i < indicatorTimeSeriesDatesArray.length; i++) { + indicatorTimeSeriesAverageArray[i] = kommonitorDataExchangeService.getIndicatorValue_asNumber(indicatorTimeSeriesAverageArray[i] / indicatorTimeSeriesCountArray[i]); } - }, - toolbox: { - show: true, - right: '15', - feature: { - // mark : {show: true}, - dataView: { - show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Feature-Vergleich', 'schließen', 'refresh'], optionToContent: function (opt) { - - var barData = opt.series[0].data; - var featureNames = opt.xAxis[0].data; - - var dataTableId = "barDataTable_" + Math.random(); - var tableExportName = opt.xAxis[0].name + " - " + opt.title[0].text; - - var htmlString = ''; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - - htmlString += ""; - - for (var i = 0; i < barData.length; i++) { - var value = kommonitorDataExchangeService.getIndicatorValue_asNumber(barData[i].value); - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - } - - htmlString += ""; - htmlString += "
        Feature-Name" + opt.xAxis[0].name + " [" + opt.yAxis[0].name + "]
        " + featureNames[i] + "" + value + "
        "; - - $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); - - return htmlString; + // setHistogramChartOptions(indicatorMetadataAndGeoJSON, indicatorValueArray, spatialUnitName, date); + setLineChartOptions(indicatorMetadataAndGeoJSON, indicatorTimeSeriesDatesArray, indicatorTimeSeriesAverageArray, indicatorTimeSeriesMaxArray, indicatorTimeSeriesMinArray, spatialUnitName, date); + setBarChartOptions(indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); + setGeoMapChartOptions(indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); + }; + var compareFeaturesByIndicatorValue = function (featureA, featureB) { + if (featureA.properties[self.indicatorPropertyName] < featureB.properties[self.indicatorPropertyName]) + return -1; + if (featureA.properties[self.indicatorPropertyName] > featureB.properties[self.indicatorPropertyName]) + return 1; + return 0; + }; + var setBarChartOptions = function (indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue) { + // specify chart configuration item and data + var labelOption = { + normal: { + show: true, + position: 'insideBottom', + align: 'left', + verticalAlign: 'middle', + rotate: 90, + formatter: '{c}', } - }, - restore: { show: false, title: "Erneuern" }, - saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + }; + // default fontSize of echarts + var fontSize = 18; + var barChartTitel = 'Ranking - ' + spatialUnitName + ' - '; + if (indicatorMetadataAndGeoJSON.fromDate) { + barChartTitel += "Bilanz " + indicatorMetadataAndGeoJSON.fromDate + " - " + indicatorMetadataAndGeoJSON.toDate; + fontSize = 14; + } + else { + barChartTitel += date; } - }, - // legend: { - // //data:[indicatorMetadataAndGeoJSON.indicatorName] - // }, - xAxis: { - name: indicatorMetadataAndGeoJSON.indicatorName, - nameLocation: 'center', - nameGap: 15, - axisLabel: { - rotate: 90, - interval: 0, - inside: true, - show: false - }, - axisTick: { - show: false - }, - z: 6, - zlevel: 6, - data: featureNamesArray - }, - yAxis: { - type: 'value', - name: indicatorMetadataAndGeoJSON.unit, - // splitArea: { - // show: true + var legendConfig = setupVisualMap(indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); + var barOption = { + // grid get rid of whitespace around chart + grid: { + left: '4%', + top: 32, + right: '4%', + bottom: 32, + containLabel: true + }, + title: { + text: barChartTitel, + left: 'center', + textStyle: { + fontSize: fontSize + }, + show: false + // top: 15 + }, + tooltip: { + trigger: 'item', + confine: 'true', + formatter: function (params) { + var value = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(params.value); + return "" + params.name + ": " + value + " [" + indicatorMetadataAndGeoJSON.unit + "]"; + }, + axisPointer: { + type: 'line', + crossStyle: { + color: '#999' + } + } + }, + toolbox: { + show: true, + right: '15', + feature: { + // mark : {show: true}, + dataView: { + show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Feature-Vergleich', 'schließen', 'refresh'], optionToContent: function (opt) { + var barData = opt.series[0].data; + var featureNames = opt.xAxis[0].data; + var dataTableId = "barDataTable_" + Math.random(); + var tableExportName = opt.xAxis[0].name + " - " + opt.title[0].text; + var htmlString = ''; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + for (var i = 0; i < barData.length; i++) { + var value = kommonitorDataExchangeService.getIndicatorValue_asNumber(barData[i].value); + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + } + htmlString += ""; + htmlString += "
        Feature-Name" + opt.xAxis[0].name + " [" + opt.yAxis[0].name + "]
        " + featureNames[i] + "" + value + "
        "; + $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); + return htmlString; + } + }, + restore: { show: false, title: "Erneuern" }, + saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + } + }, + // legend: { + // //data:[indicatorMetadataAndGeoJSON.indicatorName] + // }, + xAxis: { + name: indicatorMetadataAndGeoJSON.indicatorName, + nameLocation: 'center', + nameGap: 15, + axisLabel: { + rotate: 90, + interval: 0, + inside: true, + show: false + }, + axisTick: { + show: false + }, + z: 6, + zlevel: 6, + data: featureNamesArray + }, + yAxis: { + type: 'value', + name: indicatorMetadataAndGeoJSON.unit, + // splitArea: { + // show: true + // } + }, + series: [{ + // name: indicatorMetadataAndGeoJSON.indicatorName, + type: 'bar', + emphasis: { + itemStyle: { + borderWidth: 4, + borderColor: defaultColorForClickedFeatures + } + }, + data: indicatorValueBarChartArray + }], + visualMap: [{ + left: 'left', + type: "piecewise", + pieces: legendConfig, + precision: 2, + show: false + }] + }; + // if (indicatorMetadataAndGeoJSON.geoJSON.features.length > 50) { + // // barOption.xAxis.data = undefined; + // barOption.xAxis.axisLabel.show = false; // } - }, - series: [{ - // name: indicatorMetadataAndGeoJSON.indicatorName, - type: 'bar', - emphasis: { - itemStyle: { - borderWidth: 4, - borderColor: defaultColorForClickedFeatures - } - }, - data: indicatorValueBarChartArray - }], - visualMap: [{ - left: 'left', - type: "piecewise", - pieces: legendConfig, - precision: 2, - show: false - }] + // use configuration item and data specified to show chart + self.barChartOptions = barOption; }; - - // if (indicatorMetadataAndGeoJSON.geoJSON.features.length > 50) { - // // barOption.xAxis.data = undefined; - // barOption.xAxis.axisLabel.show = false; - // } - - // use configuration item and data specified to show chart - self.barChartOptions = barOption; - }; - - var containsNegativeValues = function (geoJSON, date) { - - var propertyName = date; - - if(! propertyName.includes(kommonitorDataExchangeService.indicatorDatePrefix)){ - propertyName = kommonitorDataExchangeService.indicatorDatePrefix + propertyName; - } - - var containsNegativeValues = false; - for (var i = 0; i < geoJSON.features.length; i++) { - if (geoJSON.features[i].properties[propertyName] < 0) { - containsNegativeValues = true; - break; - } - } - - return containsNegativeValues; - }; - - var containsZeroValues = function (geoJSON, date) { - - var propertyName = date; - - if(! propertyName.includes(kommonitorDataExchangeService.indicatorDatePrefix)){ - propertyName = kommonitorDataExchangeService.indicatorDatePrefix + propertyName; - } - - var containsZeroValues = false; - for (var i = 0; i < geoJSON.features.length; i++) { - if (geoJSON.features[i].properties[propertyName] === 0 || geoJSON.features[i].properties[propertyName] === "0") { - containsZeroValues = true; - break; - } - } - - return containsZeroValues; - }; - - var setupVisualMap = function(indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue){ - /* - pieces: [ - // Range of a piece can be specified by property min and max, - // where min will be set as -Infinity if ignored, - // and max will be set as Infinity if ignored. - {min: 1500}, - {min: 900, max: 1500}, - {min: 310, max: 1000}, - {min: 200, max: 300}, - // Label of the piece can be specified. - {min: 10, max: 200, label: '10 to 200 (custom label) '}, - // Color of the piece can be specified. - {value: 123, label: '123 (custom special color) ', color: 'grey'}, - {max: 5} - ] - */ - - var indicatorType = indicatorMetadataAndGeoJSON.indicatorType; - - var pieces = []; - - if(containsZeroValues(indicatorMetadataAndGeoJSON.geoJSON, date)){ - pieces.push({ - min: 0, - opacity: 0.8, - max: 0, - color: defaultColorForZeroValues - }); - } - - // if(containsOutlierValues(indicatorMetadataAndGeoJSON.geoJSON, date)){ - // pieces.push({ - // min: 0, - // opacity: 0.8, - // max: 0, - // color: defaultColorForZeroValues - // }); - // } - - if(isMeasureOfValueChecked){ - - if(gtMeasureOfValueBrew && gtMeasureOfValueBrew.breaks && gtMeasureOfValueBrew.colors){ - // measure of value brew - var gtBreaks = gtMeasureOfValueBrew.breaks; - var gtColors = gtMeasureOfValueBrew.colors; - - for (var j = 0; j < gtColors.length; j++) { - - var legendItem_gtMov = { - min: gtBreaks[j], - opacity: 0.8, - color: gtColors[j] - }; - if(gtBreaks[j + 1]){ - legendItem_gtMov.max = gtBreaks[j + 1]; + var containsNegativeValues = function (geoJSON, date) { + var propertyName = date; + if (!propertyName.includes(kommonitorDataExchangeService.indicatorDatePrefix)) { + propertyName = kommonitorDataExchangeService.indicatorDatePrefix + propertyName; + } + var containsNegativeValues = false; + for (var i = 0; i < geoJSON.features.length; i++) { + if (geoJSON.features[i].properties[propertyName] < 0) { + containsNegativeValues = true; + break; } - - pieces.push(legendItem_gtMov); - - } - } - - if(ltMeasureOfValueBrew && ltMeasureOfValueBrew.breaks && ltMeasureOfValueBrew.colors){ - var ltBreaks = ltMeasureOfValueBrew.breaks; - var ltColors = ltMeasureOfValueBrew.colors; - - for (var j = 0; j < ltColors.length; j++) { - - var legendItem_ltMov = { - min: ltBreaks[j], - opacity: 0.8, - color: ltColors[ltColors.length - 1 - j] - }; - if(ltBreaks[j + 1]){ - legendItem_ltMov.max = ltBreaks[j + 1]; - } - - pieces.push(legendItem_ltMov); - } - } - - - - } - else if(indicatorType.includes("DYNAMIC")){ - // dynamic brew - - if(dynamicDecreaseBrew){ - var dynamicDecreaseBreaks = dynamicDecreaseBrew.breaks; - var dynamicDecreaseColors = dynamicDecreaseBrew.colors; - - for (var j = 0; j < dynamicDecreaseColors.length; j++) { - - var legendItem_dynamicDecreaseMov = { - min: dynamicDecreaseBreaks[j], - opacity: 0.8, - // color: dynamicDecreaseColors[dynamicDecreaseColors.length - 1 - j] - color: dynamicDecreaseColors[j] - }; - if(dynamicDecreaseBreaks[j + 1]){ - legendItem_dynamicDecreaseMov.max = dynamicDecreaseBreaks[j + 1]; - legendItem_dynamicDecreaseMov.label = "" + dynamicDecreaseBreaks[j] + " - < " + dynamicDecreaseBreaks[j + 1]; - - // in negative scala we must ensure that smallest value near 0 (here max) is included in range - if(j == dynamicDecreaseColors.length - 1){ - legendItem_dynamicDecreaseMov.max = -0.01; + return containsNegativeValues; + }; + var containsZeroValues = function (geoJSON, date) { + var propertyName = date; + if (!propertyName.includes(kommonitorDataExchangeService.indicatorDatePrefix)) { + propertyName = kommonitorDataExchangeService.indicatorDatePrefix + propertyName; + } + var containsZeroValues = false; + for (var i = 0; i < geoJSON.features.length; i++) { + if (geoJSON.features[i].properties[propertyName] === 0 || geoJSON.features[i].properties[propertyName] === "0") { + containsZeroValues = true; + break; } - } - else{ - legendItem_dynamicDecreaseMov.max = -0.01; - legendItem_dynamicDecreaseMov.label = dynamicDecreaseBreaks[j]; - } - - pieces.push(legendItem_dynamicDecreaseMov); - } - } - - if(dynamicIncreaseBrew){ - var dynamicIncreaseBreaks = dynamicIncreaseBrew.breaks; - var dynamicIncreaseColors = dynamicIncreaseBrew.colors; - - for (var j = 0; j < dynamicIncreaseColors.length; j++) { - - var legendItem_dynamicIncreaseMov = { - min: dynamicIncreaseBreaks[j], - opacity: 0.8, - color: dynamicIncreaseColors[j] - }; - if(dynamicIncreaseBreaks[j + 1]){ - legendItem_dynamicIncreaseMov.max = dynamicIncreaseBreaks[j + 1]; - legendItem_dynamicIncreaseMov.label = "" + dynamicIncreaseBreaks[j] + " - < " + dynamicIncreaseBreaks[j + 1]; + return containsZeroValues; + }; + var setupVisualMap = function (indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue) { + /* + pieces: [ + // Range of a piece can be specified by property min and max, + // where min will be set as -Infinity if ignored, + // and max will be set as Infinity if ignored. + {min: 1500}, + {min: 900, max: 1500}, + {min: 310, max: 1000}, + {min: 200, max: 300}, + // Label of the piece can be specified. + {min: 10, max: 200, label: '10 to 200 (custom label) '}, + // Color of the piece can be specified. + {value: 123, label: '123 (custom special color) ', color: 'grey'}, + {max: 5} + ] + */ + var indicatorType = indicatorMetadataAndGeoJSON.indicatorType; + var pieces = []; + if (containsZeroValues(indicatorMetadataAndGeoJSON.geoJSON, date)) { + pieces.push({ + min: 0, + opacity: 0.8, + max: 0, + color: defaultColorForZeroValues + }); + } + // if(containsOutlierValues(indicatorMetadataAndGeoJSON.geoJSON, date)){ + // pieces.push({ + // min: 0, + // opacity: 0.8, + // max: 0, + // color: defaultColorForZeroValues + // }); + // } + if (isMeasureOfValueChecked) { + if (gtMeasureOfValueBrew && gtMeasureOfValueBrew.breaks && gtMeasureOfValueBrew.colors) { + // measure of value brew + var gtBreaks = gtMeasureOfValueBrew.breaks; + var gtColors = gtMeasureOfValueBrew.colors; + for (var j = 0; j < gtColors.length; j++) { + var legendItem_gtMov = { + min: gtBreaks[j], + opacity: 0.8, + color: gtColors[j] + }; + if (gtBreaks[j + 1]) { + legendItem_gtMov.max = gtBreaks[j + 1]; + } + pieces.push(legendItem_gtMov); + } } - else{ - legendItem_dynamicIncreaseMov.max = dynamicIncreaseBreaks[j]; + if (ltMeasureOfValueBrew && ltMeasureOfValueBrew.breaks && ltMeasureOfValueBrew.colors) { + var ltBreaks = ltMeasureOfValueBrew.breaks; + var ltColors = ltMeasureOfValueBrew.colors; + for (var j = 0; j < ltColors.length; j++) { + var legendItem_ltMov = { + min: ltBreaks[j], + opacity: 0.8, + color: ltColors[ltColors.length - 1 - j] + }; + if (ltBreaks[j + 1]) { + legendItem_ltMov.max = ltBreaks[j + 1]; + } + pieces.push(legendItem_ltMov); + } } - - pieces.push(legendItem_dynamicIncreaseMov); - - } - } - - } - else { - // default brew - - if(containsNegativeValues(indicatorMetadataAndGeoJSON.geoJSON, date)){ - // dynamic brew - if(dynamicDecreaseBrew){ - var dynamicDecreaseBreaks = dynamicDecreaseBrew.breaks; - var dynamicDecreaseColors = dynamicDecreaseBrew.colors; - - for (var j = 0; j < dynamicDecreaseColors.length; j++) { - - var legendItem_dynamicDecreaseMov = { - min: dynamicDecreaseBreaks[j], - opacity: 0.8, - // color: dynamicDecreaseColors[dynamicDecreaseColors.length - 1 - j] - color: dynamicDecreaseColors[j] - }; - if(dynamicDecreaseBreaks[j + 1]){ - legendItem_dynamicDecreaseMov.max = dynamicDecreaseBreaks[j + 1]; - legendItem_dynamicDecreaseMov.label = "" + dynamicDecreaseBreaks[j] + " - < " + dynamicDecreaseBreaks[j + 1]; - - // in negative scala we must ensure that smallest value near 0 (here max) is included in range - if(j == dynamicDecreaseColors.length - 1){ - legendItem_dynamicDecreaseMov.max = -0.01; - } + } + else if (indicatorType.includes("DYNAMIC")) { + // dynamic brew + if (dynamicDecreaseBrew) { + var dynamicDecreaseBreaks = dynamicDecreaseBrew.breaks; + var dynamicDecreaseColors = dynamicDecreaseBrew.colors; + for (var j = 0; j < dynamicDecreaseColors.length; j++) { + var legendItem_dynamicDecreaseMov = { + min: dynamicDecreaseBreaks[j], + opacity: 0.8, + // color: dynamicDecreaseColors[dynamicDecreaseColors.length - 1 - j] + color: dynamicDecreaseColors[j] + }; + if (dynamicDecreaseBreaks[j + 1]) { + legendItem_dynamicDecreaseMov.max = dynamicDecreaseBreaks[j + 1]; + legendItem_dynamicDecreaseMov.label = "" + dynamicDecreaseBreaks[j] + " - < " + dynamicDecreaseBreaks[j + 1]; + // in negative scala we must ensure that smallest value near 0 (here max) is included in range + if (j == dynamicDecreaseColors.length - 1) { + legendItem_dynamicDecreaseMov.max = -0.01; + } + } + else { + legendItem_dynamicDecreaseMov.max = -0.01; + legendItem_dynamicDecreaseMov.label = dynamicDecreaseBreaks[j]; + } + pieces.push(legendItem_dynamicDecreaseMov); + } } - else{ - legendItem_dynamicDecreaseMov.max = -0.01; - legendItem_dynamicDecreaseMov.label = dynamicDecreaseBreaks[j]; + if (dynamicIncreaseBrew) { + var dynamicIncreaseBreaks = dynamicIncreaseBrew.breaks; + var dynamicIncreaseColors = dynamicIncreaseBrew.colors; + for (var j = 0; j < dynamicIncreaseColors.length; j++) { + var legendItem_dynamicIncreaseMov = { + min: dynamicIncreaseBreaks[j], + opacity: 0.8, + color: dynamicIncreaseColors[j] + }; + if (dynamicIncreaseBreaks[j + 1]) { + legendItem_dynamicIncreaseMov.max = dynamicIncreaseBreaks[j + 1]; + legendItem_dynamicIncreaseMov.label = "" + dynamicIncreaseBreaks[j] + " - < " + dynamicIncreaseBreaks[j + 1]; + } + else { + legendItem_dynamicIncreaseMov.max = dynamicIncreaseBreaks[j]; + } + pieces.push(legendItem_dynamicIncreaseMov); + } } - - pieces.push(legendItem_dynamicDecreaseMov); - - } } - - if(dynamicIncreaseBrew){ - var dynamicIncreaseBreaks = dynamicIncreaseBrew.breaks; - var dynamicIncreaseColors = dynamicIncreaseBrew.colors; - - for (var j = 0; j < dynamicIncreaseColors.length; j++) { - - var legendItem_dynamicIncreaseMov = { - min: dynamicIncreaseBreaks[j], - opacity: 0.8, - color: dynamicIncreaseColors[j] - }; - if(dynamicIncreaseBreaks[j + 1]){ - legendItem_dynamicIncreaseMov.max = dynamicIncreaseBreaks[j + 1]; - legendItem_dynamicIncreaseMov.label = "" + dynamicIncreaseBreaks[j] + " - < " + dynamicIncreaseBreaks[j + 1]; + else { + // default brew + if (containsNegativeValues(indicatorMetadataAndGeoJSON.geoJSON, date)) { + // dynamic brew + if (dynamicDecreaseBrew) { + var dynamicDecreaseBreaks = dynamicDecreaseBrew.breaks; + var dynamicDecreaseColors = dynamicDecreaseBrew.colors; + for (var j = 0; j < dynamicDecreaseColors.length; j++) { + var legendItem_dynamicDecreaseMov = { + min: dynamicDecreaseBreaks[j], + opacity: 0.8, + // color: dynamicDecreaseColors[dynamicDecreaseColors.length - 1 - j] + color: dynamicDecreaseColors[j] + }; + if (dynamicDecreaseBreaks[j + 1]) { + legendItem_dynamicDecreaseMov.max = dynamicDecreaseBreaks[j + 1]; + legendItem_dynamicDecreaseMov.label = "" + dynamicDecreaseBreaks[j] + " - < " + dynamicDecreaseBreaks[j + 1]; + // in negative scala we must ensure that smallest value near 0 (here max) is included in range + if (j == dynamicDecreaseColors.length - 1) { + legendItem_dynamicDecreaseMov.max = -0.01; + } + } + else { + legendItem_dynamicDecreaseMov.max = -0.01; + legendItem_dynamicDecreaseMov.label = dynamicDecreaseBreaks[j]; + } + pieces.push(legendItem_dynamicDecreaseMov); + } + } + if (dynamicIncreaseBrew) { + var dynamicIncreaseBreaks = dynamicIncreaseBrew.breaks; + var dynamicIncreaseColors = dynamicIncreaseBrew.colors; + for (var j = 0; j < dynamicIncreaseColors.length; j++) { + var legendItem_dynamicIncreaseMov = { + min: dynamicIncreaseBreaks[j], + opacity: 0.8, + color: dynamicIncreaseColors[j] + }; + if (dynamicIncreaseBreaks[j + 1]) { + legendItem_dynamicIncreaseMov.max = dynamicIncreaseBreaks[j + 1]; + legendItem_dynamicIncreaseMov.label = "" + dynamicIncreaseBreaks[j] + " - < " + dynamicIncreaseBreaks[j + 1]; + } + else { + legendItem_dynamicIncreaseMov.max = dynamicIncreaseBreaks[j]; + } + pieces.push(legendItem_dynamicIncreaseMov); + } + } } - else{ - legendItem_dynamicIncreaseMov.max = dynamicIncreaseBreaks[j]; + else { + if (defaultBrew && defaultBrew.breaks && defaultBrew.colors) { + var breaks = defaultBrew.breaks; + var colors = defaultBrew.colors; + for (var j = 0; j < colors.length; j++) { + var legendItem_default = { + min: breaks[j], + opacity: 0.8, + max: breaks[j + 1], + color: colors[j] + }; + pieces.push(legendItem_default); + } + } } - - pieces.push(legendItem_dynamicIncreaseMov); - - } } - - } - else{ - if(defaultBrew && defaultBrew.breaks && defaultBrew.colors){ - var breaks = defaultBrew.breaks; - var colors = defaultBrew.colors; - - for (var j = 0; j < colors.length; j++) { - - var legendItem_default = { - min: breaks[j], - opacity: 0.8, - max: breaks[j + 1], - color: colors[j] - }; - - pieces.push(legendItem_default); - - } - } - - } - - - } - - return pieces; - - }; - - - var setGeoMapChartOptions = function (indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue) { - - indicatorMetadataAndGeoJSON.geoJSON.features.forEach(feature => { - feature.properties.name= feature.properties[kommonitorDataExchangeService.FEATURE_NAME_PROPERTY_NAME]; - }); - - var uniqueMapRef = 'geoMapChart'; - - echarts.registerMap(uniqueMapRef, indicatorMetadataAndGeoJSON.geoJSON); - - // specify chart configuration item and data - - var legendConfig = setupVisualMap(indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); - - // default fontSize of echarts - var fontSize = 18; - var geoMapChartTitel = indicatorMetadataAndGeoJSON.indicatorName + ' - ' + spatialUnitName + ' - ' + date; - - var seriesData = []; - - for (let index = 0; index < featureNamesArray.length; index++) { - var featureName = featureNamesArray[index]; - - /* - var seriesItem = { - value: indicatorValue, - itemStyle: { - color: color - // borderWidth: 1, - // borderColor: 'black' - } - }; - */ - var featureValue = indicatorValueBarChartArray[index].value; - - seriesData.push({ - name: featureName, - value: featureValue - }); - } - - // needed for reporting - for(let feature of indicatorMetadataAndGeoJSON.geoJSON.features) { - bbox = turf.bbox(feature); // calculate bbox for each feature - feature.properties.bbox = bbox; - } - var bbox = calculateOverallBoundingBoxFromGeoJSON(indicatorMetadataAndGeoJSON.geoJSON.features) - // change format of bbox to match the format needed for echarts - bbox = [ - [bbox[0], bbox[3]], // north-west lon lat - [bbox[2], bbox[1]] // south-east lon lat - ] - - var geoMapOption = { - // grid get rid of whitespace around chart - // grid: { - // left: '4%', - // top: 32, - // right: '4%', - // bottom: 32, - // containLabel: true - // }, - title: { - text: geoMapChartTitel, - left: 'center', - textStyle: { - fontSize: fontSize - }, - show: true - // top: 15 - }, - tooltip: { - trigger: 'item', - confine: 'true', - showDelay: 0, - transitionDuration: 0.2, - formatter: function (params) { - var value = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(params.value); - return "" + params.name + ": " + value + " [" + indicatorMetadataAndGeoJSON.unit + "]"; - } - }, - toolbox: { - show: true, - right: '15', - feature: { - // mark : {show: true}, - dataView: { - show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Geo Map Chart', 'schließen', 'refresh'], optionToContent: function (opt) { - - var dataTableId = "geoMapDataTable_" + Math.random(); - var tableExportName = indicatorMetadataAndGeoJSON.indicatorName + " - " + opt.title[0].text; - - var htmlString = ''; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - - htmlString += ""; - - for (var i = 0; i < seriesData.length; i++) { - var value = kommonitorDataExchangeService.getIndicatorValue_asNumber(seriesData[i].value); - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; + return pieces; + }; + var setGeoMapChartOptions = function (indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue) { + indicatorMetadataAndGeoJSON.geoJSON.features.forEach(feature => { + feature.properties.name = feature.properties[kommonitorDataExchangeService.FEATURE_NAME_PROPERTY_NAME]; + }); + var uniqueMapRef = 'geoMapChart'; + echarts.registerMap(uniqueMapRef, indicatorMetadataAndGeoJSON.geoJSON); + // specify chart configuration item and data + var legendConfig = setupVisualMap(indicatorMetadataAndGeoJSON, featureNamesArray, indicatorValueBarChartArray, spatialUnitName, date, defaultBrew, gtMeasureOfValueBrew, ltMeasureOfValueBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, isMeasureOfValueChecked, measureOfValue); + // default fontSize of echarts + var fontSize = 18; + var geoMapChartTitel = indicatorMetadataAndGeoJSON.indicatorName + ' - ' + spatialUnitName + ' - ' + date; + var seriesData = []; + for (let index = 0; index < featureNamesArray.length; index++) { + var featureName = featureNamesArray[index]; + /* + var seriesItem = { + value: indicatorValue, + itemStyle: { + color: color + // borderWidth: 1, + // borderColor: 'black' } - - htmlString += ""; - htmlString += "
        Feature-Name" + indicatorMetadataAndGeoJSON.indicatorName + " [" + indicatorMetadataAndGeoJSON.indicatorName + "]
        " + seriesData[i].name + "" + value + "
        "; - - $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); - - return htmlString; - } - }, - restore: { show: false, title: "Erneuern" }, - saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + }; + */ + var featureValue = indicatorValueBarChartArray[index].value; + seriesData.push({ + name: featureName, + value: featureValue + }); + } + // needed for reporting + for (let feature of indicatorMetadataAndGeoJSON.geoJSON.features) { + bbox = turf.bbox(feature); // calculate bbox for each feature + feature.properties.bbox = bbox; } - }, - // legend: { - // //data:[indicatorMetadataAndGeoJSON.indicatorName] - // }, - visualMap: { - left: 'left', - type: "piecewise", - pieces: legendConfig, - // selectedMode: 'multiple', - precision: 2, - show: true - }, - series: [{ - name: indicatorMetadataAndGeoJSON.indicatorName, - type: 'map', - roam: true, - boundingCoords: bbox, - map: uniqueMapRef, - emphasis: { - label: { + var bbox = calculateOverallBoundingBoxFromGeoJSON(indicatorMetadataAndGeoJSON.geoJSON.features); + // change format of bbox to match the format needed for echarts + bbox = [ + [bbox[0], bbox[3]], + [bbox[2], bbox[1]] // south-east lon lat + ]; + var geoMapOption = { + // grid get rid of whitespace around chart + // grid: { + // left: '4%', + // top: 32, + // right: '4%', + // bottom: 32, + // containLabel: true + // }, + title: { + text: geoMapChartTitel, + left: 'center', + textStyle: { + fontSize: fontSize + }, show: true - } - }, - data: seriesData - }] + // top: 15 + }, + tooltip: { + trigger: 'item', + confine: 'true', + showDelay: 0, + transitionDuration: 0.2, + formatter: function (params) { + var value = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(params.value); + return "" + params.name + ": " + value + " [" + indicatorMetadataAndGeoJSON.unit + "]"; + } + }, + toolbox: { + show: true, + right: '15', + feature: { + // mark : {show: true}, + dataView: { + show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Geo Map Chart', 'schließen', 'refresh'], optionToContent: function (opt) { + var dataTableId = "geoMapDataTable_" + Math.random(); + var tableExportName = indicatorMetadataAndGeoJSON.indicatorName + " - " + opt.title[0].text; + var htmlString = ''; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + for (var i = 0; i < seriesData.length; i++) { + var value = kommonitorDataExchangeService.getIndicatorValue_asNumber(seriesData[i].value); + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + } + htmlString += ""; + htmlString += "
        Feature-Name" + indicatorMetadataAndGeoJSON.indicatorName + " [" + indicatorMetadataAndGeoJSON.indicatorName + "]
        " + seriesData[i].name + "" + value + "
        "; + $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); + return htmlString; + } + }, + restore: { show: false, title: "Erneuern" }, + saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + } + }, + // legend: { + // //data:[indicatorMetadataAndGeoJSON.indicatorName] + // }, + visualMap: { + left: 'left', + type: "piecewise", + pieces: legendConfig, + // selectedMode: 'multiple', + precision: 2, + show: true + }, + series: [{ + name: indicatorMetadataAndGeoJSON.indicatorName, + type: 'map', + roam: true, + boundingCoords: bbox, + map: uniqueMapRef, + emphasis: { + label: { + show: true + } + }, + data: seriesData + }] + }; + // use configuration item and data specified to show chart + self.geoMapChartOptions = geoMapOption; }; - - // use configuration item and data specified to show chart - self.geoMapChartOptions = geoMapOption; - }; - - - var setLineChartOptions = function (indicatorMetadataAndGeoJSON, indicatorTimeSeriesDatesArray, indicatorTimeSeriesAverageArray, indicatorTimeSeriesMaxArray, indicatorTimeSeriesMinArray, spatialUnitName, date) { - - var lineOption = { - // grid get rid of whitespace around chart - grid: { - left: '4%', - top: 32, - right: '4%', - bottom: 55, - containLabel: true - }, - title: { - text: 'Zeitreihe - ' + spatialUnitName, - left: 'center', - show: false, - textStyle: { - fontSize: 18 - }, - // top: 15 - }, - tooltip: { - trigger: 'axis', - confine: 'true', - formatter: function (params) { - - var string = "" + params[0].axisValueLabel + "
        "; - - params.forEach(function (paramObj) { - - if(! paramObj.seriesName.includes("Stack")){ - var value = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(paramObj.value); - string += paramObj.seriesName + ": " + value + " [" + indicatorMetadataAndGeoJSON.unit + "]" + "
        "; - } - }); - - return string; - }, - axisPointer: { - type: 'line', - crossStyle: { - color: '#999' - } + var setLineChartOptions = function (indicatorMetadataAndGeoJSON, indicatorTimeSeriesDatesArray, indicatorTimeSeriesAverageArray, indicatorTimeSeriesMaxArray, indicatorTimeSeriesMinArray, spatialUnitName, date) { + var lineOption = { + // grid get rid of whitespace around chart + grid: { + left: '4%', + top: 32, + right: '4%', + bottom: 55, + containLabel: true + }, + title: { + text: 'Zeitreihe - ' + spatialUnitName, + left: 'center', + show: false, + textStyle: { + fontSize: 18 + }, + // top: 15 + }, + tooltip: { + trigger: 'axis', + confine: 'true', + formatter: function (params) { + var string = "" + params[0].axisValueLabel + "
        "; + params.forEach(function (paramObj) { + if (!paramObj.seriesName.includes("Stack")) { + var value = kommonitorDataExchangeService.getIndicatorValue_asFormattedText(paramObj.value); + string += paramObj.seriesName + ": " + value + " [" + indicatorMetadataAndGeoJSON.unit + "]" + "
        "; + } + }); + return string; + }, + axisPointer: { + type: 'line', + crossStyle: { + color: '#999' + } + } + }, + toolbox: { + show: true, + right: '15', + feature: { + // mark : {show: true}, + dataView: { + show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Zeitreihe', 'schließen', 'refresh'], optionToContent: function (opt) { + // + // + // + // + // + // + // + // + // + // + // + // + // + //
        Indikator-NameBeschreibung der Verknüpfung
        {{indicator.referencedIndicatorName}}{{indicator.referencedIndicatorDescription}}
        + var lineSeries = opt.series; + var timestamps = opt.xAxis[0].data; + var dataTableId = "lineDataTable_" + Math.random(); + var tableExportName = opt.xAxis[0].name + " - " + opt.title[0].text; + var htmlString = ''; + htmlString += ""; + htmlString += ""; + htmlString += ""; + for (var i = 0; i < lineSeries.length; i++) { + htmlString += ""; + } + htmlString += ""; + htmlString += ""; + htmlString += ""; + for (var j = 0; j < timestamps.length; j++) { + htmlString += ""; + htmlString += ""; + for (var k = 0; k < lineSeries.length; k++) { + var value = kommonitorDataExchangeService.getIndicatorValue_asNumber(lineSeries[k].data[j]); + htmlString += ""; + } + htmlString += ""; + } + htmlString += ""; + htmlString += "
        Zeitpunkt" + lineSeries[i].name + " [" + opt.yAxis[0].name + "]
        " + timestamps[j] + "" + value + "
        "; + $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); + return htmlString; + } + }, + restore: { show: false, title: "Erneuern" }, + saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + } + }, + legend: { + type: "scroll", + bottom: 0, + data: ['Arithmetisches Mittel'] + }, + xAxis: { + name: indicatorMetadataAndGeoJSON.indicatorName, + nameLocation: 'center', + nameGap: 22, + // axisLabel: { + // rotate: 90, + // interval: 0, + // inside: true + // }, + // z: 6, + // zlevel: 6, + type: 'category', + axisTick: { + show: false + }, + data: indicatorTimeSeriesDatesArray + }, + yAxis: { + type: 'value', + name: indicatorMetadataAndGeoJSON.unit, + // splitArea: { + // show: true + // } + }, + series: [ + { + name: "Arithmetisches Mittel", + type: 'line', + data: indicatorTimeSeriesAverageArray, + lineStyle: { + normal: { + color: 'gray', + width: 2, + type: 'dashed' + } + }, + itemStyle: { + normal: { + borderWidth: 3, + color: 'gray' + } + } + } + ] + }; + // SETTING FOR MIN AND MAX STACK + // default for min value of 0 + var minStack = { + name: "MinStack", + type: 'line', + data: indicatorTimeSeriesMinArray, + stack: "MinMax", + // areaStyle:{ + // color: "#d6d6d6" + // }, + lineStyle: { + opacity: 0 + }, + itemStyle: { + opacity: 0 + }, + silent: true + }; + var minLine = { + name: "Min", + type: 'line', + data: indicatorTimeSeriesMinArray, + lineStyle: { + opacity: 0, + color: "#d6d6d6" + }, + itemStyle: { + opacity: 0 + } + }; + var maxStack = { + name: "MaxStack", + type: 'line', + data: indicatorTimeSeriesMaxArray, + stack: "MinMax", + areaStyle: { + color: "#d6d6d6" + }, + lineStyle: { + opacity: 0 + }, + itemStyle: { + opacity: 0 + }, + silent: true + }; + var maxLine = { + name: "Max", + type: 'line', + data: indicatorTimeSeriesMaxArray, + lineStyle: { + opacity: 0, + color: "#d6d6d6" + }, + itemStyle: { + opacity: 0 + } + }; + // perform checks if there are negative values or only > 0 values + // then stacks must be adjusted to be correctly displayed + var minStack_minValue = Math.min(...indicatorTimeSeriesMinArray); + if (minStack_minValue < 0) { + minStack.areaStyle = { + color: "#d6d6d6" + }; } - }, - toolbox: { - show: true, - right: '15', - feature: { - // mark : {show: true}, - dataView: { - show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Zeitreihe', 'schließen', 'refresh'], optionToContent: function (opt) { - - // - // - // - // - // - // - // - // - // - // - // - // - // - //
        Indikator-NameBeschreibung der Verknüpfung
        {{indicator.referencedIndicatorName}}{{indicator.referencedIndicatorDescription}}
        - - var lineSeries = opt.series; - var timestamps = opt.xAxis[0].data; - - var dataTableId = "lineDataTable_" + Math.random(); - var tableExportName = opt.xAxis[0].name + " - " + opt.title[0].text; - - var htmlString = ''; - htmlString += ""; - htmlString += ""; - htmlString += ""; - - for (var i = 0; i < lineSeries.length; i++) { - htmlString += ""; - } - - htmlString += ""; - htmlString += ""; - - htmlString += ""; - - for (var j = 0; j < timestamps.length; j++) { - htmlString += ""; - htmlString += ""; - for (var k = 0; k < lineSeries.length; k++) { - var value = kommonitorDataExchangeService.getIndicatorValue_asNumber(lineSeries[k].data[j]); - htmlString += ""; + let indicatorTimeSeriesMaxArray_copy = JSON.parse(JSON.stringify(indicatorTimeSeriesMaxArray)); + if ((indicatorTimeSeriesMinArray.filter(item => item > 0))) { + for (let index = 0; index < indicatorTimeSeriesMaxArray_copy.length; index++) { + if (indicatorTimeSeriesMinArray[index] > 0) { + indicatorTimeSeriesMaxArray_copy[index] = indicatorTimeSeriesMaxArray_copy[index] - indicatorTimeSeriesMinArray[index]; } - htmlString += ""; - } - - htmlString += ""; - htmlString += "
        Zeitpunkt" + lineSeries[i].name + " [" + opt.yAxis[0].name + "]
        " + timestamps[j] + "" + value + "
        "; - - $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); - - return htmlString; } - }, - restore: { show: false, title: "Erneuern" }, - saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + maxStack.data = indicatorTimeSeriesMaxArray_copy; } - }, - legend: { - type: "scroll", - bottom: 0, - data: ['Arithmetisches Mittel'] - }, - xAxis: { - name: indicatorMetadataAndGeoJSON.indicatorName, - nameLocation: 'center', - nameGap: 22, - // axisLabel: { - // rotate: 90, - // interval: 0, - // inside: true - // }, - // z: 6, - // zlevel: 6, - type: 'category', - axisTick: { - show: false - }, - data: indicatorTimeSeriesDatesArray - }, - yAxis: { - type: 'value', - name: indicatorMetadataAndGeoJSON.unit, - // splitArea: { - // show: true - // } - }, - series: [ - { - name: "Arithmetisches Mittel", - type: 'line', - data: indicatorTimeSeriesAverageArray, - lineStyle: { - normal: { - color: 'gray', - width: 2, - type: 'dashed' - } - }, - itemStyle: { - normal: { - borderWidth: 3, - color: 'gray' - } + lineOption.series.push(minLine); + lineOption.series.push(maxLine); + lineOption.series.push(minStack); + lineOption.series.push(maxStack); + // use configuration item and data specified to show chart + self.lineChartOptions = lineOption; + }; + var setHistogramChartOptions = function (indicatorMetadataAndGeoJSON, indicatorValueArray, spatialUnitName, date) { + var bins; + try { + bins = ecStat.histogram(indicatorValueArray); + } + catch (error) { + console.log("Histogram chart cannot be drawn - error in bins creation"); + // kommonitorDataExchangeService.displayMapApplicationError(error); } - }] + // default fontSize of echarts title + var fontSize = 18; + var histogramChartTitel = 'Histogramm - ' + spatialUnitName + ' - '; + if (indicatorMetadataAndGeoJSON.fromDate) { + histogramChartTitel += "Bilanz " + indicatorMetadataAndGeoJSON.fromDate + " - " + indicatorMetadataAndGeoJSON.toDate; + fontSize = 14; + } + else { + histogramChartTitel += date; + } + var histogramOption = { + // grid get rid of whitespace around chart + grid: { + left: '4%', + top: 32, + right: '4%', + bottom: 35, + containLabel: true + }, + title: { + text: histogramChartTitel, + left: 'center', + textStyle: { + fontSize: fontSize + }, + show: false + // top: 15 + }, + tooltip: { + trigger: 'item', + confine: 'true', + axisPointer: { + type: 'line', + crossStyle: { + color: '#999' + } + } + }, + toolbox: { + show: true, + right: '15', + feature: { + // mark : {show: true}, + dataView: { + show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Histogramm', 'schließen', 'refresh'], optionToContent: function (opt) { + // + // + // + // + // + // + // + // + // + // + // + // + // + //
        Indikator-NameBeschreibung der Verknüpfung
        {{indicator.referencedIndicatorName}}{{indicator.referencedIndicatorDescription}}
        + var histogramData = opt.series[0].data; + var dataTableId = "histogramDataTable_" + Math.random(); + var tableExportName = opt.xAxis[0].name + " - " + opt.title[0].text; + var htmlString = ''; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + for (var i = 0; i < histogramData.length; i++) { + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + } + htmlString += ""; + htmlString += "
        WertintervallHäufigkeit
        " + histogramData[i][0] + " — " + histogramData[i][1] + "" + histogramData[i][2] + "
        "; + $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); + return htmlString; + } + }, + restore: { show: false, title: "Erneuern" }, + saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + } + }, + xAxis: [{ + name: indicatorMetadataAndGeoJSON.indicatorName, + nameLocation: 'center', + nameGap: 22, + scale: true, + }], + yAxis: { + name: 'Anzahl Features', + // nameGap: 35, + // nameLocation: 'center', + // nameRotate: 90, + }, + series: [{ + type: 'custom', + name: indicatorMetadataAndGeoJSON.indicatorName, + renderItem: function (params, api) { + var yValue = api.value(2); + var start = api.coord([api.value(0), yValue]); + var size = api.size([api.value(1) - api.value(0), yValue]); + return { + type: 'rect', + shape: { + x: start[0], + y: start[1], + width: size[0] * 0.99, + height: size[1] + }, + style: api.style() + }; + }, + itemStyle: { + color: '#337ab7' + }, + // label: { + // normal: { + // show: true, + // position: 'insideTop' + // } + // }, + dimensions: ['untere Intervallgrenze', 'obere Intervallgrenze', 'Anzahl'], + encode: { + x: [0, 1], + y: 2, + tooltip: [0, 1, 2] + }, + data: bins ? bins.customData : undefined + }] + }; + // var option = { + // title: { + // text: 'Histogram Chart', + // left: 'center', + // top: 20 + // }, + // tooltip: { + // trigger: 'axis', + // axisPointer: { + // type: 'line', + // crossStyle: { + // color: '#999' + // } + // } + // }, + // color: ['rgb(25, 183, 207)'], + // grid: { + // left: '3%', + // right: '3%', + // bottom: '3%', + // containLabel: true + // }, + // xAxis: [{ + // type: 'value', + // name: 'Wertintervalle', + // nameLocation: 'center', + // nameGap: 15, + // scale: true, + // }], + // yAxis: { + // type: 'value', + // name: 'Anzahl Features', + // nameGap: 22, + // nameLocation: 'center', + // nameRotate: 90, + // }, + // series: [{ + // name: 'Anzahl', + // type: 'bar', + // barWidth: '99,3%', + // // label: { + // // normal: { + // // show: true, + // // position: 'insideTop', + // // formatter: function (params) { + // // return params.value[1]; + // // } + // // } + // // }, + // data: bins.data + // }] + // }; + if (onlyContainsPositiveNumbers(indicatorValueArray)) { + histogramOption.xAxis.min = 0; + } + self.histogramChartOptions = histogramOption; }; - - // SETTING FOR MIN AND MAX STACK - - // default for min value of 0 - var minStack = { - name: "MinStack", - type: 'line', - data: indicatorTimeSeriesMinArray, - stack: "MinMax", - // areaStyle:{ - // color: "#d6d6d6" - // }, - lineStyle: { - opacity: 0 - }, - itemStyle: { - opacity: 0 - }, - silent: true + var onlyContainsPositiveNumbers = function (indicatorValueArray) { + indicatorValueArray.forEach(function (element) { + if (element < 0) { + return false; + } + }); + return true; }; - - var minLine = { - name: "Min", - type: 'line', - data: indicatorTimeSeriesMinArray, - lineStyle: { - opacity: 0, - color: "#d6d6d6" - }, - itemStyle: { - opacity: 0 - } + var appendSeriesToLineChart = function (featureProperties) { + // in case of activated balance mode, we must use the properties of kommonitorDataExchangeService.selectedIndicator, to aquire the correct time series item! + if (kommonitorDataExchangeService.isBalanceChecked) { + featureProperties = findPropertiesForTimeSeries(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + } + // append feature name to legend + $scope.lineOption.legend.data.push(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + // create feature data series + var featureSeries = {}; + featureSeries.name = featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]; + featureSeries.type = 'line'; + featureSeries.data = new Array(); + // for each date create series data entry for feature + for (var date of $scope.lineOption.xAxis.data) { + var value; + if (kommonitorDataExchangeService.indicatorValueIsNoData(featureProperties[INDICATOR_DATE_PREFIX + date])) { + value = null; + } + else { + value = kommonitorDataExchangeService.getIndicatorValue_asNumber(featureProperties[INDICATOR_DATE_PREFIX + date]); + } + featureSeries.data.push(value); + } + $scope.lineOption.series.push(featureSeries); + $scope.lineChart.setOption($scope.lineOption); + setTimeout(function () { + $scope.lineChart.resize(); + }, 350); }; - - var maxStack = { - name: "MaxStack", - type: 'line', - data: indicatorTimeSeriesMaxArray, - stack: "MinMax", - areaStyle:{ - color: "#d6d6d6" - }, - lineStyle: { - opacity: 0 - }, - itemStyle: { - opacity: 0 - }, - silent: true + var findPropertiesForTimeSeries = function (spatialUnitFeatureName) { + for (var feature of kommonitorDataExchangeService.selectedIndicator.geoJSON.features) { + if (feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialUnitFeatureName) { + return feature.properties; + } + } }; - - var maxLine = { - name: "Max", - type: 'line', - data: indicatorTimeSeriesMaxArray, - lineStyle: { - opacity: 0, - color: "#d6d6d6" - }, - itemStyle: { - opacity: 0 - } + var getSeriesIndexByFeatureName = function (featureName) { + for (var index = 0; index < $scope.lineOption.series.length; index++) { + if ($scope.lineOption.series[index].name === featureName) + return index; + } + //return -1 if none was found + return -1; }; - - // perform checks if there are negative values or only > 0 values - // then stacks must be adjusted to be correctly displayed - var minStack_minValue = Math.min(...indicatorTimeSeriesMinArray); - if(minStack_minValue < 0){ - minStack.areaStyle = { - color: "#d6d6d6" - }; - } - - let indicatorTimeSeriesMaxArray_copy = JSON.parse(JSON.stringify(indicatorTimeSeriesMaxArray)); - - if ((indicatorTimeSeriesMinArray.filter(item => item > 0))){ - for (let index = 0; index < indicatorTimeSeriesMaxArray_copy.length; index++) { - - if(indicatorTimeSeriesMinArray[index] > 0){ - indicatorTimeSeriesMaxArray_copy[index] = indicatorTimeSeriesMaxArray_copy[index] - indicatorTimeSeriesMinArray[index]; - } - } - maxStack.data = indicatorTimeSeriesMaxArray_copy; - } - - lineOption.series.push(minLine); - lineOption.series.push(maxLine); - lineOption.series.push(minStack); - lineOption.series.push(maxStack); - - - // use configuration item and data specified to show chart - self.lineChartOptions = lineOption; - }; - - - var setHistogramChartOptions = function (indicatorMetadataAndGeoJSON, indicatorValueArray, spatialUnitName, date) { - var bins; - try { - bins = ecStat.histogram(indicatorValueArray); - } - catch (error) { - console.log("Histogram chart cannot be drawn - error in bins creation"); - // kommonitorDataExchangeService.displayMapApplicationError(error); - } - - // default fontSize of echarts title - var fontSize = 18; - var histogramChartTitel = 'Histogramm - ' + spatialUnitName + ' - '; - if (indicatorMetadataAndGeoJSON.fromDate) { - histogramChartTitel += "Bilanz " + indicatorMetadataAndGeoJSON.fromDate + " - " + indicatorMetadataAndGeoJSON.toDate; - fontSize = 14; - } - else { - histogramChartTitel += date; - } - - var histogramOption = { - // grid get rid of whitespace around chart - grid: { - left: '4%', - top: 32, - right: '4%', - bottom: 35, - containLabel: true - }, - title: { - text: histogramChartTitel, - left: 'center', - textStyle: { - fontSize: fontSize - }, - show: false - // top: 15 - }, - tooltip: { - trigger: 'item', - confine: 'true', - axisPointer: { - type: 'line', - crossStyle: { - color: '#999' - } + var removeSeriesFromLineChart = function (featureProperties) { + // remove feature from legend + var legendIndex = $scope.lineOption.legend.data.indexOf(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + if (legendIndex > -1) { + $scope.lineOption.legend.data.splice(legendIndex, 1); } - }, - toolbox: { - show: true, - right: '15', - feature: { - // mark : {show: true}, - dataView: { - show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Histogramm', 'schließen', 'refresh'], optionToContent: function (opt) { - - // - // - // - // - // - // - // - // - // - // - // - // - // - //
        Indikator-NameBeschreibung der Verknüpfung
        {{indicator.referencedIndicatorName}}{{indicator.referencedIndicatorDescription}}
        - - var histogramData = opt.series[0].data; - - var dataTableId = "histogramDataTable_" + Math.random(); - var tableExportName = opt.xAxis[0].name + " - " + opt.title[0].text; - - var htmlString = ''; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - - htmlString += ""; - - for (var i = 0; i < histogramData.length; i++) { - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - } - - htmlString += ""; - htmlString += "
        WertintervallHäufigkeit
        " + histogramData[i][0] + " — " + histogramData[i][1] + "" + histogramData[i][2] + "
        "; - - $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); - - return htmlString; - } - }, - restore: { show: false, title: "Erneuern" }, - saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + // remove feature data series + var seriesIndex = getSeriesIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); + if (seriesIndex > -1) { + $scope.lineOption.series.splice(seriesIndex, 1); } - }, - xAxis: [{ - name: indicatorMetadataAndGeoJSON.indicatorName, - nameLocation: 'center', - nameGap: 22, - scale: true, - }], - yAxis: { - name: 'Anzahl Features', - // nameGap: 35, - // nameLocation: 'center', - // nameRotate: 90, - }, - series: [{ - type: 'custom', - name: indicatorMetadataAndGeoJSON.indicatorName, - renderItem: function (params, api) { - var yValue = api.value(2); - var start = api.coord([api.value(0), yValue]); - var size = api.size([api.value(1) - api.value(0), yValue]); - return { - type: 'rect', - shape: { - x: start[0], - y: start[1], - width: size[0] * 0.99, - height: size[1] + // second parameter tells echarts to not merge options with previous data. hence really remove series from graphic + $scope.lineChart.setOption($scope.lineOption, true); + setTimeout(function () { + $scope.lineChart.resize(); + }, 350); + }; + this.makeFeatureNameForPoiInIsochroneDiagram = function (poiGeoresource, geoJSONFeatureCollection, date) { + return poiGeoresource.datasetName + " - " + date + " (" + geoJSONFeatureCollection.features.length + ")"; + }; + this.createInitialReachabilityAnalysisPieOptions = function (poiGeoresource, geoJSONFeatureCollection, rangeValue, date) { + var option = { + grid: { + left: '4%', + top: 0, + right: '4%', + bottom: 30, + containLabel: true + }, + title: { + text: 'Analyse Einzugsgebiet ' + rangeValue, + left: 'center', + show: false + // top: 15 + }, + toolbox: { + show: true, + right: '15', + feature: { + // mark : {show: true}, + dataView: { + show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Punkte im Einzugsgebiet ' + rangeValue, 'schließen', 'refresh'], optionToContent: function (opt) { + var poiData = opt.series[0].data; + var dataTableId = "poiInIsochroneTable_" + Math.random(); + var tableExportName = opt.title[0].text; + var htmlString = ''; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + for (var i = 0; i < poiData.length; i++) { + htmlString += ""; + htmlString += ""; + htmlString += ""; + htmlString += ""; + } + htmlString += ""; + htmlString += "
        PunktlayerAnzahl Punkte im Einzugsgebiet
        " + poiData[i].name + "" + poiData[i].value + "
        "; + $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); + return htmlString; + } + }, + restore: { show: false, title: "Erneuern" }, + saveAsImage: { show: true, title: "Export", pixelRatio: 4 } + } }, - style: api.style() - }; - }, - itemStyle: { - color: '#337ab7' - }, - // label: { - // normal: { - // show: true, - // position: 'insideTop' - // } - // }, - dimensions: ['untere Intervallgrenze', 'obere Intervallgrenze', 'Anzahl'], - encode: { - x: [0, 1], - y: 2, - tooltip: [0, 1, 2] - }, - data: bins ? bins.customData : undefined - }] + tooltip: { + trigger: 'item', + formatter: '{a}
        {b}: {c} ({d}%)', + confine: true + }, + legend: { + orient: 'vertical', + type: "scroll", + left: 0, + data: [this.makeFeatureNameForPoiInIsochroneDiagram(poiGeoresource, geoJSONFeatureCollection, date)] + // data: [legendText] + }, + series: [ + { + name: "Punkte im Einzugsgebiet " + rangeValue, + type: 'pie', + radius: ['50%', '70%'], + center: ["70%", "50%"], + avoidLabelOverlap: true, + label: { + show: false, + position: 'center' + }, + emphasis: { + label: { + show: true, + fontSize: '10', + // fontWeight: 'bold' + } + }, + labelLine: { + show: true + }, + data: [ + { value: geoJSONFeatureCollection.features.length, name: this.makeFeatureNameForPoiInIsochroneDiagram(poiGeoresource, geoJSONFeatureCollection, date) } + ] + } + ] + }; + return option; }; - - // var option = { - // title: { - // text: 'Histogram Chart', - // left: 'center', - // top: 20 - // }, - // tooltip: { - // trigger: 'axis', - // axisPointer: { - // type: 'line', - // crossStyle: { - // color: '#999' - // } - // } - // }, - // color: ['rgb(25, 183, 207)'], - // grid: { - // left: '3%', - // right: '3%', - // bottom: '3%', - // containLabel: true - // }, - // xAxis: [{ - // type: 'value', - // name: 'Wertintervalle', - // nameLocation: 'center', - // nameGap: 15, - // scale: true, - // }], - // yAxis: { - // type: 'value', - // name: 'Anzahl Features', - // nameGap: 22, - // nameLocation: 'center', - // nameRotate: 90, - // }, - // series: [{ - // name: 'Anzahl', - // type: 'bar', - // barWidth: '99,3%', - // // label: { - // // normal: { - // // show: true, - // // position: 'insideTop', - // // formatter: function (params) { - // // return params.value[1]; - // // } - // // } - // // }, - // data: bins.data - // }] - // }; - - if (onlyContainsPositiveNumbers(indicatorValueArray)) { - histogramOption.xAxis.min = 0; - } - - self.histogramChartOptions = histogramOption; - }; - - var onlyContainsPositiveNumbers = function (indicatorValueArray) { - indicatorValueArray.forEach(function (element) { - if (element < 0) { - return false; - } - }); - - return true; - }; - - - var appendSeriesToLineChart = function (featureProperties) { - - // in case of activated balance mode, we must use the properties of kommonitorDataExchangeService.selectedIndicator, to aquire the correct time series item! - if (kommonitorDataExchangeService.isBalanceChecked) { - featureProperties = findPropertiesForTimeSeries(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - } - - // append feature name to legend - $scope.lineOption.legend.data.push(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - - // create feature data series - var featureSeries = {}; - featureSeries.name = featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]; - featureSeries.type = 'line'; - featureSeries.data = new Array(); - - // for each date create series data entry for feature - for (var date of $scope.lineOption.xAxis.data) { - var value; - if (kommonitorDataExchangeService.indicatorValueIsNoData(featureProperties[INDICATOR_DATE_PREFIX + date])) { - value = null; - } - else { - value = kommonitorDataExchangeService.getIndicatorValue_asNumber(featureProperties[INDICATOR_DATE_PREFIX + date]); - } - featureSeries.data.push(value); - } - - $scope.lineOption.series.push(featureSeries); - - $scope.lineChart.setOption($scope.lineOption); - setTimeout(function () { - $scope.lineChart.resize(); - }, 350); - }; - - var findPropertiesForTimeSeries = function (spatialUnitFeatureName) { - for (var feature of kommonitorDataExchangeService.selectedIndicator.geoJSON.features) { - if (feature.properties[__env.FEATURE_NAME_PROPERTY_NAME] == spatialUnitFeatureName) { - return feature.properties; - } - } - } - - var getSeriesIndexByFeatureName = function (featureName) { - for (var index = 0; index < $scope.lineOption.series.length; index++) { - if ($scope.lineOption.series[index].name === featureName) - return index; - } - - //return -1 if none was found - return -1; - }; - - var removeSeriesFromLineChart = function (featureProperties) { - // remove feature from legend - var legendIndex = $scope.lineOption.legend.data.indexOf(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - if (legendIndex > -1) { - $scope.lineOption.legend.data.splice(legendIndex, 1); - } - - // remove feature data series - var seriesIndex = getSeriesIndexByFeatureName(featureProperties[__env.FEATURE_NAME_PROPERTY_NAME]); - if (seriesIndex > -1) { - $scope.lineOption.series.splice(seriesIndex, 1); - } - - // second parameter tells echarts to not merge options with previous data. hence really remove series from graphic - $scope.lineChart.setOption($scope.lineOption, true); - setTimeout(function () { - $scope.lineChart.resize(); - }, 350); - }; - - this.makeFeatureNameForPoiInIsochroneDiagram = function(poiGeoresource, geoJSONFeatureCollection, date){ - return poiGeoresource.datasetName + " - " + date + " (" + geoJSONFeatureCollection.features.length + ")"; - }; - - this.createInitialReachabilityAnalysisPieOptions = function(poiGeoresource, geoJSONFeatureCollection, rangeValue, date){ - var option = { - grid: { - left: '4%', - top: 0, - right: '4%', - bottom: 30, - containLabel: true - }, - title: { - text: 'Analyse Einzugsgebiet ' + rangeValue, - left: 'center', - show: false - // top: 15 - }, - toolbox: { - show: true, - right: '15', - feature: { - // mark : {show: true}, - dataView: { - show: kommonitorDataExchangeService.showDiagramExportButtons, readOnly: true, title: "Datenansicht", lang: ['Datenansicht - Punkte im Einzugsgebiet ' + rangeValue, 'schließen', 'refresh'], optionToContent: function (opt) { - - var poiData = opt.series[0].data; - - var dataTableId = "poiInIsochroneTable_" + Math.random(); - var tableExportName = opt.title[0].text; - - var htmlString = ''; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - - htmlString += ""; - - for (var i = 0; i < poiData.length; i++) { - htmlString += ""; - htmlString += ""; - htmlString += ""; - htmlString += ""; - } - - htmlString += ""; - htmlString += "
        PunktlayerAnzahl Punkte im Einzugsgebiet
        " + poiData[i].name + "" + poiData[i].value + "
        "; - - $rootScope.$broadcast("AppendExportButtonsForTable", dataTableId, tableExportName); - - return htmlString; + this.appendToReachabilityAnalysisOptions = function (poiGeoresource, geoJSONFeatureCollection, eChartsOptions, date) { + eChartsOptions.legend[0].data.push(this.makeFeatureNameForPoiInIsochroneDiagram(poiGeoresource, geoJSONFeatureCollection, date)); + eChartsOptions.series[0].data.push({ value: geoJSONFeatureCollection.features.length, name: this.makeFeatureNameForPoiInIsochroneDiagram(poiGeoresource, geoJSONFeatureCollection, date) }); + return eChartsOptions; + }; + this.removePoiFromReachabilityAnalysisOption = function (eChartOptions, poiGeoresource) { + for (let index = 0; index < eChartOptions.legend[0].data.length; index++) { + const legendItem = eChartOptions.legend[0].data[index]; + if (legendItem.includes(poiGeoresource.datasetName)) { + eChartOptions.legend[0].data.splice(index, 1); + } + } + for (let index2 = 0; index2 < eChartOptions.series[0].data.length; index2++) { + const dataItem = eChartOptions.series[0].data[index2]; + if (dataItem.name.includes(poiGeoresource.datasetName)) { + eChartOptions.series[0].data.splice(index2, 1); } - }, - restore: { show: false, title: "Erneuern" }, - saveAsImage: { show: true, title: "Export", pixelRatio: 4 } } - }, - tooltip: { - trigger: 'item', - formatter: '{a}
        {b}: {c} ({d}%)', - confine: true - }, - legend: { - orient: 'vertical', - type: "scroll", - left: 0, - data: [this.makeFeatureNameForPoiInIsochroneDiagram(poiGeoresource, geoJSONFeatureCollection, date)] - // data: [legendText] - }, - series: [ - { - name: "Punkte im Einzugsgebiet " + rangeValue, - type: 'pie', - radius: ['50%', '70%'], - center: ["70%", "50%"], - avoidLabelOverlap: true, - label: { - show: false, - position: 'center' - }, - - emphasis: { - label: { - show: true, - fontSize: '10', - // fontWeight: 'bold' - } - }, - labelLine: { - show: true - }, - data: [ - {value: geoJSONFeatureCollection.features.length, name: this.makeFeatureNameForPoiInIsochroneDiagram(poiGeoresource, geoJSONFeatureCollection, date)} - ] - } - ] + return eChartOptions; }; - - return option; - }; - - this.appendToReachabilityAnalysisOptions = function(poiGeoresource, geoJSONFeatureCollection, eChartsOptions, date){ - eChartsOptions.legend[0].data.push(this.makeFeatureNameForPoiInIsochroneDiagram(poiGeoresource, geoJSONFeatureCollection, date)); - eChartsOptions.series[0].data.push({value: geoJSONFeatureCollection.features.length, name: this.makeFeatureNameForPoiInIsochroneDiagram(poiGeoresource, geoJSONFeatureCollection, date)}); - - return eChartsOptions; - }; - - this.removePoiFromReachabilityAnalysisOption = function(eChartOptions, poiGeoresource){ - for (let index = 0; index < eChartOptions.legend[0].data.length; index++) { - const legendItem = eChartOptions.legend[0].data[index]; - if(legendItem.includes(poiGeoresource.datasetName)){ - eChartOptions.legend[0].data.splice(index, 1); - } - } - - for (let index2 = 0; index2 < eChartOptions.series[0].data.length; index2++) { - const dataItem = eChartOptions.series[0].data[index2]; - if(dataItem.name.includes(poiGeoresource.datasetName)){ - eChartOptions.series[0].data.splice(index2, 1); - } - } - - return eChartOptions; - }; - - this.makeTrendChartOptions_forAllFeatures = function(indicatorMetadataAndGeoJSON, fromDateAsPropertyString, toDateAsPropertyString, showMinMax, showCompleteTimeseries, computationType){ - // we may base on the the precomputed timeseries lineOptions and modify that from a cloned instance - - var timeseriesOptions = JSON.parse(JSON.stringify(this.getLineChartOptions())); - - // remove any additional lines for concrete features - timeseriesOptions.series.length = 3; - - // add markedAreas for periods out of scope - - var fromDateString = fromDateAsPropertyString.split(__env.indicatorDatePrefix)[1]; - var fromDate_date = new Date(fromDateString); - var toDateString = toDateAsPropertyString.split(__env.indicatorDatePrefix)[1]; - var toDate_date = new Date(toDateString); - - if(showCompleteTimeseries){ - timeseriesOptions.series[0].markArea = { - silent: true, - itemStyle: { - color: '#b50b0b', - opacity: 0.3 - }, - data: [[{ - xAxis: indicatorMetadataAndGeoJSON.applicableDates[0] - }, { - xAxis: fromDateString - }], - [{ - xAxis: toDateString - }, { - xAxis: indicatorMetadataAndGeoJSON.applicableDates[indicatorMetadataAndGeoJSON.applicableDates.length - 1] - }]] - }; - } - - // hide data points - timeseriesOptions.series[0].itemStyle.normal.opacity = 0; - timeseriesOptions.series[0].lineStyle.normal.width = 3; - timeseriesOptions.series[0].lineStyle.normal.type = "solid"; - - var trendData = []; - - var timeseriesData = timeseriesOptions.series[0].data; - var minSeriesData = timeseriesOptions.series[1].data; - var maxSeriesData = timeseriesOptions.series[2].data; - - if(! showCompleteTimeseries){ - var xData = []; - var timeData = []; - var minData = []; - var maxData = []; + this.makeTrendChartOptions_forAllFeatures = function (indicatorMetadataAndGeoJSON, fromDateAsPropertyString, toDateAsPropertyString, showMinMax, showCompleteTimeseries, computationType) { + // we may base on the the precomputed timeseries lineOptions and modify that from a cloned instance + var timeseriesOptions = JSON.parse(JSON.stringify(this.getLineChartOptions())); + // remove any additional lines for concrete features + timeseriesOptions.series.length = 3; + // add markedAreas for periods out of scope + var fromDateString = fromDateAsPropertyString.split(__env.indicatorDatePrefix)[1]; + var fromDate_date = new Date(fromDateString); + var toDateString = toDateAsPropertyString.split(__env.indicatorDatePrefix)[1]; + var toDate_date = new Date(toDateString); + if (showCompleteTimeseries) { + timeseriesOptions.series[0].markArea = { + silent: true, + itemStyle: { + color: '#b50b0b', + opacity: 0.3 + }, + data: [[{ + xAxis: indicatorMetadataAndGeoJSON.applicableDates[0] + }, { + xAxis: fromDateString + }], + [{ + xAxis: toDateString + }, { + xAxis: indicatorMetadataAndGeoJSON.applicableDates[indicatorMetadataAndGeoJSON.applicableDates.length - 1] + }]] + }; + } + // hide data points + timeseriesOptions.series[0].itemStyle.normal.opacity = 0; + timeseriesOptions.series[0].lineStyle.normal.width = 3; + timeseriesOptions.series[0].lineStyle.normal.type = "solid"; + var trendData = []; + var timeseriesData = timeseriesOptions.series[0].data; + var minSeriesData = timeseriesOptions.series[1].data; + var maxSeriesData = timeseriesOptions.series[2].data; + if (!showCompleteTimeseries) { + var xData = []; + var timeData = []; + var minData = []; + var maxData = []; + for (let index = 0; index < timeseriesData.length; index++) { + var date_candidate = new Date(indicatorMetadataAndGeoJSON.applicableDates[index]); + if (date_candidate >= fromDate_date && date_candidate <= toDate_date) { + const value = timeseriesData[index]; + // const date = indicatorMetadataAndGeoJSON.applicableDates[index]; + timeData.push(value); + xData.push(indicatorMetadataAndGeoJSON.applicableDates[index]); + minData.push(minSeriesData[index]); + maxData.push(maxSeriesData[index]); + } + } + timeseriesOptions.series[0].data = timeData; + timeseriesOptions.series[1].data = minData; + timeseriesOptions.series[2].data = maxData; + timeseriesOptions.xAxis.data = xData; + } + // update value if it has changed + timeseriesData = timeseriesOptions.series[0].data; + var xAxisData = timeseriesOptions.xAxis.data; for (let index = 0; index < timeseriesData.length; index++) { - var date_candidate = new Date(indicatorMetadataAndGeoJSON.applicableDates[index]); - if(date_candidate >= fromDate_date && date_candidate <= toDate_date){ - const value = timeseriesData[index]; - // const date = indicatorMetadataAndGeoJSON.applicableDates[index]; - - timeData.push(value); - xData.push(indicatorMetadataAndGeoJSON.applicableDates[index]); - minData.push(minSeriesData[index]); - maxData.push(maxSeriesData[index]); - } + var dateCandidate = new Date(xAxisData[index]); + if (dateCandidate >= fromDate_date && dateCandidate <= toDate_date) { + const value = timeseriesData[index]; + // const date = indicatorMetadataAndGeoJSON.applicableDates[index]; + trendData.push([index, value]); + } } - - timeseriesOptions.series[0].data = timeData; - timeseriesOptions.series[1].data = minData; - timeseriesOptions.series[2].data = maxData; - - timeseriesOptions.xAxis.data = xData; - } - - // update value if it has changed - timeseriesData = timeseriesOptions.series[0].data; - var xAxisData = timeseriesOptions.xAxis.data; - for (let index = 0; index < timeseriesData.length; index++) { - var dateCandidate = new Date(xAxisData[index]); - if(dateCandidate >= fromDate_date && dateCandidate <= toDate_date){ - const value = timeseriesData[index]; - // const date = indicatorMetadataAndGeoJSON.applicableDates[index]; - - trendData.push([index, value]); - } - } - - // add regression line according to option - - var trendLine; - if (computationType.includes("linear")){ - trendLine = ecStat.regression('linear', trendData); - } - else if (computationType.includes("exponential")){ - trendLine = ecStat.regression('exponential', trendData); - } - else if (computationType.includes("polynomial_3")){ - trendLine = ecStat.regression('polynomial', trendData, 3); - } - else{ - trendLine = ecStat.regression('linear', trendData); - } - - timeseriesOptions.legend.data.push("Trendlinie"); - - timeseriesOptions.series.push({ - name: 'Trendlinie', - type: 'line', - showSymbol: false, - data: trendLine.points, - lineStyle: { - normal: { - color: 'red', - width: 4, - type: 'dashed' - } - }, - itemStyle: { - normal: { - borderWidth: 3, - color: 'red', - opacity: 0 - } - }, - markPoint: { + // add regression line according to option + var trendLine; + if (computationType.includes("linear")) { + trendLine = ecStat.regression('linear', trendData); + } + else if (computationType.includes("exponential")) { + trendLine = ecStat.regression('exponential', trendData); + } + else if (computationType.includes("polynomial_3")) { + trendLine = ecStat.regression('polynomial', trendData, 3); + } + else { + trendLine = ecStat.regression('linear', trendData); + } + timeseriesOptions.legend.data.push("Trendlinie"); + timeseriesOptions.series.push({ + name: 'Trendlinie', + type: 'line', + showSymbol: false, + data: trendLine.points, + lineStyle: { + normal: { + color: 'red', + width: 4, + type: 'dashed' + } + }, itemStyle: { normal: { - color: 'transparent' + borderWidth: 3, + color: 'red', + opacity: 0 } }, - // label: { - // normal: { - // show: true, - // position: 'left', - // formatter: trendLine.expression, - // textStyle: { - // color: '#333', - // fontSize: 14 - // } - // } - // }, - data: [{ - coord: trendLine.points[trendLine.points.length - 1] - }] - } - }); - - if(! showMinMax){ - timeseriesOptions.series.splice(1, 1); - timeseriesOptions.series.splice(1, 1); - } - - return timeseriesOptions; - }; - - // Returns an image. - // Attribution has to be converted to an image anyway for report generation. - this.createReportingReachabilityMapAttribution = async function() { - let attributionText = "Leaflet | Map data @ OpenStreetMap contributors" - let canvas = document.createElement("canvas") - canvas.width = 800; - let ctx = canvas.getContext('2d') - ctx.font = "8pt Arial"; - ctx.textBaseline = 'top'; - ctx.fillStyle = "rgb(60, 60, 60)"; - ctx.fillText(attributionText, 0, 0); - canvas = trimCanvas(canvas, 5) - - let image = new Image(canvas.width, canvas.height) - image.style.backgroundColor = "white"; - return await new Promise( (resolve, reject) => { - image.onload = function() { - resolve(image); - } - image.src = canvas.toDataURL(); - }); - } - - // Returns an image. - // Legend has to be converted to an image anyway for report generation. - this.createReportingReachabilityMapLegend = async function(echartsOptions, selectedSpatialUnit, isochronesRangeType, isochronesRangeUnits) { - let legendEntries = []; - let isochronesHeadingAdded = false; - for(let i=0; i { - return entry.isIsochroneEntry - }); - // layer isochrone icons on top of each other unitl we reach the current one - for(let isochroneEntry of isochroneEntries.reverse()) { - if(isochroneEntry === entry) { - break; + return timeseriesOptions; + }; + // Returns an image. + // Attribution has to be converted to an image anyway for report generation. + this.createReportingReachabilityMapAttribution = async function () { + let attributionText = "Leaflet | Map data @ OpenStreetMap contributors"; + let canvas = document.createElement("canvas"); + canvas.width = 800; + let ctx = canvas.getContext('2d'); + ctx.font = "8pt Arial"; + ctx.textBaseline = 'top'; + ctx.fillStyle = "rgb(60, 60, 60)"; + ctx.fillText(attributionText, 0, 0); + canvas = trimCanvas(canvas, 5); + let image = new Image(canvas.width, canvas.height); + image.style.backgroundColor = "white"; + return await new Promise((resolve, reject) => { + image.onload = function () { + resolve(image); + }; + image.src = canvas.toDataURL(); + }); + }; + // Returns an image. + // Legend has to be converted to an image anyway for report generation. + this.createReportingReachabilityMapLegend = async function (echartsOptions, selectedSpatialUnit, isochronesRangeType, isochronesRangeUnits) { + let legendEntries = []; + let isochronesHeadingAdded = false; + for (let i = 0; i < echartsOptions.series.length; i++) { + let series = echartsOptions.series[i]; + if (series.name === "spatialUnitBoundaries") { + legendEntries.push({ + label: selectedSpatialUnit.spatialUnitName ? selectedSpatialUnit.spatialUnitName : selectedSpatialUnit.spatialUnitLevel, + iconColor: series.itemStyle.borderColor, + iconHeight: 4, + isGroupHeading: false + }); + } + if (series.name.includes("isochrones")) { + if (!isochronesHeadingAdded) { // add heading above first isochrone entry + legendEntries.push({ + label: "Erreichbarkeit", + isGroupHeading: true + }); + isochronesHeadingAdded = true; + } + let value = series.data[0].value; + legendEntries.push({ + label: value, + iconColor: series.data[0].itemStyle.areaColor, + iconOpacity: series.data[0].itemStyle.opacity, + iconHeight: 12, + isGroupHeading: false, + isIsochroneEntry: true + }); } - ctx.fillStyle = isochroneEntry.iconColor; - ctx.globalAlpha = isochroneEntry.iconOpacity; - ctx.fillRect(xPos, yPos + ( (12-entry.iconHeight) / 2), iconWidth, isochroneEntry.iconHeight) - ctx.globalAlpha = 1; - } } - - ctx.fillStyle = entry.iconColor; - ctx.globalAlpha = entry.iconOpacity ? entry.iconOpacity : 1; - ctx.fillRect(xPos, yPos + ( (12-entry.iconHeight) / 2), iconWidth, entry.iconHeight) - ctx.globalAlpha = 1; - // and label + let canvas = document.createElement("canvas"); + canvas.width = 800; + canvas.height = 800; + let ctx = canvas.getContext('2d'); + let fontStyle = "8pt Arial"; ctx.font = fontStyle; - ctx.fillStyle = "black"; - ctx.textBaseline = "top"; - if(entry.isIsochroneEntry) { - let text = entry.label + " " + isochronesRangeUnits - ctx.fillText(text, xPos + iconWidth + 5, yPos) - } else { - ctx.fillText(entry.label, xPos + iconWidth + 5, yPos) + let xPos = 5; + let yPos = 5; + let rowHeight = 20; + let iconWidth = 30; + for (let entry of legendEntries) { + if (entry.isGroupHeading) { + let isochronesRangeTypeMapping = { + "time": "Zeit", + "distance": "Distanz" + }; + // only draw label + ctx.font = "bold " + fontStyle; + ctx.fillStyle = "black"; + ctx.textBaseline = "top"; + let text = entry.label + " [" + isochronesRangeTypeMapping[isochronesRangeType] + "]"; + ctx.fillText(text, xPos, yPos); + yPos += rowHeight; + } + else { + // icon + if (entry.isIsochroneEntry) { + let isochroneEntries = legendEntries.filter(entry => { + return entry.isIsochroneEntry; + }); + // layer isochrone icons on top of each other unitl we reach the current one + for (let isochroneEntry of isochroneEntries.reverse()) { + if (isochroneEntry === entry) { + break; + } + ctx.fillStyle = isochroneEntry.iconColor; + ctx.globalAlpha = isochroneEntry.iconOpacity; + ctx.fillRect(xPos, yPos + ((12 - entry.iconHeight) / 2), iconWidth, isochroneEntry.iconHeight); + ctx.globalAlpha = 1; + } + } + ctx.fillStyle = entry.iconColor; + ctx.globalAlpha = entry.iconOpacity ? entry.iconOpacity : 1; + ctx.fillRect(xPos, yPos + ((12 - entry.iconHeight) / 2), iconWidth, entry.iconHeight); + ctx.globalAlpha = 1; + // and label + ctx.font = fontStyle; + ctx.fillStyle = "black"; + ctx.textBaseline = "top"; + if (entry.isIsochroneEntry) { + let text = entry.label + " " + isochronesRangeUnits; + ctx.fillText(text, xPos + iconWidth + 5, yPos); + } + else { + ctx.fillText(entry.label, xPos + iconWidth + 5, yPos); + } + yPos += rowHeight; + } } - yPos += rowHeight - } - } - - canvas = trimCanvas(canvas, 5) - let image = new Image(canvas.width, canvas.height) - image.style.backgroundColor = "white"; - return await new Promise( (resolve, reject) => { - image.onload = function() { - resolve(image); - } - image.src = canvas.toDataURL(); - }); - } - - var calculateOverallBoundingBoxFromGeoJSON = function(features) { - let result = []; - for(var i=0; i result[2]) ? bbox[2] : result[2]; - result[3] = (bbox[3] > result[3]) ? bbox[3] : result[3]; - } - } - return result; - }; - - function trimCanvas(canvas, padding=0) { - function rowBlank(imageData, width, y) { - for (var x = 0; x < width; ++x) { - if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false; + canvas = trimCanvas(canvas, 5); + let image = new Image(canvas.width, canvas.height); + image.style.backgroundColor = "white"; + return await new Promise((resolve, reject) => { + image.onload = function () { + resolve(image); + }; + image.src = canvas.toDataURL(); + }); + }; + var calculateOverallBoundingBoxFromGeoJSON = function (features) { + let result = []; + for (var i = 0; i < features.length; i++) { + // check if we have to modify our overall bbox (result) + if (result.length === 0) { // for first feature + result.push(...features[i].properties.bbox); + } + else { + // all other features + let bbox = features[i].properties.bbox; + result[0] = (bbox[0] < result[0]) ? bbox[0] : result[0]; + result[1] = (bbox[1] < result[1]) ? bbox[1] : result[1]; + result[2] = (bbox[2] > result[2]) ? bbox[2] : result[2]; + result[3] = (bbox[3] > result[3]) ? bbox[3] : result[3]; + } } - return true; - } - - function columnBlank(imageData, width, x, top, bottom) { - for (var y = top; y < bottom; ++y) { - if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false; + return result; + }; + function trimCanvas(canvas, padding = 0) { + function rowBlank(imageData, width, y) { + for (var x = 0; x < width; ++x) { + if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) + return false; + } + return true; + } + function columnBlank(imageData, width, x, top, bottom) { + for (var y = top; y < bottom; ++y) { + if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) + return false; + } + return true; } - return true; - } - - var ctx = canvas.getContext("2d"); var width = canvas.width; var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); var top = 0, bottom = imageData.height, left = 0, right = imageData.width; - - while (top < bottom && rowBlank(imageData, width, top)) ++top; - while (bottom - 1 > top && rowBlank(imageData, width, bottom - 1)) --bottom; - while (left < right && columnBlank(imageData, width, left, top, bottom)) ++left; - while (right - 1 > left && columnBlank(imageData, width, right - 1, top, bottom)) --right; - + while (top < bottom && rowBlank(imageData, width, top)) + ++top; + while (bottom - 1 > top && rowBlank(imageData, width, bottom - 1)) + --bottom; + while (left < right && columnBlank(imageData, width, left, top, bottom)) + ++left; + while (right - 1 > left && columnBlank(imageData, width, right - 1, top, bottom)) + --right; var trimmed = ctx.getImageData(left, top, right - left, bottom - top); var copy = canvas.ownerDocument.createElement("canvas"); var copyCtx = copy.getContext("2d"); - copy.width = trimmed.width + padding*2; - copy.height = trimmed.height + padding*2; + copy.width = trimmed.width + padding * 2; + copy.height = trimmed.height + padding * 2; copyCtx.putImageData(trimmed, padding, padding); - return copy; - }; - + } + ; }]); +//# sourceMappingURL=kommonitor-diagram-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorDiagramHelperService/kommonitor-diagram-helper-service.module.js.map b/app/util/genericServices/kommonitorDiagramHelperService/kommonitor-diagram-helper-service.module.js.map new file mode 100644 index 000000000..fb90dffb5 --- /dev/null +++ b/app/util/genericServices/kommonitorDiagramHelperService/kommonitor-diagram-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-diagram-helper-service.module.js","sourceRoot":"","sources":["kommonitor-diagram-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.module.js b/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.module.js index d2604eb61..2c7bcdca5 100644 --- a/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.module.js +++ b/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.module.js @@ -1,5 +1,5 @@ +"use strict"; angular.module('kommonitorElementVisibilityHelper', ['kommonitorDataExchange', 'kommonitorKeycloakHelper']); - /** * a common serviceInstance that holds all needed properties for a WPS service. * @@ -10,111 +10,89 @@ angular.module('kommonitorElementVisibilityHelper', ['kommonitorDataExchange', ' * parameters for each WPS operation represented by different Angular components */ angular - .module('kommonitorElementVisibilityHelper', []) - .service( - 'kommonitorElementVisibilityHelperService', ['$rootScope', '$timeout', '$http', '$httpParamSerializerJQLike', '__env', + .module('kommonitorElementVisibilityHelper', []) + .service('kommonitorElementVisibilityHelperService', ['$rootScope', '$timeout', '$http', '$httpParamSerializerJQLike', '__env', 'ControlsConfigService', 'Auth', 'kommonitorDataExchangeService', 'kommonitorKeycloakHelperService', - function ($rootScope, $timeout, - $http, $httpParamSerializerJQLike, __env, ControlsConfigService, Auth, kommonitorDataExchangeService, kommonitorKeycloakHelperService) { - - var self = this; - this.elementVisibility = {}; - - this.isAdvancedMode = __env.isAdvancedMode; - this.showAdvancedModeSwitch = __env.showAdvancedModeSwitch; - - this.advancedModeRoleName = "fakeAdvancedModeRole"; - - this.initElementVisibility = function () { - kommonitorDataExchangeService.showDiagramExportButtons = true; - kommonitorDataExchangeService.showGeoresourceExportButtons = true; - + function ($rootScope, $timeout, $http, $httpParamSerializerJQLike, __env, ControlsConfigService, Auth, kommonitorDataExchangeService, kommonitorKeycloakHelperService) { + var self = this; this.elementVisibility = {}; - var config = ControlsConfigService.getControlsConfig(); - config.forEach(element => { - self.elementVisibility[element.id] = checkElementVisibility(element.id); - }); - - $timeout(function(){ - $rootScope.$apply(); - - }); - - - }; - - this.onChangeIsAdvancedMode = function (){ - - this.initElementVisibility(); - - // if any sidebar was previously not displayed we must ensure that it is properly instantiated for current indicator - $rootScope.$broadcast("changeIndicatorDate"); - }; - - var checkElementVisibility = function(id) { - - var element = ControlsConfigService.getControlsConfig().filter(element => element.id === id)[0]; - - if(element.roles === undefined || element.roles.length === 0) { - return true; - } - else if(self.isAdvancedMode && element.roles && element.roles.includes(self.advancedModeRoleName)){ - return true; - } - else if(Auth.keycloak.authenticated) { - // admin role user always sees all data and widgets - if(Auth.keycloak.showAdminView){ - return true; - } - var hasAllowedRole = false; - for (var i = 0; i < element.roles.length; i++) { - if(Auth.keycloak.tokenParsed.realm_access.roles.includes(element.roles[i])){ - return true; - } - } - - // special case for diagram export buttons - if(! hasAllowedRole && element.id === "diagramExportButtons"){ - kommonitorDataExchangeService.showDiagramExportButtons = false; - } - // special case for georesource export buttons - if(! hasAllowedRole && element.id === "georesourceExportButtons"){ - kommonitorDataExchangeService.showGeoresourceExportButtons = false; - } - - return hasAllowedRole; - } else { - if(! kommonitorDataExchangeService.enableKeycloakSecurity){ - if(element.roles && element.roles.includes(self.advancedModeRoleName)){ - - // special case for diagram export buttons - if(element.id === "diagramExportButtons"){ - kommonitorDataExchangeService.showDiagramExportButtons = false; - } - // special case for georesource export buttons - if(element.id === "georesourceExportButtons"){ - kommonitorDataExchangeService.showGeoresourceExportButtons = false; - } - - return false; + this.isAdvancedMode = __env.isAdvancedMode; + this.showAdvancedModeSwitch = __env.showAdvancedModeSwitch; + this.advancedModeRoleName = "fakeAdvancedModeRole"; + this.initElementVisibility = function () { + kommonitorDataExchangeService.showDiagramExportButtons = true; + kommonitorDataExchangeService.showGeoresourceExportButtons = true; + this.elementVisibility = {}; + var config = ControlsConfigService.getControlsConfig(); + config.forEach(element => { + self.elementVisibility[element.id] = checkElementVisibility(element.id); + }); + $timeout(function () { + $rootScope.$apply(); + }); + }; + this.onChangeIsAdvancedMode = function () { + this.initElementVisibility(); + // if any sidebar was previously not displayed we must ensure that it is properly instantiated for current indicator + $rootScope.$broadcast("changeIndicatorDate"); + }; + var checkElementVisibility = function (id) { + var element = ControlsConfigService.getControlsConfig().filter(element => element.id === id)[0]; + if (element.roles === undefined || element.roles.length === 0) { + return true; + } + else if (self.isAdvancedMode && element.roles && element.roles.includes(self.advancedModeRoleName)) { + return true; } - return true; - } - else{ - // special case for diagram export buttons - if(element.id === "diagramExportButtons"){ - kommonitorDataExchangeService.showDiagramExportButtons = false; + else if (Auth.keycloak.authenticated) { + // admin role user always sees all data and widgets + if (Auth.keycloak.showAdminView) { + return true; + } + var hasAllowedRole = false; + for (var i = 0; i < element.roles.length; i++) { + if (Auth.keycloak.tokenParsed.realm_access.roles.includes(element.roles[i])) { + return true; + } + } + // special case for diagram export buttons + if (!hasAllowedRole && element.id === "diagramExportButtons") { + kommonitorDataExchangeService.showDiagramExportButtons = false; + } + // special case for georesource export buttons + if (!hasAllowedRole && element.id === "georesourceExportButtons") { + kommonitorDataExchangeService.showGeoresourceExportButtons = false; + } + return hasAllowedRole; } - // special case for georesource export buttons - if(element.id === "georesourceExportButtons"){ - kommonitorDataExchangeService.showGeoresourceExportButtons = false; + else { + if (!kommonitorDataExchangeService.enableKeycloakSecurity) { + if (element.roles && element.roles.includes(self.advancedModeRoleName)) { + // special case for diagram export buttons + if (element.id === "diagramExportButtons") { + kommonitorDataExchangeService.showDiagramExportButtons = false; + } + // special case for georesource export buttons + if (element.id === "georesourceExportButtons") { + kommonitorDataExchangeService.showGeoresourceExportButtons = false; + } + return false; + } + return true; + } + else { + // special case for diagram export buttons + if (element.id === "diagramExportButtons") { + kommonitorDataExchangeService.showDiagramExportButtons = false; + } + // special case for georesource export buttons + if (element.id === "georesourceExportButtons") { + kommonitorDataExchangeService.showGeoresourceExportButtons = false; + } + return false; + } } - - return false; - } - } - }; - - this.initElementVisibility(); - + }; + this.initElementVisibility(); }]); +//# sourceMappingURL=kommonitor-element-visibility-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.module.js.map b/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.module.js.map new file mode 100644 index 000000000..503e17636 --- /dev/null +++ b/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-element-visibility-helper-service.module.js","sourceRoot":"","sources":["kommonitor-element-visibility-helper-service.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,mCAAmC,EAAE,CAAC,wBAAwB,EAAE,0BAA0B,CAAC,CAAC,CAAC;AAE5G;;;;;;;;GAQG;AACH,OAAO;KACJ,MAAM,CAAC,mCAAmC,EAAE,EAAE,CAAC;KAC/C,OAAO,CACN,0CAA0C,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,4BAA4B,EAAE,OAAO;IACrH,uBAAuB,EAAE,MAAM,EAAE,+BAA+B,EAAE,iCAAiC;IACnG,UAAU,UAAU,EAAE,QAAQ,EAC5B,KAAK,EAAE,0BAA0B,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,6BAA6B,EAAE,+BAA+B;QAErI,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAE5B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC3C,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;QAE3D,IAAI,CAAC,oBAAoB,GAAG,sBAAsB,CAAC;QAEnD,IAAI,CAAC,qBAAqB,GAAG;YAC3B,6BAA6B,CAAC,wBAAwB,GAAG,IAAI,CAAC;YAC9D,6BAA6B,CAAC,4BAA4B,GAAG,IAAI,CAAC;YAElE,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,MAAM,GAAG,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBACvB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC;gBACP,UAAU,CAAC,MAAM,EAAE,CAAC;YAEtB,CAAC,CAAC,CAAC;QAGL,CAAC,CAAC;QAEF,IAAI,CAAC,sBAAsB,GAAG;YAE5B,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAE7B,qHAAqH;YACrH,UAAU,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF,IAAI,sBAAsB,GAAG,UAAS,EAAE;YAEtC,IAAI,OAAO,GAAG,qBAAqB,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhG,IAAG,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC5D,OAAO,IAAI,CAAC;aACb;iBACI,IAAG,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAC;gBAChG,OAAO,IAAI,CAAC;aACb;iBACI,IAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;gBACnC,mDAAmD;gBACnD,IAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAC;oBAC7B,OAAO,IAAI,CAAC;iBACb;gBACD,IAAI,cAAc,GAAG,KAAK,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC7C,IAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAC;wBACzE,OAAO,IAAI,CAAC;qBACb;iBACF;gBAED,0CAA0C;gBAC1C,IAAG,CAAE,cAAc,IAAI,OAAO,CAAC,EAAE,KAAK,sBAAsB,EAAC;oBAC3D,6BAA6B,CAAC,wBAAwB,GAAG,KAAK,CAAC;iBAChE;gBACD,8CAA8C;gBAC9C,IAAG,CAAE,cAAc,IAAI,OAAO,CAAC,EAAE,KAAK,0BAA0B,EAAC;oBAC/D,6BAA6B,CAAC,4BAA4B,GAAG,KAAK,CAAC;iBACpE;gBAED,OAAO,cAAc,CAAC;aACvB;iBAAM;gBACL,IAAG,CAAE,6BAA6B,CAAC,sBAAsB,EAAC;oBACxD,IAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAC;wBAEpE,0CAA0C;wBAC1C,IAAG,OAAO,CAAC,EAAE,KAAK,sBAAsB,EAAC;4BACvC,6BAA6B,CAAC,wBAAwB,GAAG,KAAK,CAAC;yBAChE;wBACD,8CAA8C;wBAC9C,IAAG,OAAO,CAAC,EAAE,KAAK,0BAA0B,EAAC;4BAC3C,6BAA6B,CAAC,4BAA4B,GAAG,KAAK,CAAC;yBACpE;wBAED,OAAO,KAAK,CAAC;qBACd;oBACD,OAAO,IAAI,CAAC;iBACb;qBACG;oBACF,0CAA0C;oBAC1C,IAAG,OAAO,CAAC,EAAE,KAAK,sBAAsB,EAAC;wBACvC,6BAA6B,CAAC,wBAAwB,GAAG,KAAK,CAAC;qBAChE;oBACD,8CAA8C;oBAC9C,IAAG,OAAO,CAAC,EAAE,KAAK,0BAA0B,EAAC;wBAC3C,6BAA6B,CAAC,4BAA4B,GAAG,KAAK,CAAC;qBACpE;oBAED,OAAO,KAAK,CAAC;iBACd;aACF;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAE/B,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.service.ts b/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.service.ts new file mode 100644 index 000000000..93ccef89e --- /dev/null +++ b/app/util/genericServices/kommonitorElementVisibilityHelperService/kommonitor-element-visibility-helper-service.service.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@angular/core'; +import { ControlsConfigService } from './ControlsConfigService'; // Import necessary services and dependencies + +@Injectable({ + providedIn: 'root' +}) +export class KommonitorElementVisibilityHelperService { + elementVisibility: any = {}; + isAdvancedMode = __env.isAdvancedMode; + showAdvancedModeSwitch = __env.showAdvancedModeSwitch; + advancedModeRoleName = 'fakeAdvancedModeRole'; + diagramExportButtonsVisible = true; + georesourceExportButtonsVisible = true; + + constructor( + private controlsConfigService: ControlsConfigService // Inject the required services + ) { + this.initElementVisibility(); + } + + private checkElementVisibility(id: string): boolean { + const element = this.controlsConfigService.getControlsConfig().find((element) => element.id === id); + + if (!element.roles || element.roles.length === 0) { + return true; + } else if (this.isAdvancedMode && element.roles && element.roles.includes(this.advancedModeRoleName)) { + return true; + } else { + // Implement the logic to check user roles and permissions + // Replace this with your actual authentication logic + // Example: return this.authService.hasPermission(element.roles); + return true; // Temporary value for demonstration purposes + } + } + + initElementVisibility(): void { + this.diagramExportButtonsVisible = true; + this.georesourceExportButtonsVisible = true; + + const config = this.controlsConfigService.getControlsConfig(); + + config.forEach((element) => { + this.elementVisibility[element.id] = this.checkElementVisibility(element.id); + }); + } + + onChangeIsAdvancedMode(): void { + this.initElementVisibility(); + // If any sidebar was previously not displayed, we must ensure that it is properly instantiated for the current indicator + // Replace this with your actual logic + // ... + } +} diff --git a/app/util/genericServices/kommonitorFilterHelperService/kommonitor-filter-helper-service.module.js b/app/util/genericServices/kommonitorFilterHelperService/kommonitor-filter-helper-service.module.js index 31c3719e1..d70722ad0 100644 --- a/app/util/genericServices/kommonitorFilterHelperService/kommonitor-filter-helper-service.module.js +++ b/app/util/genericServices/kommonitorFilterHelperService/kommonitor-filter-helper-service.module.js @@ -1,181 +1,141 @@ +"use strict"; angular.module('kommonitorFilterHelper', []); - angular - .module('kommonitorFilterHelper', ['kommonitorMap', 'kommonitorDataExchange']) - .service( - 'kommonitorFilterHelperService', ['$rootScope', '$timeout', '__env', 'kommonitorMapService', "kommonitorDataExchangeService", - function ($rootScope, $timeout, - __env, kommonitorMapService, kommonitorDataExchangeService) { - - var self = this; - - this.filteredIndicatorFeatureIds = new Map(); - this.selectedIndicatorFeatureIds = new Map(); - - this.completelyRemoveFilteredFeaturesFromDisplay = true; - - this.onChangeFilterBehaviourToggle = function(){ - this.performSpatialFilter(); - }; - - // FEATURE SELECTION - - this.featureIsCurrentlySelected = function(featureId){ - return this.selectedIndicatorFeatureIds.has("" + featureId); - }; - - this.clearSelectedFeatures = function(){ - this.selectedIndicatorFeatureIds = new Map(); - }; - - this.addFeatureToSelection = function(feature){ - if(feature.properties){ - this.selectedIndicatorFeatureIds.set("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME], feature); - } - else{ - this.selectedIndicatorFeatureIds.set("" + feature[__env.FEATURE_ID_PROPERTY_NAME], feature); - } - $rootScope.$broadcast("onAddedFeatureToSelection", this.selectedIndicatorFeatureIds); - }; - - this.removeFeatureFromSelection = function(featureId){ - this.selectedIndicatorFeatureIds.delete("" + featureId); - $rootScope.$broadcast("onRemovedFeatureFromSelection", this.selectedIndicatorFeatureIds); - }; - - - // FEATURE FILTER - - this.featureIsCurrentlyFiltered = function(featureId){ - return this.filteredIndicatorFeatureIds.has("" + featureId); - }; - - this.clearFilteredFeatures = function(){ + .module('kommonitorFilterHelper', ['kommonitorMap', 'kommonitorDataExchange']) + .service('kommonitorFilterHelperService', ['$rootScope', '$timeout', '__env', 'kommonitorMapService', "kommonitorDataExchangeService", + function ($rootScope, $timeout, __env, kommonitorMapService, kommonitorDataExchangeService) { + var self = this; this.filteredIndicatorFeatureIds = new Map(); - }; - - this.applyRangeFilter = function(features, targetDateProperty, minFilterValue, maxFilterValue){ - if(!this.filteredIndicatorFeatureIds){ - this.filteredIndicatorFeatureIds = new Map(); - } - for (const feature of features) { - var value = +Number(feature.properties[targetDateProperty]).toFixed(__env.numberOfDecimals); - - if(value >= minFilterValue && value <= maxFilterValue){ - // feature must not be filtered - make sure it is not marked as filtered - if (this.filteredIndicatorFeatureIds.has("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME])){ - this.filteredIndicatorFeatureIds.delete("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME]); + this.selectedIndicatorFeatureIds = new Map(); + this.completelyRemoveFilteredFeaturesFromDisplay = true; + this.onChangeFilterBehaviourToggle = function () { + this.performSpatialFilter(); + }; + // FEATURE SELECTION + this.featureIsCurrentlySelected = function (featureId) { + return this.selectedIndicatorFeatureIds.has("" + featureId); + }; + this.clearSelectedFeatures = function () { + this.selectedIndicatorFeatureIds = new Map(); + }; + this.addFeatureToSelection = function (feature) { + if (feature.properties) { + this.selectedIndicatorFeatureIds.set("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME], feature); } - } - else{ - // feature must be filtered - if (!this.filteredIndicatorFeatureIds.has("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME])){ - this.filteredIndicatorFeatureIds.set("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME], feature); + else { + this.selectedIndicatorFeatureIds.set("" + feature[__env.FEATURE_ID_PROPERTY_NAME], feature); } - } - } - - // range filter should only display filtered items as filtered, not remove them totally, as this qould require either - // more complicated management of all features or direct update of range min/max values - kommonitorMapService.restyleCurrentLayer(); - - }; - - this.performSpatialFilter = function(){ - if(! this.completelyRemoveFilteredFeaturesFromDisplay){ - // kommonitorMapService.restyleCurrentLayer(); - if(kommonitorDataExchangeService.isBalanceChecked){ - kommonitorMapService.replaceIndicatorGeoJSON(kommonitorDataExchangeService.indicatorAndMetadataAsBalance, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedDate, false); - } - else{ - kommonitorMapService.replaceIndicatorGeoJSON(kommonitorDataExchangeService.selectedIndicator, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedDate, false); - } - } - else{ - this.filterAndReplaceDataset(); - } - - this.checkFeatureSelection(); - }; - - this.checkFeatureSelection = function(){ - // remove any selected items that are not visible in current filtered dataset - // only if features are fully removed from dataset - if(this.completelyRemoveFilteredFeaturesFromDisplay){ - let oldSelectionMap = this.selectedIndicatorFeatureIds; - - for (let key of this.selectedIndicatorFeatureIds.keys()) { - if (this.filteredIndicatorFeatureIds.has("" + key)){ - this.selectedIndicatorFeatureIds.delete("" + key); + $rootScope.$broadcast("onAddedFeatureToSelection", this.selectedIndicatorFeatureIds); + }; + this.removeFeatureFromSelection = function (featureId) { + this.selectedIndicatorFeatureIds.delete("" + featureId); + $rootScope.$broadcast("onRemovedFeatureFromSelection", this.selectedIndicatorFeatureIds); + }; + // FEATURE FILTER + this.featureIsCurrentlyFiltered = function (featureId) { + return this.filteredIndicatorFeatureIds.has("" + featureId); + }; + this.clearFilteredFeatures = function () { + this.filteredIndicatorFeatureIds = new Map(); + }; + this.applyRangeFilter = function (features, targetDateProperty, minFilterValue, maxFilterValue) { + if (!this.filteredIndicatorFeatureIds) { + this.filteredIndicatorFeatureIds = new Map(); } - } - } - - $rootScope.$broadcast("onRemovedFeatureFromSelection", this.selectedIndicatorFeatureIds); - }; - - this.filterAndReplaceDataset = function(){ - let indicatorMetadataAndGeoJSON; - if(kommonitorDataExchangeService.isBalanceChecked){ - let filteredIndicatorFeatures = kommonitorDataExchangeService.indicatorAndMetadataAsBalance.geoJSON.features.filter(feature => !self.filteredIndicatorFeatureIds.has("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME])); - - indicatorMetadataAndGeoJSON = JSON.parse(JSON.stringify(kommonitorDataExchangeService.indicatorAndMetadataAsBalance)); - indicatorMetadataAndGeoJSON.geoJSON.features = filteredIndicatorFeatures; - kommonitorMapService.replaceIndicatorGeoJSON(indicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedDate, false); - - } - else{ - let filteredIndicatorFeatures = kommonitorDataExchangeService.selectedIndicator.geoJSON.features.filter(feature => !self.filteredIndicatorFeatureIds.has("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME])); - - indicatorMetadataAndGeoJSON = JSON.parse(JSON.stringify(kommonitorDataExchangeService.selectedIndicator)); - indicatorMetadataAndGeoJSON.geoJSON.features = filteredIndicatorFeatures; - kommonitorMapService.replaceIndicatorGeoJSON(indicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedDate, false); - - } - - $rootScope.$broadcast("updateIndicatorValueRangeFilter", kommonitorDataExchangeService.selectedDate, indicatorMetadataAndGeoJSON); - $rootScope.$broadcast("updateMeasureOfValueBar", kommonitorDataExchangeService.selectedDate, indicatorMetadataAndGeoJSON); - }; - - this.applySpatialFilter_higherSpatialUnitFeatures = function(higherSpatialUnitFilterFeatureGeoJSON, targetFeatureNames){ - - // if(!this.filteredIndicatorFeatureIds){ - - // } - this.filteredIndicatorFeatureIds = new Map(); - - // manage map of filtered features - let targetHigherSpatialUnitFilterFeatures = higherSpatialUnitFilterFeatureGeoJSON.features.filter(feature => targetFeatureNames.includes(feature.properties[__env.FEATURE_NAME_PROPERTY_NAME])); - - for (const feature of kommonitorDataExchangeService.selectedIndicator.geoJSON.features) { - this.filteredIndicatorFeatureIds.set("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME], feature); - for (const higherSpatialUnitFeature of targetHigherSpatialUnitFilterFeatures) { - if(turf.booleanPointInPolygon(turf.pointOnFeature(feature), higherSpatialUnitFeature)){ - this.filteredIndicatorFeatureIds.delete("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME]); - break; + for (const feature of features) { + var value = +Number(feature.properties[targetDateProperty]).toFixed(__env.numberOfDecimals); + if (value >= minFilterValue && value <= maxFilterValue) { + // feature must not be filtered - make sure it is not marked as filtered + if (this.filteredIndicatorFeatureIds.has("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + this.filteredIndicatorFeatureIds.delete("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME]); + } + } + else { + // feature must be filtered + if (!this.filteredIndicatorFeatureIds.has("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME])) { + this.filteredIndicatorFeatureIds.set("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME], feature); + } + } } - } - } - - // apply filter - this.performSpatialFilter(); - }; - - this.applySpatialFilter_currentSpatialUnitFeatures = function(targetFeatureNames){ - // if(!this.filteredIndicatorFeatureIds){ - - // } - this.filteredIndicatorFeatureIds = new Map(); - - // manage map of filtered features - for (const feature of kommonitorDataExchangeService.selectedIndicator.geoJSON.features) { - if(!targetFeatureNames.includes(feature.properties[__env.FEATURE_NAME_PROPERTY_NAME])){ - this.filteredIndicatorFeatureIds.set("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME], feature); - } - } - - // apply filter - this.performSpatialFilter(); - }; - + // range filter should only display filtered items as filtered, not remove them totally, as this qould require either + // more complicated management of all features or direct update of range min/max values + kommonitorMapService.restyleCurrentLayer(); + }; + this.performSpatialFilter = function () { + if (!this.completelyRemoveFilteredFeaturesFromDisplay) { + // kommonitorMapService.restyleCurrentLayer(); + if (kommonitorDataExchangeService.isBalanceChecked) { + kommonitorMapService.replaceIndicatorGeoJSON(kommonitorDataExchangeService.indicatorAndMetadataAsBalance, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedDate, false); + } + else { + kommonitorMapService.replaceIndicatorGeoJSON(kommonitorDataExchangeService.selectedIndicator, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedDate, false); + } + } + else { + this.filterAndReplaceDataset(); + } + this.checkFeatureSelection(); + }; + this.checkFeatureSelection = function () { + // remove any selected items that are not visible in current filtered dataset + // only if features are fully removed from dataset + if (this.completelyRemoveFilteredFeaturesFromDisplay) { + let oldSelectionMap = this.selectedIndicatorFeatureIds; + for (let key of this.selectedIndicatorFeatureIds.keys()) { + if (this.filteredIndicatorFeatureIds.has("" + key)) { + this.selectedIndicatorFeatureIds.delete("" + key); + } + } + } + $rootScope.$broadcast("onRemovedFeatureFromSelection", this.selectedIndicatorFeatureIds); + }; + this.filterAndReplaceDataset = function () { + let indicatorMetadataAndGeoJSON; + if (kommonitorDataExchangeService.isBalanceChecked) { + let filteredIndicatorFeatures = kommonitorDataExchangeService.indicatorAndMetadataAsBalance.geoJSON.features.filter(feature => !self.filteredIndicatorFeatureIds.has("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME])); + indicatorMetadataAndGeoJSON = JSON.parse(JSON.stringify(kommonitorDataExchangeService.indicatorAndMetadataAsBalance)); + indicatorMetadataAndGeoJSON.geoJSON.features = filteredIndicatorFeatures; + kommonitorMapService.replaceIndicatorGeoJSON(indicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedDate, false); + } + else { + let filteredIndicatorFeatures = kommonitorDataExchangeService.selectedIndicator.geoJSON.features.filter(feature => !self.filteredIndicatorFeatureIds.has("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME])); + indicatorMetadataAndGeoJSON = JSON.parse(JSON.stringify(kommonitorDataExchangeService.selectedIndicator)); + indicatorMetadataAndGeoJSON.geoJSON.features = filteredIndicatorFeatures; + kommonitorMapService.replaceIndicatorGeoJSON(indicatorMetadataAndGeoJSON, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel, kommonitorDataExchangeService.selectedDate, false); + } + $rootScope.$broadcast("updateIndicatorValueRangeFilter", kommonitorDataExchangeService.selectedDate, indicatorMetadataAndGeoJSON); + $rootScope.$broadcast("updateMeasureOfValueBar", kommonitorDataExchangeService.selectedDate, indicatorMetadataAndGeoJSON); + }; + this.applySpatialFilter_higherSpatialUnitFeatures = function (higherSpatialUnitFilterFeatureGeoJSON, targetFeatureNames) { + // if(!this.filteredIndicatorFeatureIds){ + // } + this.filteredIndicatorFeatureIds = new Map(); + // manage map of filtered features + let targetHigherSpatialUnitFilterFeatures = higherSpatialUnitFilterFeatureGeoJSON.features.filter(feature => targetFeatureNames.includes(feature.properties[__env.FEATURE_NAME_PROPERTY_NAME])); + for (const feature of kommonitorDataExchangeService.selectedIndicator.geoJSON.features) { + this.filteredIndicatorFeatureIds.set("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME], feature); + for (const higherSpatialUnitFeature of targetHigherSpatialUnitFilterFeatures) { + if (turf.booleanPointInPolygon(turf.pointOnFeature(feature), higherSpatialUnitFeature)) { + this.filteredIndicatorFeatureIds.delete("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME]); + break; + } + } + } + // apply filter + this.performSpatialFilter(); + }; + this.applySpatialFilter_currentSpatialUnitFeatures = function (targetFeatureNames) { + // if(!this.filteredIndicatorFeatureIds){ + // } + this.filteredIndicatorFeatureIds = new Map(); + // manage map of filtered features + for (const feature of kommonitorDataExchangeService.selectedIndicator.geoJSON.features) { + if (!targetFeatureNames.includes(feature.properties[__env.FEATURE_NAME_PROPERTY_NAME])) { + this.filteredIndicatorFeatureIds.set("" + feature.properties[__env.FEATURE_ID_PROPERTY_NAME], feature); + } + } + // apply filter + this.performSpatialFilter(); + }; }]); +//# sourceMappingURL=kommonitor-filter-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorFilterHelperService/kommonitor-filter-helper-service.module.js.map b/app/util/genericServices/kommonitorFilterHelperService/kommonitor-filter-helper-service.module.js.map new file mode 100644 index 000000000..2fbf9f90c --- /dev/null +++ b/app/util/genericServices/kommonitorFilterHelperService/kommonitor-filter-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-filter-helper-service.module.js","sourceRoot":"","sources":["kommonitor-filter-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorImporterHelperService/kommonitor-importer-helper-service.module.js b/app/util/genericServices/kommonitorImporterHelperService/kommonitor-importer-helper-service.module.js index 66f177d46..74c578b49 100644 --- a/app/util/genericServices/kommonitorImporterHelperService/kommonitor-importer-helper-service.module.js +++ b/app/util/genericServices/kommonitorImporterHelperService/kommonitor-importer-helper-service.module.js @@ -1,5 +1,5 @@ +"use strict"; angular.module('kommonitorImporterHelper', ['kommonitorDataExchange']); - /** * a common serviceInstance that holds all needed properties for a WPS service. * @@ -10,721 +10,603 @@ angular.module('kommonitorImporterHelper', ['kommonitorDataExchange']); * parameters for each WPS operation represented by different Angular components */ angular - .module('kommonitorImporterHelper', []) - .service( - 'kommonitorImporterHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', - function ($rootScope, $timeout, - kommonitorDataExchangeService, $http, __env) { - - this.targetUrlToImporterService = __env.targetUrlToImporterService; - - this.availableConverters = undefined; - - this.availableDatasourceTypes = undefined; - - this.attributeMapping_attributeTypes = [ - { - displayName: "Text/String", - apiName: "string" - }, - { - displayName: "Ganzzahl", - apiName: "integer" - }, - { - displayName: "Gleitkommazahl", - apiName: "float" - }, - { - displayName: "Datum", - apiName: "date" - }, - ]; - - this.mappingConfigStructure = { - "converter": { - "encoding": "string", - "mimeType": "string", - "name": "string", - "parameters": [ + .module('kommonitorImporterHelper', []) + .service('kommonitorImporterHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', + function ($rootScope, $timeout, kommonitorDataExchangeService, $http, __env) { + this.targetUrlToImporterService = __env.targetUrlToImporterService; + this.availableConverters = undefined; + this.availableDatasourceTypes = undefined; + this.attributeMapping_attributeTypes = [ { - "name": "string", - "value": "string" - } - ], - "schema": "string" - }, - "dataSource": { - "parameters": [ + displayName: "Text/String", + apiName: "string" + }, { - "name": "string", - "value": "string" - } - ], - "type": "FILE" // FILE|HTTP|INLINE - }, - "propertyMapping": { - "arisenFromProperty": "string", - "attributes": [ + displayName: "Ganzzahl", + apiName: "integer" + }, { - "mappingName": "string", // target name - "name": "string", // source name - "type": "string" // dataType, [string|integer|float|date] + displayName: "Gleitkommazahl", + apiName: "float" + }, + { + displayName: "Datum", + apiName: "date" + }, + ]; + this.mappingConfigStructure = { + "converter": { + "encoding": "string", + "mimeType": "string", + "name": "string", + "parameters": [ + { + "name": "string", + "value": "string" + } + ], + "schema": "string" + }, + "dataSource": { + "parameters": [ + { + "name": "string", + "value": "string" + } + ], + "type": "FILE" // FILE|HTTP|INLINE + }, + "propertyMapping": { + "arisenFromProperty": "string", + "attributes": [ + { + "mappingName": "string", + "name": "string", + "type": "string" // dataType, [string|integer|float|date] + } + ], + "identifierProperty": "string", + "keepAttributes": true, + "nameProperty": "string", + "validEndDateProperty": "string", + "validStartDateProperty": "string" + }, + "periodOfValidity": { + "startDate": "yyyy-mm-tt", + "endDate": "yyyy-mm-tt" } - ], - "identifierProperty": "string", - "keepAttributes": true, // if true, then mapping under attributes is ignored and all attributes are imported with the same attribute name - "nameProperty": "string", - "validEndDateProperty": "string", - "validStartDateProperty": "string" - }, - "periodOfValidity":{ - "startDate": "yyyy-mm-tt", - "endDate": "yyyy-mm-tt" - } }; - this.mappingConfigStructure_indicator = { - "converter": { - "encoding": "string", - "mimeType": "string", - "name": "string", + "converter": { + "encoding": "string", + "mimeType": "string", + "name": "string", + "parameters": [ + { + "name": "string", + "value": "string" + } + ], + "schema": "string" + }, + "dataSource": { + "parameters": [ + { + "name": "string", + "value": "string" + } + ], + "type": "FILE" // FILE|HTTP|INLINE + }, + "propertyMapping": { + "attributeMappings": [ + { + "mappingName": "string", + "name": "string", + "type": "string" + } + ], + "spatialReferenceKeyProperty": "string", + "timeseriesMappings": [ + { + "indicatorValueProperty": "string", + "timestamp": "string", + "timestampProperty": "string" + } + ] + }, + "targetSpatialUnitName": "string" + }; + this.converterDefinition_singleFeatureImport = { + "encoding": "UTF-8", + "mimeType": "application/geo+json", + "name": "GeoJSON", "parameters": [ - { - "name": "string", - "value": "string" - } - ], - "schema": "string" - }, - "dataSource": { + { + "name": "CRS", + "value": "EPSG:4326" + } + ] + }; + this.datasourceDefinition_singleFeatureImport = { "parameters": [ - { - "name": "string", - "value": "string" - } - ], - "type": "FILE" // FILE|HTTP|INLINE - }, - "propertyMapping": { - "attributeMappings": [ - { - "mappingName": "string", - "name": "string", - "type": "string" - } + { + "name": "payload", + "value": "geojsonValue" + } ], - "spatialReferenceKeyProperty": "string", - "timeseriesMappings": [ - { - "indicatorValueProperty": "string", - "timestamp": "string", - "timestampProperty": "string" - } - ] - }, - "targetSpatialUnitName": "string" - }; - - this.converterDefinition_singleFeatureImport = { - "encoding": "UTF-8", - "mimeType": "application/geo+json", - "name": "GeoJSON", - "parameters": [ - { - "name": "CRS", - "value": "EPSG:4326" - } - ] - }; - - this.datasourceDefinition_singleFeatureImport = { - "parameters": [ - { - "name": "payload", - "value": "geojsonValue" - } - ], - "type": "INLINE" - }; - - this.propertyMappingDefinition_singleFeatureImport = { - "identifierProperty": "ID", - "nameProperty": "NAME", - "keepAttributes": true, - "keepMissingOrNullValueAttributes": true, - "attributes": [] - }; - - this.fetchResourcesFromImporter = async function(){ - console.log("Trying to fetch converters and datasourceTypes from importer service"); - this.availableConverters = await this.fetchConverters(); - this.availableDatasourceTypes = await this.fetchDatasourceTypes(); - - if(! this.availableConverters || ! this.availableDatasourceTypes){ - - kommonitorDataExchangeService.displayMapApplicationError("Notwendige Anbindung an Importer-Service ist fehlerhaft. Bitte wenden Sie sich an Ihren Administrator."); - - return; - } - - for (let index = 0; index < this.availableConverters.length; index++) { - var converter = this.availableConverters[index]; - - converter = await this.fetchConverterDetails(converter); - this.availableConverters[index] = converter; - } - - for (let k = 0; k < this.availableDatasourceTypes.length; k++) { - this.availableDatasourceTypes[k] = await this.fetchDatasourceTypeDetails(this.availableDatasourceTypes[k]); - } - - setTimeout(() => { - $rootScope.$apply(); - }, 1500); - - }; - - this.filterConverters = function(resourceType) { - // remove csvLatLon for indicators - // and csv_onlyIndicator for georesources - return function (converter) { - if(resourceType === "georesource" && converter.name.includes("Indikator")) - return false; - if(resourceType === "spatialUnit" && (converter.name.includes("Indikator") || converter.name.includes("Tabelle"))) - return false; - if(resourceType === "indicator" && (converter.name.includes("Geokodierung") || converter.name.includes("Koordinate")) ) - return false; - - return true; + "type": "INLINE" }; - }; - - this.fetchConverters = async function(){ - return await $http({ - url: this.targetUrlToImporterService + "converters", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while fetching converters from importer."); - kommonitorDataExchangeService.displayMapApplicationError(error); - - }); - }; - - this.fetchConverterDetails = async function(converter){ - return await $http({ - url: this.targetUrlToImporterService + "converters/" + converter.name, - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while fetching converter for name '" + converter.name + "' from importer."); - - }); - }; - - this.fetchDatasourceTypes = async function(){ - return await $http({ - url: this.targetUrlToImporterService + "datasourceTypes", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while fetching datasourceTypes from importer."); - kommonitorDataExchangeService.displayMapApplicationError(error); - }); - }; - - this.fetchDatasourceTypeDetails = async function(datasourceType){ - return await $http({ - url: this.targetUrlToImporterService + "datasourceTypes/" + datasourceType.type, - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while fetching datasourceType for type '" + datasource.type + "' from importer."); - }); - }; - - // load data - this.fetchResourcesFromImporter(); - - - this.uploadNewFile = async function(fileData, fileName){ - console.log("Trying to POST to importer service to upload a new file."); - - var formdata = new FormData(); - formdata.append("filename", fileName); - formdata.append("file", fileData); - - return await $http({ - url: this.targetUrlToImporterService + "upload", - method: "POST", - data: formdata, - // must set header content-type to undefined in order to send as multipart-formdata - headers: {"Content-Type": undefined, "Accept": "text/plain" }, - responseType: 'text' - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - this.buildConverterDefinition = function(selectedConverter, converterParameterPrefix, schema, mimeType){ - var converterDefinition = { - "encoding": selectedConverter.encodings[0], - "mimeType": selectedConverter.mimeTypes.filter(element => element == mimeType)[0], - "name": selectedConverter.name, - "parameters": [ - - ], - "schema": undefined - }; - - if(selectedConverter.schemas){ - if (schema === undefined || schema === null){ - return null; - } - else{ - converterDefinition.schema = schema; - } - } - - if(selectedConverter.parameters.length > 0){ - for (const parameter of selectedConverter.parameters) { - var parameterName = parameter.name; - var parameterValue = $("#" + converterParameterPrefix + parameterName).val(); - - if(parameter.mandatory){ - + this.propertyMappingDefinition_singleFeatureImport = { + "identifierProperty": "ID", + "nameProperty": "NAME", + "keepAttributes": true, + "keepMissingOrNullValueAttributes": true, + "attributes": [] + }; + this.fetchResourcesFromImporter = async function () { + console.log("Trying to fetch converters and datasourceTypes from importer service"); + this.availableConverters = await this.fetchConverters(); + this.availableDatasourceTypes = await this.fetchDatasourceTypes(); + if (!this.availableConverters || !this.availableDatasourceTypes) { + kommonitorDataExchangeService.displayMapApplicationError("Notwendige Anbindung an Importer-Service ist fehlerhaft. Bitte wenden Sie sich an Ihren Administrator."); + return; } - - if (parameter.mandatory && (parameterValue === undefined || parameterValue === null || parameterValue === "")){ - return null; + for (let index = 0; index < this.availableConverters.length; index++) { + var converter = this.availableConverters[index]; + converter = await this.fetchConverterDetails(converter); + this.availableConverters[index] = converter; } - else{ - if(parameterValue && !(parameterValue === "")){ - converterDefinition.parameters.push({ - "name": parameterName, - "value": parameterValue - }); - } - + for (let k = 0; k < this.availableDatasourceTypes.length; k++) { + this.availableDatasourceTypes[k] = await this.fetchDatasourceTypeDetails(this.availableDatasourceTypes[k]); } - } - } - - return converterDefinition; - }; - - this.buildDatasourceTypeDefinition = async function(selectedDatasourceType, datasourceTypeParameterPrefix, datasourceFileInputId){ - var datasourceTypeDefinition = { - "parameters": [ - - ], - "type": selectedDatasourceType.type - }; - - if(selectedDatasourceType.type === "FILE"){ - // get file if present - - // upload it to importer - - // use file reference name for datasourceType definition - - - var file = document.getElementById(datasourceFileInputId).files[0]; - - if(file === null || file === undefined){ - return null; - } - - var fileUploadName; - try { - fileUploadName = await this.uploadNewFile(file, file.name); - } catch (error) { - console.error("Error while uploading file to importer."); - console.error(error); - kommonitorDataExchangeService.displayMapApplicationError(error); - throw error; - } - - datasourceTypeDefinition.parameters.push({ - "name": "NAME", - "value": fileUploadName - }); - } - else{ - if(selectedDatasourceType.parameters.length > 0){ - for (const parameter of selectedDatasourceType.parameters) { - var parameterName = parameter.name; - var parameterValue = $("#" + datasourceTypeParameterPrefix + parameterName).val(); - - if (parameterValue === undefined || parameterValue === null){ - return null; - } - else{ + setTimeout(() => { + $rootScope.$apply(); + }, 1500); + }; + this.filterConverters = function (resourceType) { + // remove csvLatLon for indicators + // and csv_onlyIndicator for georesources + return function (converter) { + if (resourceType === "georesource" && converter.name.includes("Indikator")) + return false; + if (resourceType === "spatialUnit" && (converter.name.includes("Indikator") || converter.name.includes("Tabelle"))) + return false; + if (resourceType === "indicator" && (converter.name.includes("Geokodierung") || converter.name.includes("Koordinate"))) + return false; + return true; + }; + }; + this.fetchConverters = async function () { + return await $http({ + url: this.targetUrlToImporterService + "converters", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while fetching converters from importer."); + kommonitorDataExchangeService.displayMapApplicationError(error); + }); + }; + this.fetchConverterDetails = async function (converter) { + return await $http({ + url: this.targetUrlToImporterService + "converters/" + converter.name, + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while fetching converter for name '" + converter.name + "' from importer."); + }); + }; + this.fetchDatasourceTypes = async function () { + return await $http({ + url: this.targetUrlToImporterService + "datasourceTypes", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while fetching datasourceTypes from importer."); + kommonitorDataExchangeService.displayMapApplicationError(error); + }); + }; + this.fetchDatasourceTypeDetails = async function (datasourceType) { + return await $http({ + url: this.targetUrlToImporterService + "datasourceTypes/" + datasourceType.type, + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while fetching datasourceType for type '" + datasource.type + "' from importer."); + }); + }; + // load data + this.fetchResourcesFromImporter(); + this.uploadNewFile = async function (fileData, fileName) { + console.log("Trying to POST to importer service to upload a new file."); + var formdata = new FormData(); + formdata.append("filename", fileName); + formdata.append("file", fileData); + return await $http({ + url: this.targetUrlToImporterService + "upload", + method: "POST", + data: formdata, + // must set header content-type to undefined in order to send as multipart-formdata + headers: { "Content-Type": undefined, "Accept": "text/plain" }, + responseType: 'text' + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; + }); + }; + this.buildConverterDefinition = function (selectedConverter, converterParameterPrefix, schema, mimeType) { + var converterDefinition = { + "encoding": selectedConverter.encodings[0], + "mimeType": selectedConverter.mimeTypes.filter(element => element == mimeType)[0], + "name": selectedConverter.name, + "parameters": [], + "schema": undefined + }; + if (selectedConverter.schemas) { + if (schema === undefined || schema === null) { + return null; + } + else { + converterDefinition.schema = schema; + } + } + if (selectedConverter.parameters.length > 0) { + for (const parameter of selectedConverter.parameters) { + var parameterName = parameter.name; + var parameterValue = $("#" + converterParameterPrefix + parameterName).val(); + if (parameter.mandatory) { + } + if (parameter.mandatory && (parameterValue === undefined || parameterValue === null || parameterValue === "")) { + return null; + } + else { + if (parameterValue && !(parameterValue === "")) { + converterDefinition.parameters.push({ + "name": parameterName, + "value": parameterValue + }); + } + } + } + } + return converterDefinition; + }; + this.buildDatasourceTypeDefinition = async function (selectedDatasourceType, datasourceTypeParameterPrefix, datasourceFileInputId) { + var datasourceTypeDefinition = { + "parameters": [], + "type": selectedDatasourceType.type + }; + if (selectedDatasourceType.type === "FILE") { + // get file if present + // upload it to importer + // use file reference name for datasourceType definition + var file = document.getElementById(datasourceFileInputId).files[0]; + if (file === null || file === undefined) { + return null; + } + var fileUploadName; + try { + fileUploadName = await this.uploadNewFile(file, file.name); + } + catch (error) { + console.error("Error while uploading file to importer."); + console.error(error); + kommonitorDataExchangeService.displayMapApplicationError(error); + throw error; + } datasourceTypeDefinition.parameters.push({ - "name": parameterName, - "value": parameterValue + "name": "NAME", + "value": fileUploadName }); - } } - } - } - - return datasourceTypeDefinition; - }; - - this.buildPutBody_georesources = function(scopeProperties) { - - var putBody = - { - "geoJsonString": "", - "periodOfValidity": { - "endDate": scopeProperties.periodOfValidity.endDate, - "startDate": scopeProperties.periodOfValidity.startDate - }, - "isPartialUpdate": scopeProperties.isPartialUpdate + else { + if (selectedDatasourceType.parameters.length > 0) { + for (const parameter of selectedDatasourceType.parameters) { + var parameterName = parameter.name; + var parameterValue = $("#" + datasourceTypeParameterPrefix + parameterName).val(); + if (parameterValue === undefined || parameterValue === null) { + return null; + } + else { + datasourceTypeDefinition.parameters.push({ + "name": parameterName, + "value": parameterValue + }); + } + } + } + } + return datasourceTypeDefinition; + }; + this.buildPutBody_georesources = function (scopeProperties) { + var putBody = { + "geoJsonString": "", + "periodOfValidity": { + "endDate": scopeProperties.periodOfValidity.endDate, + "startDate": scopeProperties.periodOfValidity.startDate + }, + "isPartialUpdate": scopeProperties.isPartialUpdate + }; + return putBody; + }; + this.buildPutBody_indicators = function (scopeProperties) { + var putBody = { + "indicatorValues": [], + "applicableSpatialUnit": scopeProperties.targetSpatialUnitMetadata.spatialUnitLevel, + "defaultClassificationMapping": scopeProperties.currentIndicatorDataset.defaultClassificationMapping, + "allowedRoles": scopeProperties.allowedRoles + }; + return putBody; + }; + this.buildPropertyMapping_spatialResource = function (nameProperty, idPropety, validStartDateProperty, validEndDateProperty, arisenFromProperty, keepAttributes, keepMissingValues, attributeMappings_adminView) { + if (validStartDateProperty === "") { + validStartDateProperty = undefined; + } + if (validEndDateProperty === "") { + validEndDateProperty = undefined; + } + if (arisenFromProperty === "") { + arisenFromProperty = undefined; + } + var propertyMapping = { + "arisenFromProperty": arisenFromProperty, + "identifierProperty": idPropety, + "nameProperty": nameProperty, + "validEndDateProperty": validEndDateProperty, + "validStartDateProperty": validStartDateProperty, + "keepAttributes": keepAttributes, + "keepMissingOrNullValueAttributes": keepMissingValues, + "attributes": [] + }; + if (!keepAttributes) { + // add attribute mappings + attributeMappings_adminView.forEach(attributeMapping_adminView => { + propertyMapping.attributes.push({ + name: attributeMapping_adminView.sourceName, + mappingName: attributeMapping_adminView.destinationName, + type: attributeMapping_adminView.dataType.apiName + }); + }); + } + return propertyMapping; + }; + this.buildPropertyMapping_indicatorResource = function (spatialReferenceKeyProperty, timeseriesMappings, keepMissingOrNullValueIndicator) { + console.log(spatialReferenceKeyProperty); + console.log(timeseriesMappings); + console.log(keepMissingOrNullValueIndicator); + // attributeMapping is undefined for indicators + return { + "spatialReferenceKeyProperty": spatialReferenceKeyProperty, + "timeseriesMappings": timeseriesMappings, + "keepMissingOrNullValueIndicator": keepMissingOrNullValueIndicator, + "attributeMappings": undefined + }; + }; + this.registerNewSpatialUnit = async function (converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, spatiaUnitPostBody_managementAPI, isDryRun) { + console.log("Trying to POST to importer service to register new spatial unit."); + var postBody = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + "spatialUnitPostBody": spatiaUnitPostBody_managementAPI, + "dryRun": isDryRun + }; + return await $http({ + url: this.targetUrlToImporterService + "spatial-units", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; + }); + }; + this.updateSpatialUnit = async function (converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, spatialUnitId, spatialUnitPutBody_managementAPI, isDryRun) { + console.log("Trying to POST to importer service to update spatial unit with id '" + spatialUnitId + "'."); + var postBody = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + "spatialUnitId": spatialUnitId, + "spatialUnitPutBody": spatialUnitPutBody_managementAPI, + "dryRun": isDryRun + }; + return await $http({ + url: this.targetUrlToImporterService + "spatial-units/update", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; + }); + }; + this.registerNewGeoresource = async function (converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, georesourcePostBody_managementAPI, isDryRun) { + console.log("Trying to POST to importer service to register new georesource."); + var postBody = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + "georesourcePostBody": georesourcePostBody_managementAPI, + "dryRun": isDryRun + }; + return await $http({ + url: this.targetUrlToImporterService + "georesources", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; + }); + }; + this.updateGeoresource = async function (converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, georesourceId, georesourcePutBody_managementAPI, isDryRun) { + console.log("Trying to POST to importer service to update georesource with id '" + georesourceId + "'."); + var postBody = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + "georesourceId": georesourceId, + "georesourcePutBody": georesourcePutBody_managementAPI, + "dryRun": isDryRun + }; + return await $http({ + url: this.targetUrlToImporterService + "georesources/update", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; + }); }; - - return putBody; - } - - this.buildPutBody_indicators = function(scopeProperties){ - - var putBody = - { - "indicatorValues": [], - "applicableSpatialUnit": scopeProperties.targetSpatialUnitMetadata.spatialUnitLevel, - "defaultClassificationMapping": scopeProperties.currentIndicatorDataset.defaultClassificationMapping, - "allowedRoles": scopeProperties.allowedRoles - }; - - return putBody; - }; - - this.buildPropertyMapping_spatialResource = function(nameProperty, idPropety, validStartDateProperty, validEndDateProperty, arisenFromProperty, keepAttributes, keepMissingValues, attributeMappings_adminView){ - if(validStartDateProperty === ""){ - validStartDateProperty = undefined; - } - if(validEndDateProperty === ""){ - validEndDateProperty = undefined; - } - if(arisenFromProperty === ""){ - arisenFromProperty = undefined; - } - - var propertyMapping = { - "arisenFromProperty": arisenFromProperty, - "identifierProperty": idPropety, - "nameProperty": nameProperty, - "validEndDateProperty": validEndDateProperty, - "validStartDateProperty": validStartDateProperty, - "keepAttributes": keepAttributes, - "keepMissingOrNullValueAttributes": keepMissingValues, - "attributes": [] + this.registerNewIndicator = async function (converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, indicatorPostBody_managementAPI, isDryRun) { + console.log("Trying to POST to importer service to register new indicator."); + var postBody = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + "indicatorPostBody": indicatorPostBody_managementAPI, + "dryRun": isDryRun + }; + return await $http({ + url: this.targetUrlToImporterService + "indicators", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; + }); }; - - if (! keepAttributes){ - // add attribute mappings - attributeMappings_adminView.forEach(attributeMapping_adminView => { - propertyMapping.attributes.push({ - name: attributeMapping_adminView.sourceName, - mappingName: attributeMapping_adminView.destinationName, - type: attributeMapping_adminView.dataType.apiName - }); - }); - } - - return propertyMapping; - - }; - - this.buildPropertyMapping_indicatorResource = function(spatialReferenceKeyProperty, timeseriesMappings, keepMissingOrNullValueIndicator){ - console.log(spatialReferenceKeyProperty); - console.log(timeseriesMappings); - console.log(keepMissingOrNullValueIndicator); - // attributeMapping is undefined for indicators - return { - "spatialReferenceKeyProperty": spatialReferenceKeyProperty, - "timeseriesMappings": timeseriesMappings, - "keepMissingOrNullValueIndicator": keepMissingOrNullValueIndicator, - "attributeMappings": undefined + this.updateIndicator = async function (converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, indicatorId, indicatorPutBody_managementAPI, isDryRun) { + console.log("Trying to POST to importer service to update indicator with id '" + indicatorId + "'."); + var postBody = { + "converter": converterDefinition, + "dataSource": datasourceTypeDefinition, + "propertyMapping": propertyMappingDefinition, + "indicatorId": indicatorId, + "indicatorPutBody": indicatorPutBody_managementAPI, + "dryRun": isDryRun + }; + return await $http({ + url: this.targetUrlToImporterService + "indicators/update", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; + }); + }; + this.importerResponseContainsErrors = function (importerResponse) { + if (importerResponse.errors && importerResponse.errors.length > 0) { + return true; + } + return false; + }; + this.getIdFromImporterResponse = function (importerResponse) { + if (importerResponse.uri) { + return importerResponse.uri; + } + return undefined; + }; + this.getErrorsFromImporterResponse = function (importerResponse) { + if (importerResponse.errors) { + return importerResponse.errors; + } + return undefined; + }; + this.getImportedFeaturesFromImporterResponse = function (importerResponse) { + if (importerResponse.importedFeatures) { + return importerResponse.importedFeatures; + } + return undefined; }; - }; - - this.registerNewSpatialUnit = async function(converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, spatiaUnitPostBody_managementAPI, isDryRun){ - console.log("Trying to POST to importer service to register new spatial unit."); - - var postBody = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - "spatialUnitPostBody": spatiaUnitPostBody_managementAPI, - "dryRun": isDryRun - }; - - return await $http({ - url: this.targetUrlToImporterService + "spatial-units", - method: "POST", - data: postBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - this.updateSpatialUnit = async function(converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, spatialUnitId, spatialUnitPutBody_managementAPI, isDryRun){ - console.log("Trying to POST to importer service to update spatial unit with id '" + spatialUnitId + "'."); - - var postBody = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - "spatialUnitId": spatialUnitId, - "spatialUnitPutBody": spatialUnitPutBody_managementAPI, - "dryRun": isDryRun - }; - - return await $http({ - url: this.targetUrlToImporterService + "spatial-units/update", - method: "POST", - data: postBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - - - this.registerNewGeoresource = async function(converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, georesourcePostBody_managementAPI, isDryRun){ - console.log("Trying to POST to importer service to register new georesource."); - - var postBody = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - "georesourcePostBody": georesourcePostBody_managementAPI, - "dryRun": isDryRun - }; - - return await $http({ - url: this.targetUrlToImporterService + "georesources", - method: "POST", - data: postBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - this.updateGeoresource = async function(converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, georesourceId, georesourcePutBody_managementAPI, isDryRun){ - console.log("Trying to POST to importer service to update georesource with id '" + georesourceId + "'."); - - var postBody = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - "georesourceId": georesourceId, - "georesourcePutBody": georesourcePutBody_managementAPI, - "dryRun": isDryRun - }; - - return await $http({ - url: this.targetUrlToImporterService + "georesources/update", - method: "POST", - data: postBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - - - this.registerNewIndicator = async function(converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, indicatorPostBody_managementAPI, isDryRun){ - console.log("Trying to POST to importer service to register new indicator."); - - var postBody = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - "indicatorPostBody": indicatorPostBody_managementAPI, - "dryRun": isDryRun - }; - - return await $http({ - url: this.targetUrlToImporterService + "indicators", - method: "POST", - data: postBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - this.updateIndicator = async function(converterDefinition, datasourceTypeDefinition, propertyMappingDefinition, indicatorId, indicatorPutBody_managementAPI, isDryRun){ - console.log("Trying to POST to importer service to update indicator with id '" + indicatorId + "'."); - - var postBody = { - "converter": converterDefinition, - "dataSource": datasourceTypeDefinition, - "propertyMapping": propertyMappingDefinition, - "indicatorId": indicatorId, - "indicatorPutBody": indicatorPutBody_managementAPI, - "dryRun": isDryRun - }; - - return await $http({ - url: this.targetUrlToImporterService + "indicators/update", - method: "POST", - data: postBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - this.importerResponseContainsErrors = function (importerResponse){ - if (importerResponse.errors && importerResponse.errors.length > 0){ - return true; - } - return false; - }; - - this.getIdFromImporterResponse = function (importerResponse){ - if (importerResponse.uri){ - return importerResponse.uri; - } - return undefined; - }; - - this.getErrorsFromImporterResponse = function (importerResponse){ - if (importerResponse.errors){ - return importerResponse.errors; - } - return undefined; - }; - - this.getImportedFeaturesFromImporterResponse = function (importerResponse){ - if (importerResponse.importedFeatures){ - return importerResponse.importedFeatures; - } - return undefined; - }; - - }]); +//# sourceMappingURL=kommonitor-importer-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorImporterHelperService/kommonitor-importer-helper-service.module.js.map b/app/util/genericServices/kommonitorImporterHelperService/kommonitor-importer-helper-service.module.js.map new file mode 100644 index 000000000..7290c3b83 --- /dev/null +++ b/app/util/genericServices/kommonitorImporterHelperService/kommonitor-importer-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-importer-helper-service.module.js","sourceRoot":"","sources":["kommonitor-importer-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorInfoLegendHelperService/kommonitor-info-legend-helper-service.module.js b/app/util/genericServices/kommonitorInfoLegendHelperService/kommonitor-info-legend-helper-service.module.js index 9f1bb46a3..5fdddac09 100644 --- a/app/util/genericServices/kommonitorInfoLegendHelperService/kommonitor-info-legend-helper-service.module.js +++ b/app/util/genericServices/kommonitorInfoLegendHelperService/kommonitor-info-legend-helper-service.module.js @@ -1,5 +1,5 @@ +"use strict"; angular.module('kommonitorInfoLegendHelper', ['kommonitorDataExchange']); - /** * a common serviceInstance that holds all needed properties for a WPS service. * @@ -10,12 +10,8 @@ angular.module('kommonitorInfoLegendHelper', ['kommonitorDataExchange']); * parameters for each WPS operation represented by different Angular components */ angular - .module('kommonitorInfoLegendHelper', []) - .service( - 'kommonitorInfoLegendHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', - function ($rootScope, $timeout, - kommonitorDataExchangeService, $http, __env) { - - - + .module('kommonitorInfoLegendHelper', []) + .service('kommonitorInfoLegendHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', + function ($rootScope, $timeout, kommonitorDataExchangeService, $http, __env) { }]); +//# sourceMappingURL=kommonitor-info-legend-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorInfoLegendHelperService/kommonitor-info-legend-helper-service.module.js.map b/app/util/genericServices/kommonitorInfoLegendHelperService/kommonitor-info-legend-helper-service.module.js.map new file mode 100644 index 000000000..2c16026ad --- /dev/null +++ b/app/util/genericServices/kommonitorInfoLegendHelperService/kommonitor-info-legend-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-info-legend-helper-service.module.js","sourceRoot":"","sources":["kommonitor-info-legend-helper-service.module.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAEzE;;;;;;;;GAQG;AACH,OAAO;KACJ,MAAM,CAAC,4BAA4B,EAAE,EAAE,CAAC;KACxC,OAAO,CACN,mCAAmC,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,+BAA+B,EAAE,OAAO,EAAE,OAAO;IACjH,UAAU,UAAU,EAAE,QAAQ,EAC5B,6BAA6B,EAAE,KAAK,EAAE,KAAK;IAI7C,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorKeycloakHelperService/kommonitor-keycloak-helper-service.module.js b/app/util/genericServices/kommonitorKeycloakHelperService/kommonitor-keycloak-helper-service.module.js index 9b8049394..5edd4088b 100644 --- a/app/util/genericServices/kommonitorKeycloakHelperService/kommonitor-keycloak-helper-service.module.js +++ b/app/util/genericServices/kommonitorKeycloakHelperService/kommonitor-keycloak-helper-service.module.js @@ -1,283 +1,232 @@ +"use strict"; angular.module('kommonitorKeycloakHelper', ['kommonitorDataExchange']); - angular - .module('kommonitorKeycloakHelper', []) - .service( - 'kommonitorKeycloakHelperService', ['$rootScope', '$timeout', '$http', '$httpParamSerializerJQLike', 'Auth', '__env', + .module('kommonitorKeycloakHelper', []) + .service('kommonitorKeycloakHelperService', ['$rootScope', '$timeout', '$http', '$httpParamSerializerJQLike', 'Auth', '__env', function ($rootScope, $timeout, $http, $httpParamSerializerJQLike, Auth, __env) { - - var self = this; - this.availableKeycloakRoles = []; - this.targetUrlToKeycloakInstance = ""; - this.targetRealmUrlToKeycloakInstance = ""; - this.realm = ""; - this.clientId = ""; - - this.roleSuffixes = ["viewer", "editor", "publisher", "creator"]; - - this.init = async function () { - try { - if (window.__env.keycloakConfig) { - this.configureKeycloakParameters(window.__env.keycloakConfig); - } - else { - await $http.get('./config/keycloak_backup.json').then(async function (response) { - self.configureKeycloakParameters(response.data); + var self = this; + this.availableKeycloakRoles = []; + this.targetUrlToKeycloakInstance = ""; + this.targetRealmUrlToKeycloakInstance = ""; + this.realm = ""; + this.clientId = ""; + this.roleSuffixes = ["viewer", "editor", "publisher", "creator"]; + this.init = async function () { + try { + if (window.__env.keycloakConfig) { + this.configureKeycloakParameters(window.__env.keycloakConfig); + } + else { + await $http.get('./config/keycloak_backup.json').then(async function (response) { + self.configureKeycloakParameters(response.data); + }); + } + } + catch (error) { + console.error("Error while initializing kommonitorKeycloakHelperService. Error while fetching and interpreting config file. Error is: " + error); + } + }; + this.configureKeycloakParameters = function (keycloakConfig) { + // // https:///auth/ + self.targetUrlToKeycloakInstance = keycloakConfig['auth-server-url']; + self.realm = keycloakConfig['realm']; + self.clientId = keycloakConfig['resource']; + // https:///auth/admin//console + self.targetRealmUrlToKeycloakInstance = self.targetUrlToKeycloakInstance + "admin/" + self.realm + "/console"; + }; + this.fetchRoles = async function () { + console.log = "Fetching roles from Keycloak instance at " + this.targetUrlToKeycloakInstance; + return await $http({ + url: this.targetUrlToKeycloakInstance + this.realm + "/clients/" + this.clientId + "/roles", + method: "GET" + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while fetching roles from keycloak."); + }); + }; + this.postNewRole_withToken = async function (bearerToken, rolesBody) { + return await $http({ + url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles", + method: 'POST', + data: rolesBody, + headers: { + 'Content-Type': 'application/json', + 'Authorization': "Bearer " + bearerToken // Note the appropriate header + } + }).then(function successCallback(response) { + // return created response location + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting role to keycloak."); + throw error; + }); + }; + this.renameExistingRole_withToken = async function (bearerToken, oldRoleName, newRoleName) { + var rolesBody = { + "name": newRoleName + }; + return await $http({ + url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles/" + oldRoleName, + method: 'PUT', + data: rolesBody, + headers: { + 'Content-Type': 'application/json', + 'Authorization': "Bearer " + bearerToken // Note the appropriate header + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting role to keycloak."); + throw error; + }); + }; + this.deleteRole_withToken = async function (bearerToken, roleName) { + return await $http({ + url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles/" + roleName, + method: 'DELETE', + headers: { + 'Authorization': "Bearer " + bearerToken // Note the appropriate header + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while deleting role from keycloak."); + throw error; + }); + }; + this.getAllRoles_withToken = async function (bearerToken) { + return await $http({ + url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles", + method: 'GET', + headers: { + 'Authorization': "Bearer " + bearerToken // Note the appropriate header + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while adding role to keycloak."); + throw error; }); - } - } catch (error) { - console.error("Error while initializing kommonitorKeycloakHelperService. Error while fetching and interpreting config file. Error is: " + error); - } - }; - - this.configureKeycloakParameters = function (keycloakConfig) { - // // https:///auth/ - self.targetUrlToKeycloakInstance = keycloakConfig['auth-server-url']; - self.realm = keycloakConfig['realm']; - self.clientId = keycloakConfig['resource']; - - // https:///auth/admin//console - self.targetRealmUrlToKeycloakInstance = self.targetUrlToKeycloakInstance + "admin/" + self.realm + "/console"; - }; - - this.fetchRoles = async function () { - - console.log = "Fetching roles from Keycloak instance at " + this.targetUrlToKeycloakInstance; - return await $http({ - url: this.targetUrlToKeycloakInstance + this.realm + "/clients/" + this.clientId + "/roles", - method: "GET" - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while fetching roles from keycloak."); - - }); - }; - - this.postNewRole_withToken = async function (bearerToken, rolesBody) { - - return await $http({ - url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles", - method: 'POST', - data: rolesBody, - headers: { - 'Content-Type': 'application/json', - 'Authorization': "Bearer " + bearerToken // Note the appropriate header - } - }).then(function successCallback(response) { - // return created response location - return response.data; - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting role to keycloak."); - throw error; - }); - }; - - this.renameExistingRole_withToken = async function (bearerToken, oldRoleName, newRoleName) { - var rolesBody = { - "name": newRoleName }; - - return await $http({ - url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles/" + oldRoleName, - method: 'PUT', - data: rolesBody, - headers: { - 'Content-Type': 'application/json', - 'Authorization': "Bearer " + bearerToken // Note the appropriate header - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting role to keycloak."); - throw error; - - }); - }; - - this.deleteRole_withToken = async function (bearerToken, roleName) { - - return await $http({ - url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles/" + roleName, - method: 'DELETE', - headers: { - 'Authorization': "Bearer " + bearerToken // Note the appropriate header - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while deleting role from keycloak."); - throw error; - - }); - }; - - this.getAllRoles_withToken = async function (bearerToken) { - - return await $http({ - url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles", - method: 'GET', - headers: { - 'Authorization': "Bearer " + bearerToken // Note the appropriate header - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while adding role to keycloak."); - throw error; - - }); - }; - - this.addCompositeRole_withToken = async function (bearerToken, baseRole, composite) { - let data = [{ - "id": composite.id, - "name": composite.name - }]; - return await $http({ - url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles/" + baseRole.name + "/composites", - method: 'POST', - data: data, - headers: { - 'Authorization': "Bearer " + bearerToken // Note the appropriate header - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - return response.data; - }, function errorCallback(error) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while creating composite role in keycloak."); - throw error; - }); - } - - this.postNewRoles = async function (organizationalUnitName) { - try { - // get auth token to make admin requests - var bearerToken = Auth.keycloak.token; - - // post individual roles - for (let suffix of this.roleSuffixes) { - // post individual role - await this.postNewRole_withToken(bearerToken, { "name": organizationalUnitName + "-" + suffix }); - } - const allRoles = await this.getAllRoles_withToken(bearerToken); - var roleMap = allRoles.filter(role => role.name.startsWith(organizationalUnitName + "-")) - .reduce((prev, curr) => (prev[curr.name] = curr, prev), {}); - - // Add composites - await this.addCompositeRole_withToken( - bearerToken, - roleMap[organizationalUnitName + "-editor"], - roleMap[organizationalUnitName + "-viewer"] - ); - await this.addCompositeRole_withToken( - bearerToken, - roleMap[organizationalUnitName + "-publisher"], - roleMap[organizationalUnitName + "-editor"] - ); - await this.addCompositeRole_withToken( - bearerToken, - roleMap[organizationalUnitName + "-creator"], - roleMap[organizationalUnitName + "-publisher"] - ); - } catch (error) { - throw error; - } - }; - - this.renameExistingRoles = async function (oldOrganizationalUnitName, newOrganizationalUnitName) { - try { - // first get auth token to make admin requests - var bearerToken = Auth.keycloak.token; - - for (let suffix of this.roleSuffixes) { - await this.renameExistingRole_withToken(bearerToken, oldOrganizationalUnitName + "-" + suffix, newOrganizationalUnitName + "-" + suffix); - } - } catch (error) { - throw error; - } - - }; - - this.deleteRoles = async function (organizationalUnitName) { - try { - // first get auth token to make admin requests - var bearerToken = Auth.keycloak.token; - - for (let suffix of this.roleSuffixes) { - await this.deleteRole_withToken(bearerToken, organizationalUnitName + "-" + suffix); - } - } catch (error) { - throw error; - } - }; - - this.getAllRoles = async function () { - try { - // first get auth token to make admin requests - var bearerToken = Auth.keycloak.token; - - // then make admin request - return await this.getAllRoles_withToken(bearerToken); - } catch (error) { - throw error; - } - - }; - - this.setAvailableKeycloakRoles = function (roles) { - this.availableKeycloakRoles = roles; - }; - - this.fetchAndSetKeycloakRoles = async function (username, password) { - this.setAvailableKeycloakRoles(await this.getAllRoles(username, password)); - }; - - this.isRoleInKeycloak = function (roleName) { - for (const keycloakRole of this.availableKeycloakRoles) { - if (keycloakRole.name === roleName) { - return true; - } - } - return false; - }; - - var self = this; - this.init(); - + this.addCompositeRole_withToken = async function (bearerToken, baseRole, composite) { + let data = [{ + "id": composite.id, + "name": composite.name + }]; + return await $http({ + url: this.targetUrlToKeycloakInstance + "admin/realms/" + this.realm + "/roles/" + baseRole.name + "/composites", + method: 'POST', + data: data, + headers: { + 'Authorization': "Bearer " + bearerToken // Note the appropriate header + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(error) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while creating composite role in keycloak."); + throw error; + }); + }; + this.postNewRoles = async function (organizationalUnitName) { + try { + // get auth token to make admin requests + var bearerToken = Auth.keycloak.token; + // post individual roles + for (let suffix of this.roleSuffixes) { + // post individual role + await this.postNewRole_withToken(bearerToken, { "name": organizationalUnitName + "-" + suffix }); + } + const allRoles = await this.getAllRoles_withToken(bearerToken); + var roleMap = allRoles.filter(role => role.name.startsWith(organizationalUnitName + "-")) + .reduce((prev, curr) => (prev[curr.name] = curr, prev), {}); + // Add composites + await this.addCompositeRole_withToken(bearerToken, roleMap[organizationalUnitName + "-editor"], roleMap[organizationalUnitName + "-viewer"]); + await this.addCompositeRole_withToken(bearerToken, roleMap[organizationalUnitName + "-publisher"], roleMap[organizationalUnitName + "-editor"]); + await this.addCompositeRole_withToken(bearerToken, roleMap[organizationalUnitName + "-creator"], roleMap[organizationalUnitName + "-publisher"]); + } + catch (error) { + throw error; + } + }; + this.renameExistingRoles = async function (oldOrganizationalUnitName, newOrganizationalUnitName) { + try { + // first get auth token to make admin requests + var bearerToken = Auth.keycloak.token; + for (let suffix of this.roleSuffixes) { + await this.renameExistingRole_withToken(bearerToken, oldOrganizationalUnitName + "-" + suffix, newOrganizationalUnitName + "-" + suffix); + } + } + catch (error) { + throw error; + } + }; + this.deleteRoles = async function (organizationalUnitName) { + try { + // first get auth token to make admin requests + var bearerToken = Auth.keycloak.token; + for (let suffix of this.roleSuffixes) { + await this.deleteRole_withToken(bearerToken, organizationalUnitName + "-" + suffix); + } + } + catch (error) { + throw error; + } + }; + this.getAllRoles = async function () { + try { + // first get auth token to make admin requests + var bearerToken = Auth.keycloak.token; + // then make admin request + return await this.getAllRoles_withToken(bearerToken); + } + catch (error) { + throw error; + } + }; + this.setAvailableKeycloakRoles = function (roles) { + this.availableKeycloakRoles = roles; + }; + this.fetchAndSetKeycloakRoles = async function (username, password) { + this.setAvailableKeycloakRoles(await this.getAllRoles(username, password)); + }; + this.isRoleInKeycloak = function (roleName) { + for (const keycloakRole of this.availableKeycloakRoles) { + if (keycloakRole.name === roleName) { + return true; + } + } + return false; + }; + var self = this; + this.init(); }]); +//# sourceMappingURL=kommonitor-keycloak-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorKeycloakHelperService/kommonitor-keycloak-helper-service.module.js.map b/app/util/genericServices/kommonitorKeycloakHelperService/kommonitor-keycloak-helper-service.module.js.map new file mode 100644 index 000000000..75c5386ef --- /dev/null +++ b/app/util/genericServices/kommonitorKeycloakHelperService/kommonitor-keycloak-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-keycloak-helper-service.module.js","sourceRoot":"","sources":["kommonitor-keycloak-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorMultiStepFormHelperService/kommonitor-multi-step-form-helper-service.module.js b/app/util/genericServices/kommonitorMultiStepFormHelperService/kommonitor-multi-step-form-helper-service.module.js index f97d6d1e3..8de6d8057 100644 --- a/app/util/genericServices/kommonitorMultiStepFormHelperService/kommonitor-multi-step-form-helper-service.module.js +++ b/app/util/genericServices/kommonitorMultiStepFormHelperService/kommonitor-multi-step-form-helper-service.module.js @@ -1,166 +1,127 @@ +"use strict"; angular.module('kommonitorMultiStepFormHelper', ['kommonitorSingleFeatureMapHelper']); - angular - .module('kommonitorMultiStepFormHelper', []) - .service( - 'kommonitorMultiStepFormHelperService', [ + .module('kommonitorMultiStepFormHelper', []) + .service('kommonitorMultiStepFormHelperService', [ '$http', '__env', '$timeout', 'kommonitorSingleFeatureMapHelperService', function ($http, __env, $timeout, kommonitorSingleFeatureMapHelperService) { - - /* - MULTI STEP FORM STUFF - */ - //jQuery time - this.current_fs; - this.next_fs; - this.previous_fs; //fieldsets - this.opacity; - this.scale; //fieldset properties which we will animate - this.animating; //flag to prevent quick multi-click glitches - - let self = this; - - this.registerClickHandler = function(){ - this.registerNextButtonClick(); - this.registerPreviousButtonClick(); - this.registerProgressBarItemClick(); - }; - - this.registerProgressBarItemClick = function(){ - $timeout(function(){ - $("#progressbar > li").click(function(){ - let newIndex = $("#progressbar > li").index(this); - let oldIndex; - let allFs = $($(this).parent().parent().parent().children("fieldset")); - let activeFs; - - for (const fsCandidate of allFs) { - if(fsCandidate.style["display"] != "none"){ - activeFs = fsCandidate; - break; - } - } - oldIndex = $("fieldset").index(activeFs); - - self.current_fs = $($("fieldset").get(oldIndex)); - - - if(newIndex == oldIndex){ - return; - } - else if(newIndex < oldIndex){ - - self.previous_fs = $($("fieldset").get(newIndex)); - - //de-activate current step on progressbar - for (let index = oldIndex; index > newIndex; index--) { - $($("#progressbar > li").get(index)).removeClass("active"); - } - - //show the previous fieldset - self.previous_fs.show(); - - self.previous_fs.css({ - 'position': 'relative' - }); - self.current_fs.css({ - 'position': 'absolute' - }); - - self.current_fs.hide(); - } - else { - self.animating = true; - self.next_fs = $($("fieldset").get(newIndex)); - - //activate next step on progressbar using the index of self.next_fs - for (let index = oldIndex; index <= newIndex; index++) { - $($("#progressbar > li").get(index)).addClass("active"); - } - - //show the next fieldset - self.next_fs.show(); - - self.next_fs.css({ - 'position': 'relative' - }); - self.current_fs.css({ - 'position': 'absolute' - }); - - self.current_fs.hide(); - } - - // should any page be shown, where there is a single feature edit map then we must ensure that content is zoomed to - kommonitorSingleFeatureMapHelperService.invalidateMap(); - kommonitorSingleFeatureMapHelperService.zoomToDataLayer(); - }); - - }, 500); - }; - - - this.registerNextButtonClick = function(){ - $timeout(function(){ - - $(".next").click(function(){ - - self.current_fs = $(this).parent(); - self.next_fs = $(this).parent().next(); - - //activate next step on progressbar using the index of self.next_fs - $("#progressbar li").eq($("fieldset").index(self.next_fs)).addClass("active"); - - //show the next fieldset - self.next_fs.show(); - - self.next_fs.css({ - 'position': 'relative' - }); - self.current_fs.css({ - 'position': 'absolute' - }); - - self.current_fs.hide(); - - // should any page be shown, where there is a single feature edit map then we must ensure that content is zoomed to - kommonitorSingleFeatureMapHelperService.invalidateMap(); - kommonitorSingleFeatureMapHelperService.zoomToDataLayer(); - }); - - }, 500); - }; - - this.registerPreviousButtonClick = function(){ - $timeout(function(){ - - $(".previous").click(function(){ - - self.current_fs = $(this).parent(); - self.previous_fs = $(this).parent().prev(); - - //de-activate current step on progressbar - $("#progressbar li").eq($("fieldset").index(self.current_fs)).removeClass("active"); - - //show the previous fieldset - self.previous_fs.show(); - self.previous_fs.css({ - 'position': 'relative' - }); - self.current_fs.css({ - 'position': 'absolute' - }); - self.current_fs.hide(); - - // should any page be shown, where there is a single feature edit map then we must ensure that content is zoomed to - kommonitorSingleFeatureMapHelperService.invalidateMap(); - kommonitorSingleFeatureMapHelperService.zoomToDataLayer(); - }); - - }, 500); - }; - - - - - }]); + /* + MULTI STEP FORM STUFF + */ + //jQuery time + this.current_fs; + this.next_fs; + this.previous_fs; //fieldsets + this.opacity; + this.scale; //fieldset properties which we will animate + this.animating; //flag to prevent quick multi-click glitches + let self = this; + this.registerClickHandler = function () { + this.registerNextButtonClick(); + this.registerPreviousButtonClick(); + this.registerProgressBarItemClick(); + }; + this.registerProgressBarItemClick = function () { + $timeout(function () { + $("#progressbar > li").click(function () { + let newIndex = $("#progressbar > li").index(this); + let oldIndex; + let allFs = $($(this).parent().parent().parent().children("fieldset")); + let activeFs; + for (const fsCandidate of allFs) { + if (fsCandidate.style["display"] != "none") { + activeFs = fsCandidate; + break; + } + } + oldIndex = $("fieldset").index(activeFs); + self.current_fs = $($("fieldset").get(oldIndex)); + if (newIndex == oldIndex) { + return; + } + else if (newIndex < oldIndex) { + self.previous_fs = $($("fieldset").get(newIndex)); + //de-activate current step on progressbar + for (let index = oldIndex; index > newIndex; index--) { + $($("#progressbar > li").get(index)).removeClass("active"); + } + //show the previous fieldset + self.previous_fs.show(); + self.previous_fs.css({ + 'position': 'relative' + }); + self.current_fs.css({ + 'position': 'absolute' + }); + self.current_fs.hide(); + } + else { + self.animating = true; + self.next_fs = $($("fieldset").get(newIndex)); + //activate next step on progressbar using the index of self.next_fs + for (let index = oldIndex; index <= newIndex; index++) { + $($("#progressbar > li").get(index)).addClass("active"); + } + //show the next fieldset + self.next_fs.show(); + self.next_fs.css({ + 'position': 'relative' + }); + self.current_fs.css({ + 'position': 'absolute' + }); + self.current_fs.hide(); + } + // should any page be shown, where there is a single feature edit map then we must ensure that content is zoomed to + kommonitorSingleFeatureMapHelperService.invalidateMap(); + kommonitorSingleFeatureMapHelperService.zoomToDataLayer(); + }); + }, 500); + }; + this.registerNextButtonClick = function () { + $timeout(function () { + $(".next").click(function () { + self.current_fs = $(this).parent(); + self.next_fs = $(this).parent().next(); + //activate next step on progressbar using the index of self.next_fs + $("#progressbar li").eq($("fieldset").index(self.next_fs)).addClass("active"); + //show the next fieldset + self.next_fs.show(); + self.next_fs.css({ + 'position': 'relative' + }); + self.current_fs.css({ + 'position': 'absolute' + }); + self.current_fs.hide(); + // should any page be shown, where there is a single feature edit map then we must ensure that content is zoomed to + kommonitorSingleFeatureMapHelperService.invalidateMap(); + kommonitorSingleFeatureMapHelperService.zoomToDataLayer(); + }); + }, 500); + }; + this.registerPreviousButtonClick = function () { + $timeout(function () { + $(".previous").click(function () { + self.current_fs = $(this).parent(); + self.previous_fs = $(this).parent().prev(); + //de-activate current step on progressbar + $("#progressbar li").eq($("fieldset").index(self.current_fs)).removeClass("active"); + //show the previous fieldset + self.previous_fs.show(); + self.previous_fs.css({ + 'position': 'relative' + }); + self.current_fs.css({ + 'position': 'absolute' + }); + self.current_fs.hide(); + // should any page be shown, where there is a single feature edit map then we must ensure that content is zoomed to + kommonitorSingleFeatureMapHelperService.invalidateMap(); + kommonitorSingleFeatureMapHelperService.zoomToDataLayer(); + }); + }, 500); + }; + } +]); +//# sourceMappingURL=kommonitor-multi-step-form-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorMultiStepFormHelperService/kommonitor-multi-step-form-helper-service.module.js.map b/app/util/genericServices/kommonitorMultiStepFormHelperService/kommonitor-multi-step-form-helper-service.module.js.map new file mode 100644 index 000000000..5dd5d0c3a --- /dev/null +++ b/app/util/genericServices/kommonitorMultiStepFormHelperService/kommonitor-multi-step-form-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-multi-step-form-helper-service.module.js","sourceRoot":"","sources":["kommonitor-multi-step-form-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorScriptHelperService/kommonitor-script-helper-service.module.js b/app/util/genericServices/kommonitorScriptHelperService/kommonitor-script-helper-service.module.js index d1fcef1cb..6d43c7e39 100644 --- a/app/util/genericServices/kommonitorScriptHelperService/kommonitor-script-helper-service.module.js +++ b/app/util/genericServices/kommonitorScriptHelperService/kommonitor-script-helper-service.module.js @@ -1,495 +1,430 @@ +"use strict"; angular.module('kommonitorScriptHelper', ['kommonitorDataExchange']); - angular - .module('kommonitorScriptHelper', []) - .service( - 'kommonitorScriptHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', - function ($rootScope, $timeout, - kommonitorDataExchangeService, $http, __env) { - - var self = this; - - this.targetUrlToManagementService = __env.apiUrl + __env.basePath + "/"; - - this.availableScriptDataTypes = [ - { - "displayName": "Textuell (String)", - "apiName": "string" - }, - { - "displayName": "Wahrheitswert (Boolean)", - "apiName": "boolean" - }, - { - "displayName": "Ganzzahl (Integer)", - "apiName": "integer" - }, - { - "displayName": "Gleitkommazahl (Double)", - "apiName": "double" - } - ]; - - this.availableScriptTypeOptions = [ - { - "displayName": "Generische Definition", - "apiName": "generic" - }, - { - "displayName": "Indikatoren - Summe aller Indikatoren", - "apiName": "indicator_sum" - }, - { - "displayName": "Indikatoren - Subtraktion von Basis-Indikatoren von einem Referenzindikator", - "apiName": "indicator_subtract" - }, - { - "displayName": "Indikatoren - Prozentualer Anteil (Quotient zwischen Basis-Indikatoren und einem Referenzindikator)", - "apiName": "indicator_percentage" - }, - { - "displayName": "Indikatoren - Anteil (Quotient zwischen Basis-Indikatoren und einem Referenzindikator)", - "apiName": "indicator_share" - }, - { - "displayName": "Indikatoren - Division (Quotient zweier Indikatoren)", - "apiName": "indicator_division" - }, - { - "displayName": "Indikatoren - Trend (mittels linearer Regression)", - "apiName": "indicator_trend" - }, - { - "displayName": "Indikatoren - Kontinuität (mittels Pearson Korrelation)", - "apiName": "indicator_continuity" - }, - { - "displayName": "Indikatoren - Veränderung absolut", - "apiName": "indicator_change_absolute" - }, - { - "displayName": "Indikatoren - Veränderung absolut mit festem Referenz-Zeitpunkt", - "apiName": "indicator_change_absolute_refDate" - }, - { - "displayName": "Indikatoren - Veränderung prozentual mit festem Referenz-Zeitpunkt", - "apiName": "indicator_change_relative_refDate" - }, - { - "displayName": "Indikatoren - Veränderung prozentual", - "apiName": "indicator_change_relative" - }, - { - "displayName": "Indikatoren - Promille-Wert (Quotient zwischen Basis-Indikatoren und einem Referenzindikator)", - "apiName": "indicator_promille" - }, - { - "displayName": "Leitindikator - verkettete Berechnung (Rank, Min-Max-Normalisierung, Aggregation)", - "apiName": "indicator_headlineIndicator" - }, - { - "displayName": "Indikatoren - Produkt aller Indikatoren", - "apiName": "indicator_multiplication" - }, - { - "displayName": "Georessourcen - Anzahl Punkte in Polygon", - "apiName": "georesource_pointsInPolygon" - }, - { - "displayName": "Georessourcen - Statistiken anhand Objekteigenschaft (Punktdatensätze)", - "apiName": "georesource_statistics" - }, - { - "displayName": "Georessourcen - Prozentualer Anteil anhand Objekteigenschaft (Punktdatensätze)", - "apiName": "georesource_subsetShare" - }, - { - "displayName": "Georessourcen - Summierte Linienlänge je Polygon", - "apiName": "lineSegmentInPolygon" - } - ]; - - this.temporalOptions = [ - { - "apiName": "YEARS", - "displayName": "Jahr(e)" - }, - { - "apiName": "MONTHS", - "displayName": "Monat(e)" - }, - { - "apiName": "DAYS", - "displayName": "Tag(e)" - } - ]; - - this.requiredIndicators_tmp = []; - this.requiredGeoresources_tmp = []; - this.requiredScriptParameters_tmp = []; - this.scriptCode_base64String = undefined; - this.scriptCode_readableString = undefined; - - this.scriptFormulaHTML = undefined; - this.scriptFormulaHTML_successToastDisplay = this.scriptFormulaHTML; - this.scriptFormulaHTML_overwriteTargetIndicatorMethod = false; - - this.scriptFormulaExplanation = undefined; - - this.targetIndicatorOldProcessDescription = undefined; - - this.reset = function(){ + .module('kommonitorScriptHelper', []) + .service('kommonitorScriptHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', + function ($rootScope, $timeout, kommonitorDataExchangeService, $http, __env) { + var self = this; + this.targetUrlToManagementService = __env.apiUrl + __env.basePath + "/"; + this.availableScriptDataTypes = [ + { + "displayName": "Textuell (String)", + "apiName": "string" + }, + { + "displayName": "Wahrheitswert (Boolean)", + "apiName": "boolean" + }, + { + "displayName": "Ganzzahl (Integer)", + "apiName": "integer" + }, + { + "displayName": "Gleitkommazahl (Double)", + "apiName": "double" + } + ]; + this.availableScriptTypeOptions = [ + { + "displayName": "Generische Definition", + "apiName": "generic" + }, + { + "displayName": "Indikatoren - Summe aller Indikatoren", + "apiName": "indicator_sum" + }, + { + "displayName": "Indikatoren - Subtraktion von Basis-Indikatoren von einem Referenzindikator", + "apiName": "indicator_subtract" + }, + { + "displayName": "Indikatoren - Prozentualer Anteil (Quotient zwischen Basis-Indikatoren und einem Referenzindikator)", + "apiName": "indicator_percentage" + }, + { + "displayName": "Indikatoren - Anteil (Quotient zwischen Basis-Indikatoren und einem Referenzindikator)", + "apiName": "indicator_share" + }, + { + "displayName": "Indikatoren - Division (Quotient zweier Indikatoren)", + "apiName": "indicator_division" + }, + { + "displayName": "Indikatoren - Trend (mittels linearer Regression)", + "apiName": "indicator_trend" + }, + { + "displayName": "Indikatoren - Kontinuität (mittels Pearson Korrelation)", + "apiName": "indicator_continuity" + }, + { + "displayName": "Indikatoren - Veränderung absolut", + "apiName": "indicator_change_absolute" + }, + { + "displayName": "Indikatoren - Veränderung absolut mit festem Referenz-Zeitpunkt", + "apiName": "indicator_change_absolute_refDate" + }, + { + "displayName": "Indikatoren - Veränderung prozentual mit festem Referenz-Zeitpunkt", + "apiName": "indicator_change_relative_refDate" + }, + { + "displayName": "Indikatoren - Veränderung prozentual", + "apiName": "indicator_change_relative" + }, + { + "displayName": "Indikatoren - Promille-Wert (Quotient zwischen Basis-Indikatoren und einem Referenzindikator)", + "apiName": "indicator_promille" + }, + { + "displayName": "Leitindikator - verkettete Berechnung (Rank, Min-Max-Normalisierung, Aggregation)", + "apiName": "indicator_headlineIndicator" + }, + { + "displayName": "Indikatoren - Produkt aller Indikatoren", + "apiName": "indicator_multiplication" + }, + { + "displayName": "Georessourcen - Anzahl Punkte in Polygon", + "apiName": "georesource_pointsInPolygon" + }, + { + "displayName": "Georessourcen - Statistiken anhand Objekteigenschaft (Punktdatensätze)", + "apiName": "georesource_statistics" + }, + { + "displayName": "Georessourcen - Prozentualer Anteil anhand Objekteigenschaft (Punktdatensätze)", + "apiName": "georesource_subsetShare" + }, + { + "displayName": "Georessourcen - Summierte Linienlänge je Polygon", + "apiName": "lineSegmentInPolygon" + } + ]; + this.temporalOptions = [ + { + "apiName": "YEARS", + "displayName": "Jahr(e)" + }, + { + "apiName": "MONTHS", + "displayName": "Monat(e)" + }, + { + "apiName": "DAYS", + "displayName": "Tag(e)" + } + ]; this.requiredIndicators_tmp = []; this.requiredGeoresources_tmp = []; this.requiredScriptParameters_tmp = []; this.scriptCode_base64String = undefined; this.scriptCode_readableString = undefined; this.scriptFormulaHTML = undefined; + this.scriptFormulaHTML_successToastDisplay = this.scriptFormulaHTML; this.scriptFormulaHTML_overwriteTargetIndicatorMethod = false; this.scriptFormulaExplanation = undefined; this.targetIndicatorOldProcessDescription = undefined; - }; - - this.addBaseIndicator = function(indicatorMetadata){ - if(!indicatorMetadata){ - return; - } - // for (const baseIndicator of this.requiredIndicators_tmp) { - // if (baseIndicator.indicatorId === indicatorMetadata.indicatorId){ - // // already inserted as base indicator, hence add not allowed - // return; - // } - // } - this.requiredIndicators_tmp.push(indicatorMetadata); - }; - - this.removeBaseIndicator = function(indicatorMetadata){ - for (let index = 0; index < this.requiredIndicators_tmp.length; index++) { - - if (this.requiredIndicators_tmp[index].indicatorId === indicatorMetadata.indicatorId){ - // remove object - this.requiredIndicators_tmp.splice(index, 1); - break; - } - } - }; - - this.addBaseGeoresource = function(georesourceMetadata){ - // for (const baseGeoresource of this.requiredGeoresources_tmp) { - // if (baseGeoresource.georesourceId === georesourceMetadata.georesourceId){ - // // already inserted as base georesource, hence add not allowed - // return; - // } - // } - this.requiredGeoresources_tmp.push(georesourceMetadata); - }; - - this.removeBaseGeoresource = function(georesourceMetadata){ - for (let index = 0; index < this.requiredGeoresources_tmp.length; index++) { - - if (this.requiredGeoresources_tmp[index].georesourceId === georesourceMetadata.georesourceId){ - // remove object - this.requiredGeoresources_tmp.splice(index, 1); - break; - } - } - }; - - this.addScriptParameter = function(parameterName, parameterDescription, parameterDataType, parameterDefaultValue, parameterNumericMinValue, parameterNumericMaxValue){ - for (const scriptParameter of this.requiredScriptParameters_tmp) { - if (scriptParameter.name === parameterName){ - // already inserted as script parameter, hence add not allowed - return; - } - } - - var scriptParameter = { - "name": parameterName, - "description": parameterDescription, - "dataType": parameterDataType.apiName, - "defaultValue": parameterDefaultValue, - "minParameterValueForNumericInputs": parameterNumericMinValue || 0, - "maxParameterValueForNumericInputs": parameterNumericMaxValue || 1 - + this.reset = function () { + this.requiredIndicators_tmp = []; + this.requiredGeoresources_tmp = []; + this.requiredScriptParameters_tmp = []; + this.scriptCode_base64String = undefined; + this.scriptCode_readableString = undefined; + this.scriptFormulaHTML = undefined; + this.scriptFormulaHTML_overwriteTargetIndicatorMethod = false; + this.scriptFormulaExplanation = undefined; + this.targetIndicatorOldProcessDescription = undefined; }; - this.requiredScriptParameters_tmp.push(scriptParameter); - }; - - this.removeScriptParameter = function(scriptParameter){ - for (let index = 0; index < this.requiredScriptParameters_tmp.length; index++) { - - if (this.requiredScriptParameters_tmp[index].name === scriptParameter.name){ - // remove object - this.requiredScriptParameters_tmp.splice(index, 1); - break; - } - } - }; - - this.removeScriptParameter_byName = function(scriptParameterName){ - for (let index = 0; index < this.requiredScriptParameters_tmp.length; index++) { - - if (this.requiredScriptParameters_tmp[index].name === scriptParameterName){ - // remove object - this.requiredScriptParameters_tmp.splice(index, 1); - break; - } - } - }; - - this.prettifyScriptCodePreview = function(htmlDomElementId){ - - $timeout(function(){ - - $(htmlDomElementId).removeClass("prettyprinted"); - - PR.prettyPrint(); - - }, 250); - - }; - - this.buildPatchBody_indicators = function(targetIndicatorMetadata){ - var patchBody = - { - "metadata": { - "note": targetIndicatorMetadata.metadata.note || null, - "literature": targetIndicatorMetadata.metadata.literature || null, - "updateInterval": targetIndicatorMetadata.metadata.updateInterval, - "sridEPSG": targetIndicatorMetadata.metadata.sridEPSG || 4326, - "datasource": targetIndicatorMetadata.metadata.datasource, - "contact": targetIndicatorMetadata.metadata.contact, - "lastUpdate": targetIndicatorMetadata.metadata.lastUpdate, - "description": targetIndicatorMetadata.metadata.description || null, - "databasis": targetIndicatorMetadata.metadata.databasis || null - }, - "refrencesToOtherIndicators": [], // filled directly after - "allowedRoles": targetIndicatorMetadata.allowedRoles, - "datasetName": targetIndicatorMetadata.indicatorName, - "abbreviation": targetIndicatorMetadata.abbreviation || null, - "characteristicValue": targetIndicatorMetadata.characteristicValue || null, - "tags": targetIndicatorMetadata.tags, - "creationType": targetIndicatorMetadata.creationType, - "unit": targetIndicatorMetadata.unit, - "topicReference": targetIndicatorMetadata.topicReference, - "refrencesToGeoresources": [], // filled directly after - "indicatorType": targetIndicatorMetadata.indicatorType, - "interpretation": targetIndicatorMetadata.interpretation || "", - "isHeadlineIndicator": targetIndicatorMetadata.isHeadlineIndicator || false, - "processDescription": this.scriptFormulaHTML || targetIndicatorMetadata.processDescription, - "lowestSpatialUnitForComputation": targetIndicatorMetadata.lowestSpatialUnitForComputation, - "defaultClassificationMapping": targetIndicatorMetadata.defaultClassificationMapping - }; - - // REFERENCES - - if(targetIndicatorMetadata.referencedIndicators && targetIndicatorMetadata.referencedIndicators.length > 0){ - patchBody.refrencesToOtherIndicators = []; - - for (const indicRef of targetIndicatorMetadata.referencedIndicators) { - patchBody.refrencesToOtherIndicators.push({ - "indicatorId": indicRef.referencedIndicatorId, - "referenceDescription": indicRef.referencedIndicatorDescription - }); + this.addBaseIndicator = function (indicatorMetadata) { + if (!indicatorMetadata) { + return; } - } - - if(targetIndicatorMetadata.referencedGeoresources && targetIndicatorMetadata.referencedGeoresources.length > 0){ - patchBody.refrencesToGeoresources = []; - - for (const geoRef of targetIndicatorMetadata.referencedGeoresources) { - patchBody.refrencesToGeoresources.push({ - "georesourceId": geoRef.referencedGeoresourceId, - "referenceDescription": geoRef.referencedGeoresourceDescription - }); + // for (const baseIndicator of this.requiredIndicators_tmp) { + // if (baseIndicator.indicatorId === indicatorMetadata.indicatorId){ + // // already inserted as base indicator, hence add not allowed + // return; + // } + // } + this.requiredIndicators_tmp.push(indicatorMetadata); + }; + this.removeBaseIndicator = function (indicatorMetadata) { + for (let index = 0; index < this.requiredIndicators_tmp.length; index++) { + if (this.requiredIndicators_tmp[index].indicatorId === indicatorMetadata.indicatorId) { + // remove object + this.requiredIndicators_tmp.splice(index, 1); + break; + } + } + }; + this.addBaseGeoresource = function (georesourceMetadata) { + // for (const baseGeoresource of this.requiredGeoresources_tmp) { + // if (baseGeoresource.georesourceId === georesourceMetadata.georesourceId){ + // // already inserted as base georesource, hence add not allowed + // return; + // } + // } + this.requiredGeoresources_tmp.push(georesourceMetadata); + }; + this.removeBaseGeoresource = function (georesourceMetadata) { + for (let index = 0; index < this.requiredGeoresources_tmp.length; index++) { + if (this.requiredGeoresources_tmp[index].georesourceId === georesourceMetadata.georesourceId) { + // remove object + this.requiredGeoresources_tmp.splice(index, 1); + break; + } + } + }; + this.addScriptParameter = function (parameterName, parameterDescription, parameterDataType, parameterDefaultValue, parameterNumericMinValue, parameterNumericMaxValue) { + for (const scriptParameter of this.requiredScriptParameters_tmp) { + if (scriptParameter.name === parameterName) { + // already inserted as script parameter, hence add not allowed + return; + } + } + var scriptParameter = { + "name": parameterName, + "description": parameterDescription, + "dataType": parameterDataType.apiName, + "defaultValue": parameterDefaultValue, + "minParameterValueForNumericInputs": parameterNumericMinValue || 0, + "maxParameterValueForNumericInputs": parameterNumericMaxValue || 1 + }; + this.requiredScriptParameters_tmp.push(scriptParameter); + }; + this.removeScriptParameter = function (scriptParameter) { + for (let index = 0; index < this.requiredScriptParameters_tmp.length; index++) { + if (this.requiredScriptParameters_tmp[index].name === scriptParameter.name) { + // remove object + this.requiredScriptParameters_tmp.splice(index, 1); + break; + } + } + }; + this.removeScriptParameter_byName = function (scriptParameterName) { + for (let index = 0; index < this.requiredScriptParameters_tmp.length; index++) { + if (this.requiredScriptParameters_tmp[index].name === scriptParameterName) { + // remove object + this.requiredScriptParameters_tmp.splice(index, 1); + break; + } + } + }; + this.prettifyScriptCodePreview = function (htmlDomElementId) { + $timeout(function () { + $(htmlDomElementId).removeClass("prettyprinted"); + PR.prettyPrint(); + }, 250); + }; + this.buildPatchBody_indicators = function (targetIndicatorMetadata) { + var patchBody = { + "metadata": { + "note": targetIndicatorMetadata.metadata.note || null, + "literature": targetIndicatorMetadata.metadata.literature || null, + "updateInterval": targetIndicatorMetadata.metadata.updateInterval, + "sridEPSG": targetIndicatorMetadata.metadata.sridEPSG || 4326, + "datasource": targetIndicatorMetadata.metadata.datasource, + "contact": targetIndicatorMetadata.metadata.contact, + "lastUpdate": targetIndicatorMetadata.metadata.lastUpdate, + "description": targetIndicatorMetadata.metadata.description || null, + "databasis": targetIndicatorMetadata.metadata.databasis || null + }, + "refrencesToOtherIndicators": [], + "allowedRoles": targetIndicatorMetadata.allowedRoles, + "datasetName": targetIndicatorMetadata.indicatorName, + "abbreviation": targetIndicatorMetadata.abbreviation || null, + "characteristicValue": targetIndicatorMetadata.characteristicValue || null, + "tags": targetIndicatorMetadata.tags, + "creationType": targetIndicatorMetadata.creationType, + "unit": targetIndicatorMetadata.unit, + "topicReference": targetIndicatorMetadata.topicReference, + "refrencesToGeoresources": [], + "indicatorType": targetIndicatorMetadata.indicatorType, + "interpretation": targetIndicatorMetadata.interpretation || "", + "isHeadlineIndicator": targetIndicatorMetadata.isHeadlineIndicator || false, + "processDescription": this.scriptFormulaHTML || targetIndicatorMetadata.processDescription, + "lowestSpatialUnitForComputation": targetIndicatorMetadata.lowestSpatialUnitForComputation, + "defaultClassificationMapping": targetIndicatorMetadata.defaultClassificationMapping + }; + // REFERENCES + if (targetIndicatorMetadata.referencedIndicators && targetIndicatorMetadata.referencedIndicators.length > 0) { + patchBody.refrencesToOtherIndicators = []; + for (const indicRef of targetIndicatorMetadata.referencedIndicators) { + patchBody.refrencesToOtherIndicators.push({ + "indicatorId": indicRef.referencedIndicatorId, + "referenceDescription": indicRef.referencedIndicatorDescription + }); + } } - } - - return patchBody; - }; - - this.replaceMethodMetadataForTargetIndicator = async function(targetIndicatorMetadata){ - var patchBody = this.buildPatchBody_indicators(targetIndicatorMetadata); - - this.targetIndicatorOldProcessDescription = targetIndicatorMetadata.processDescription; - - $http({ - url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + targetIndicatorMetadata.indicatorId, - method: "PATCH", - data: patchBody - // headers: { - // 'Content-Type': undefined - // } - }).then(function successCallback(response) { - - $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", targetIndicatorMetadata.indicatorId); - - }, function errorCallback(error) { - - }); - }; - - this.postNewScript = async function(scriptName, description, targetIndicatorMetadata){ - console.log("Trying to POST to management service to register new script."); - - /* POST BODY - { - "scriptCodeBase64": "scriptCodeBase64", - "requiredIndicatorIds": [ - "requiredIndicatorIds", - "requiredIndicatorIds" - ], - "variableProcessParameters": [ - { - "minParameterValueForNumericInputs": 6.027456183070403, - "maxParameterValueForNumericInputs": 0.8008281904610115, - "defaultValue": "defaultValue", - "dataType": "string", - "name": "name", - "description": "description" - }, - { - "minParameterValueForNumericInputs": 6.027456183070403, - "maxParameterValueForNumericInputs": 0.8008281904610115, - "defaultValue": "defaultValue", - "dataType": "string", - "name": "name", - "description": "description" - } - ], - "associatedIndicatorId": "associatedIndicatorId", - "name": "name", - "description": "description", - "requiredGeoresourceIds": [ - "requiredGeoresourceIds", - "requiredGeoresourceIds" - ] - } - */ - - var postBody = { - "name": scriptName, - "description": description, - "associatedIndicatorId": targetIndicatorMetadata.indicatorId, - "requiredIndicatorIds": this.requiredIndicators_tmp.map(indicatorMetadata => indicatorMetadata.indicatorId), - "requiredGeoresourceIds": this.requiredGeoresources_tmp.map(georesourceMetadata => georesourceMetadata.georesourceId), - "variableProcessParameters": this.requiredScriptParameters_tmp, - "scriptCodeBase64": window.btoa(this.scriptCode_readableString) - }; - - return await $http({ - url: this.targetUrlToManagementService + "process-scripts", - method: "POST", - data: postBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - this.updateScript = async function(scriptName, description, scriptId){ - console.log("Trying to POST to importer service to update spatial unit with id '" + spatialUnitId + "'."); - - var putBody = { - "name": scriptName, - "description": description, - "requiredIndicatorIds": this.requiredIndicators_tmp, - "requiredGeoresourceIds": this.requiredGeoresources_tmp, - "variableProcessParameters": this.requiredScriptParameters_tmp, - "scriptCodeBase64": window.btoa(this.scriptCode_readableString) - }; - - return await $http({ - url: this.targetUrlToManagementService + "process-scripts/" + scriptId, - method: "PUT", - data: putBody, - headers: { - 'Content-Type': "application/json" - } - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - return response.data; - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - //$scope.error = response.statusText; - console.error("Error while posting to importer service."); - throw response; - }); - }; - - this.getAlphabetLetterFromNumber = function(number){ - return String.fromCharCode(Number(number) + 'A'.charCodeAt(0)); - }; - - this.styleMathFormula = function(domOutputElementId){ - var output = document.getElementById(domOutputElementId); - output.innerHTML = this.scriptFormulaHTML; - - // MathJax.texReset(); - // MathJax.typesetClear(); - MathJax.typesetPromise([output]).then(function(){ - - }).catch(function (err) { - output.innerHTML = ''; - output.appendChild(document.createTextNode(err.message)); - console.error(err); - }).then(function () { - - }); - }; - - this.styleMathFormula_forExplanation = function(domOutputElementId){ - var output = document.getElementById(domOutputElementId); - - // MathJax.texReset(); - // MathJax.typesetClear(); - MathJax.typesetPromise([output]).then(function(){ - $timeout(function(){ - self.scriptFormulaExplanation = "" + output.innerHTML; - $rootScope.$apply(); - }); - }).catch(function (err) { - output.innerHTML = ''; - output.appendChild(document.createTextNode(err.message)); - console.error(err); - }).then(function () { - $timeout(function(){ - self.scriptFormulaExplanation = "" + output.innerHTML; - $rootScope.$apply(); - }); - }); - }; - - this.typesetContainerByClass = function(className){ - var domElements = document.getElementsByClassName(className); - - for (const domElement of domElements) { - MathJax.typesetPromise([domElement]).then(function(){ - $timeout(function(){ + if (targetIndicatorMetadata.referencedGeoresources && targetIndicatorMetadata.referencedGeoresources.length > 0) { + patchBody.refrencesToGeoresources = []; + for (const geoRef of targetIndicatorMetadata.referencedGeoresources) { + patchBody.refrencesToGeoresources.push({ + "georesourceId": geoRef.referencedGeoresourceId, + "referenceDescription": geoRef.referencedGeoresourceDescription + }); + } + } + return patchBody; + }; + this.replaceMethodMetadataForTargetIndicator = async function (targetIndicatorMetadata) { + var patchBody = this.buildPatchBody_indicators(targetIndicatorMetadata); + this.targetIndicatorOldProcessDescription = targetIndicatorMetadata.processDescription; + $http({ + url: kommonitorDataExchangeService.baseUrlToKomMonitorDataAPI + "/indicators/" + targetIndicatorMetadata.indicatorId, + method: "PATCH", + data: patchBody + // headers: { + // 'Content-Type': undefined + // } + }).then(function successCallback(response) { + $rootScope.$broadcast("refreshIndicatorOverviewTable", "edit", targetIndicatorMetadata.indicatorId); + }, function errorCallback(error) { }); - }).catch(function (err) { - console.error(err); - }).then(function () { - $timeout(function(){ + }; + this.postNewScript = async function (scriptName, description, targetIndicatorMetadata) { + console.log("Trying to POST to management service to register new script."); + /* POST BODY + { + "scriptCodeBase64": "scriptCodeBase64", + "requiredIndicatorIds": [ + "requiredIndicatorIds", + "requiredIndicatorIds" + ], + "variableProcessParameters": [ + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + }, + { + "minParameterValueForNumericInputs": 6.027456183070403, + "maxParameterValueForNumericInputs": 0.8008281904610115, + "defaultValue": "defaultValue", + "dataType": "string", + "name": "name", + "description": "description" + } + ], + "associatedIndicatorId": "associatedIndicatorId", + "name": "name", + "description": "description", + "requiredGeoresourceIds": [ + "requiredGeoresourceIds", + "requiredGeoresourceIds" + ] + } + */ + var postBody = { + "name": scriptName, + "description": description, + "associatedIndicatorId": targetIndicatorMetadata.indicatorId, + "requiredIndicatorIds": this.requiredIndicators_tmp.map(indicatorMetadata => indicatorMetadata.indicatorId), + "requiredGeoresourceIds": this.requiredGeoresources_tmp.map(georesourceMetadata => georesourceMetadata.georesourceId), + "variableProcessParameters": this.requiredScriptParameters_tmp, + "scriptCodeBase64": window.btoa(this.scriptCode_readableString) + }; + return await $http({ + url: this.targetUrlToManagementService + "process-scripts", + method: "POST", + data: postBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; }); - }); - } - }; - + }; + this.updateScript = async function (scriptName, description, scriptId) { + console.log("Trying to POST to importer service to update spatial unit with id '" + spatialUnitId + "'."); + var putBody = { + "name": scriptName, + "description": description, + "requiredIndicatorIds": this.requiredIndicators_tmp, + "requiredGeoresourceIds": this.requiredGeoresources_tmp, + "variableProcessParameters": this.requiredScriptParameters_tmp, + "scriptCodeBase64": window.btoa(this.scriptCode_readableString) + }; + return await $http({ + url: this.targetUrlToManagementService + "process-scripts/" + scriptId, + method: "PUT", + data: putBody, + headers: { + 'Content-Type': "application/json" + } + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + return response.data; + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + //$scope.error = response.statusText; + console.error("Error while posting to importer service."); + throw response; + }); + }; + this.getAlphabetLetterFromNumber = function (number) { + return String.fromCharCode(Number(number) + 'A'.charCodeAt(0)); + }; + this.styleMathFormula = function (domOutputElementId) { + var output = document.getElementById(domOutputElementId); + output.innerHTML = this.scriptFormulaHTML; + // MathJax.texReset(); + // MathJax.typesetClear(); + MathJax.typesetPromise([output]).then(function () { + }).catch(function (err) { + output.innerHTML = ''; + output.appendChild(document.createTextNode(err.message)); + console.error(err); + }).then(function () { + }); + }; + this.styleMathFormula_forExplanation = function (domOutputElementId) { + var output = document.getElementById(domOutputElementId); + // MathJax.texReset(); + // MathJax.typesetClear(); + MathJax.typesetPromise([output]).then(function () { + $timeout(function () { + self.scriptFormulaExplanation = "" + output.innerHTML; + $rootScope.$apply(); + }); + }).catch(function (err) { + output.innerHTML = ''; + output.appendChild(document.createTextNode(err.message)); + console.error(err); + }).then(function () { + $timeout(function () { + self.scriptFormulaExplanation = "" + output.innerHTML; + $rootScope.$apply(); + }); + }); + }; + this.typesetContainerByClass = function (className) { + var domElements = document.getElementsByClassName(className); + for (const domElement of domElements) { + MathJax.typesetPromise([domElement]).then(function () { + $timeout(function () { + }); + }).catch(function (err) { + console.error(err); + }).then(function () { + $timeout(function () { + }); + }); + } + }; }]); +//# sourceMappingURL=kommonitor-script-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorScriptHelperService/kommonitor-script-helper-service.module.js.map b/app/util/genericServices/kommonitorScriptHelperService/kommonitor-script-helper-service.module.js.map new file mode 100644 index 000000000..65b5e5788 --- /dev/null +++ b/app/util/genericServices/kommonitorScriptHelperService/kommonitor-script-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-script-helper-service.module.js","sourceRoot":"","sources":["kommonitor-script-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorShareHelperService/kommonitor-share-helper-service.module.js b/app/util/genericServices/kommonitorShareHelperService/kommonitor-share-helper-service.module.js index 4639a9bae..6995df3ed 100644 --- a/app/util/genericServices/kommonitorShareHelperService/kommonitor-share-helper-service.module.js +++ b/app/util/genericServices/kommonitorShareHelperService/kommonitor-share-helper-service.module.js @@ -1,139 +1,115 @@ +"use strict"; angular.module('kommonitorShareHelper', ['kommonitorDataExchange']); - - angular - .module('kommonitorShareHelper', []) - .service( - 'kommonitorShareHelperService', [ + .module('kommonitorShareHelper', []) + .service('kommonitorShareHelperService', [ '$http', '__env', 'Auth', '$routeParams', '$location', 'kommonitorDataExchangeService', function ($http, __env, Auth, $routeParams, $location, kommonitorDataExchangeService) { - - this.baseUrlToKomMonitorDataAPI = __env.apiUrl + __env.basePath; - let self = this; - - this.queryParamMap = new Map(); - this.currentShareLink = ""; - - this.paramName_loginRequired = "login"; - this.paramName_indicatorId = "ind"; - this.paramName_spatialUnitName = "spu"; - this.paramName_zoomLevel = "zoom"; - this.paramName_latitude = "lat"; - this.paramName_longitude = "lon"; - - this.initParamsMap = function(){ - // set map content from params + this.baseUrlToKomMonitorDataAPI = __env.apiUrl + __env.basePath; + let self = this; this.queryParamMap = new Map(); - - for (const key in $routeParams) { - if (Object.hasOwnProperty.call($routeParams, key)) { - const value = $routeParams[key]; - this.queryParamMap.set(key, value); - } - } - }; - - this.applyQueryParams = function(){ - if ($routeParams[this.paramName_indicatorId]){ - __env.initialIndicatorId = $routeParams[this.paramName_indicatorId]; - } - if ($routeParams[this.paramName_spatialUnitName]){ - __env.initialSpatialUnitName = $routeParams[this.paramName_spatialUnitName]; - } - if ($routeParams[this.paramName_latitude]){ - __env.initialLatitude = $routeParams[this.paramName_latitude]; - } - if ($routeParams[this.paramName_longitude]){ - __env.initialLongitude = $routeParams[this.paramName_longitude]; - } - if ($routeParams[this.paramName_zoomLevel]){ - __env.initialZoomLevel = $routeParams[this.paramName_zoomLevel]; - } - }; - - this.init = function(){ - // parse query params - this.initParamsMap(); - - // if login required then route to login page with same link as redirect URL - if ($routeParams[this.paramName_loginRequired] && JSON.parse($routeParams[this.paramName_loginRequired])){ - // login required - if(window.__env.enableKeycloakSecurity){ - if (Auth.keycloak.authenticated) { - // if (Auth.keycloak.showAdminView) { - // return true; - // } else { - // return $q.reject('Not Authenticated'); - // } + this.currentShareLink = ""; + this.paramName_loginRequired = "login"; + this.paramName_indicatorId = "ind"; + this.paramName_spatialUnitName = "spu"; + this.paramName_zoomLevel = "zoom"; + this.paramName_latitude = "lat"; + this.paramName_longitude = "lon"; + this.initParamsMap = function () { + // set map content from params + this.queryParamMap = new Map(); + for (const key in $routeParams) { + if (Object.hasOwnProperty.call($routeParams, key)) { + const value = $routeParams[key]; + this.queryParamMap.set(key, value); + } + } + }; + this.applyQueryParams = function () { + if ($routeParams[this.paramName_indicatorId]) { + __env.initialIndicatorId = $routeParams[this.paramName_indicatorId]; + } + if ($routeParams[this.paramName_spatialUnitName]) { + __env.initialSpatialUnitName = $routeParams[this.paramName_spatialUnitName]; + } + if ($routeParams[this.paramName_latitude]) { + __env.initialLatitude = $routeParams[this.paramName_latitude]; + } + if ($routeParams[this.paramName_longitude]) { + __env.initialLongitude = $routeParams[this.paramName_longitude]; + } + if ($routeParams[this.paramName_zoomLevel]) { + __env.initialZoomLevel = $routeParams[this.paramName_zoomLevel]; + } + }; + this.init = function () { + // parse query params + this.initParamsMap(); + // if login required then route to login page with same link as redirect URL + if ($routeParams[this.paramName_loginRequired] && JSON.parse($routeParams[this.paramName_loginRequired])) { + // login required + if (window.__env.enableKeycloakSecurity) { + if (Auth.keycloak.authenticated) { + // if (Auth.keycloak.showAdminView) { + // return true; + // } else { + // return $q.reject('Not Authenticated'); + // } + } + else { + Auth.keycloak.login({ + redirectUri: this.currentShareLink + }); + } + } + } + // set config and data options from params + this.applyQueryParams(); + }; + this.generateCurrentShareLink = function () { + this.setShareLinkParam_mapExtent(); + this.setShareLinkParam_currentIndicatorId(); + this.setShareLinkParam_currentSpatialUnitName(); + // regerenate the share link from all current parameters + this.currentShareLink = $location.absUrl(); + if (this.currentShareLink.includes("?")) { + this.currentShareLink = this.currentShareLink.split("?")[0]; + } + this.currentShareLink += "?"; + this.queryParamMap.forEach((value, key) => { + self.currentShareLink += "" + key + "=" + value + "&"; + }); + }; + this.setShareLinkParam = function (paramName, value) { + this.queryParamMap.set(paramName, value); + }; + this.setShareLinkParam_currentIndicatorId = function () { + this.setShareLinkParam(this.paramName_indicatorId, kommonitorDataExchangeService.selectedIndicator.indicatorId); + if (kommonitorDataExchangeService.selectedIndicator.allowedRoles.length > 0) { + this.setShareLinkParam(this.paramName_loginRequired, "true"); } else { - Auth.keycloak.login({ - redirectUri: this.currentShareLink - }); + for (const spatialUnit of kommonitorDataExchangeService.selectedIndicator.applicableSpatialUnits) { + if (spatialUnit.spatialUnitName == kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel) { + if (spatialUnit.allowedRoles.length > 0) { + this.setShareLinkParam(this.paramName_loginRequired, "true"); + } + } + } } - } - } - - // set config and data options from params - this.applyQueryParams(); - }; - - this.generateCurrentShareLink = function(){ - - this.setShareLinkParam_mapExtent(); - this.setShareLinkParam_currentIndicatorId(); - this.setShareLinkParam_currentSpatialUnitName(); - - // regerenate the share link from all current parameters - this.currentShareLink = $location.absUrl(); - - if(this.currentShareLink.includes("?")){ - this.currentShareLink = this.currentShareLink.split("?")[0]; - } - - this.currentShareLink += "?"; - - this.queryParamMap.forEach((value, key) => { - self.currentShareLink += "" + key + "=" + value + "&"; - } - ); - - }; - - this.setShareLinkParam = function(paramName, value){ - this.queryParamMap.set(paramName, value); - }; - - this.setShareLinkParam_currentIndicatorId = function(){ - this.setShareLinkParam(this.paramName_indicatorId, kommonitorDataExchangeService.selectedIndicator.indicatorId); - - if(kommonitorDataExchangeService.selectedIndicator.allowedRoles.length > 0){ - this.setShareLinkParam(this.paramName_loginRequired, "true"); - } - else{ - for (const spatialUnit of kommonitorDataExchangeService.selectedIndicator.applicableSpatialUnits) { - if(spatialUnit.spatialUnitName == kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel){ - if (spatialUnit.allowedRoles.length > 0){ + }; + this.setShareLinkParam_currentSpatialUnitName = function () { + this.setShareLinkParam(this.paramName_spatialUnitName, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel); + if (kommonitorDataExchangeService.selectedSpatialUnit.allowedRoles.length > 0) { this.setShareLinkParam(this.paramName_loginRequired, "true"); - } } - } - } - - }; - - this.setShareLinkParam_currentSpatialUnitName = function(){ - this.setShareLinkParam(this.paramName_spatialUnitName, kommonitorDataExchangeService.selectedSpatialUnit.spatialUnitLevel); - if(kommonitorDataExchangeService.selectedSpatialUnit.allowedRoles.length > 0){ - this.setShareLinkParam(this.paramName_loginRequired, "true"); - } - }; - - this.setShareLinkParam_mapExtent = function(){ - this.setShareLinkParam(this.paramName_latitude, __env.currentLatitude); - this.setShareLinkParam(this.paramName_longitude, __env.currentLongitude); - this.setShareLinkParam(this.paramName_zoomLevel, __env.currentZoomLevel); - __env.centerMapInitially = false; - }; - - }]); + }; + this.setShareLinkParam_mapExtent = function () { + this.setShareLinkParam(this.paramName_latitude, __env.currentLatitude); + this.setShareLinkParam(this.paramName_longitude, __env.currentLongitude); + this.setShareLinkParam(this.paramName_zoomLevel, __env.currentZoomLevel); + __env.centerMapInitially = false; + }; + } +]); +//# sourceMappingURL=kommonitor-share-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorShareHelperService/kommonitor-share-helper-service.module.js.map b/app/util/genericServices/kommonitorShareHelperService/kommonitor-share-helper-service.module.js.map new file mode 100644 index 000000000..9d3efdc8c --- /dev/null +++ b/app/util/genericServices/kommonitorShareHelperService/kommonitor-share-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-share-helper-service.module.js","sourceRoot":"","sources":["kommonitor-share-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorSingleFeatureMapHelperService/kommonitor-single-feature-map-helper-service.module.js b/app/util/genericServices/kommonitorSingleFeatureMapHelperService/kommonitor-single-feature-map-helper-service.module.js index 3abfd1b00..606421aa3 100644 --- a/app/util/genericServices/kommonitorSingleFeatureMapHelperService/kommonitor-single-feature-map-helper-service.module.js +++ b/app/util/genericServices/kommonitorSingleFeatureMapHelperService/kommonitor-single-feature-map-helper-service.module.js @@ -1,431 +1,368 @@ +"use strict"; angular.module('kommonitorSingleFeatureMapHelper', ['kommonitorDataExchange']); - angular - .module('kommonitorSingleFeatureMapHelper', []) - .service( - 'kommonitorSingleFeatureMapHelperService', ['$rootScope', '__env', '$timeout', + .module('kommonitorSingleFeatureMapHelper', []) + .service('kommonitorSingleFeatureMapHelperService', ['$rootScope', '__env', '$timeout', function ($rootScope, __env, $timeout) { - - var self = this; - - this.resourceType_point = "POINT"; - this.resourceType_line = "LINE"; - this.resourceType_polygon = "POLYGON"; - - //leaflet map instance - this.map; - this.layerControl; - // layer holding the editable feature - this.featureLayer; - this.drawControl; - this.geosearchControl; - - // backgroundLayer - this.backgroundLayer; - - /* - * L.TileLayer.Grayscale is a regular tilelayer with grayscale makeover. - */ - + var self = this; + this.resourceType_point = "POINT"; + this.resourceType_line = "LINE"; + this.resourceType_polygon = "POLYGON"; + //leaflet map instance + this.map; + this.layerControl; + // layer holding the editable feature + this.featureLayer; + this.drawControl; + this.geosearchControl; + // backgroundLayer + this.backgroundLayer; + /* + * L.TileLayer.Grayscale is a regular tilelayer with grayscale makeover. + */ L.TileLayer.Grayscale = L.TileLayer.extend({ - options: { - quotaRed: 21, - quotaGreen: 71, - quotaBlue: 8, - quotaDividerTune: 0, - quotaDivider: function () { - return this.quotaRed + this.quotaGreen + this.quotaBlue + this.quotaDividerTune; + options: { + quotaRed: 21, + quotaGreen: 71, + quotaBlue: 8, + quotaDividerTune: 0, + quotaDivider: function () { + return this.quotaRed + this.quotaGreen + this.quotaBlue + this.quotaDividerTune; + } + }, + initialize: function (url, options) { + options = options || {}; + options.crossOrigin = true; + L.TileLayer.prototype.initialize.call(this, url, options); + this.on('tileload', function (e) { + this._makeGrayscale(e.tile); + }); + }, + _createTile: function () { + var tile = L.TileLayer.prototype._createTile.call(this); + tile.crossOrigin = "Anonymous"; + return tile; + }, + _makeGrayscale: function (img) { + if (img.getAttribute('data-grayscaled')) + return; + img.crossOrigin = ''; + var canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + var imgd = ctx.getImageData(0, 0, canvas.width, canvas.height); + var pix = imgd.data; + for (var i = 0, n = pix.length; i < n; i += 4) { + pix[i] = pix[i + 1] = pix[i + 2] = (this.options.quotaRed * pix[i] + this.options.quotaGreen * pix[i + 1] + this.options.quotaBlue * pix[i + 2]) / this.options.quotaDivider(); + } + ctx.putImageData(imgd, 0, 0); + img.setAttribute('data-grayscaled', true); + img.src = canvas.toDataURL(); + } + }); + this.invalidateMap = function () { + if (this.map) { + // just wait a bit in order to ensure that map element is visible to make invalidateSize actually work + $timeout(function () { + self.map.invalidateSize(true); + }, 500); + } + }; + this.zoomToDataLayer = function () { + if (this.map && this.dataLayer) { + // just wait a bit in order to ensure that map element is visible to make invalidateSize actually work + $timeout(function () { + self.map.fitBounds(self.dataLayer.getBounds()); + }, 750); + } + }; + this.initSingleFeatureGeoMap = function (domId, resourceType) { + // init leaflet map + // add geometry editing tool for the respective RESOURCE TYPE + // add geocoding plugin if it is POINT resource + // register events that broadcast new geometry to other components + if (this.map) { + this.map.off(); + this.map.remove(); + // var domNode = document.getElementById(domId); + // while (domNode.hasChildNodes()) { + // domNode.removeChild(domNode.lastChild); + // } } - }, - - initialize: function (url, options) { - options = options || {}; - options.crossOrigin = true; - L.TileLayer.prototype.initialize.call(this, url, options); - - this.on('tileload', function (e) { - this._makeGrayscale(e.tile); + // backgroundLayer + this.backgroundLayer = new L.TileLayer.Grayscale("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { minZoom: __env.minZoomLevel, maxZoom: __env.maxZoomLevel, attribution: "Map data © OpenStreetMap contributors" }); + this.map = L.map(domId, { + center: [__env.initialLatitude, __env.initialLongitude], + zoom: __env.initialZoomLevel, + zoomDelta: 0.5, + zoomSnap: 0.5, + layers: [this.backgroundLayer] }); - }, - - _createTile: function () { - var tile = L.TileLayer.prototype._createTile.call(this); - tile.crossOrigin = "Anonymous"; - return tile; - }, - - _makeGrayscale: function (img) { - if (img.getAttribute('data-grayscaled')) - return; - - img.crossOrigin = ''; - var canvas = document.createElement("canvas"); - canvas.width = img.width; - canvas.height = img.height; - var ctx = canvas.getContext("2d"); - ctx.drawImage(img, 0, 0); - - var imgd = ctx.getImageData(0, 0, canvas.width, canvas.height); - var pix = imgd.data; - for (var i = 0, n = pix.length; i < n; i += 4) { - pix[i] = pix[i + 1] = pix[i + 2] = (this.options.quotaRed * pix[i] + this.options.quotaGreen * pix[i + 1] + this.options.quotaBlue * pix[i + 2]) / this.options.quotaDivider(); + L.control.scale().addTo(this.map); + // this.initLayerControl(); + if (resourceType == this.resourceType_point) { + this.initGeosearchControl(); } - ctx.putImageData(imgd, 0, 0); - img.setAttribute('data-grayscaled', true); - img.src = canvas.toDataURL(); - } - }); - - this.invalidateMap = function(){ - if (this.map){ - // just wait a bit in order to ensure that map element is visible to make invalidateSize actually work - $timeout(function(){ - self.map.invalidateSize(true); - }, 500); - } - }; - - this.zoomToDataLayer = function(){ - if (this.map && this.dataLayer){ - // just wait a bit in order to ensure that map element is visible to make invalidateSize actually work - $timeout(function(){ - self.map.fitBounds(self.dataLayer.getBounds()); - }, 750); - } - }; - - this.initSingleFeatureGeoMap = function(domId, resourceType){ - // init leaflet map - - // add geometry editing tool for the respective RESOURCE TYPE - - // add geocoding plugin if it is POINT resource - - // register events that broadcast new geometry to other components - - if(this.map){ - this.map.off(); - this.map.remove(); - - // var domNode = document.getElementById(domId); - - // while (domNode.hasChildNodes()) { - // domNode.removeChild(domNode.lastChild); - // } - } - - // backgroundLayer - this.backgroundLayer = new L.TileLayer.Grayscale("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { minZoom: __env.minZoomLevel, maxZoom: __env.maxZoomLevel, attribution: "Map data © OpenStreetMap contributors" }); - - this.map = L.map(domId, { - center: [__env.initialLatitude, __env.initialLongitude], - zoom: __env.initialZoomLevel, - zoomDelta: 0.5, - zoomSnap: 0.5, - layers: [this.backgroundLayer] - }); - - L.control.scale().addTo(this.map); - - // this.initLayerControl(); - - if(resourceType == this.resourceType_point){ - this.initGeosearchControl(); - } - - this.initDrawControl(resourceType); - - this.invalidateMap(); - }; - - this.initLayerControl = function(){ - let baseLayers = { - "OpenStreetMap Graustufen": this.backgroundLayer + this.initDrawControl(resourceType); + this.invalidateMap(); }; - let overlays = {}; - - this.layerControl = L.control.layers(baseLayers, overlays, {position: "topleft"}).addTo(this.map); - }; - - this.initGeosearchControl = function(){ - ///////////////////////////////////////////////////// - ///// LEAFLET GEOSEARCH SETUP - ///////////////////////////////////////////////////// - var GeoSearchControl = window.GeoSearch.GeoSearchControl; - var OpenStreetMapProvider = window.GeoSearch.OpenStreetMapProvider; - - // remaining is the same as in the docs, accept for the var instead of const declarations - var provider = new OpenStreetMapProvider( - { - params: { - 'accept-language': 'de', // render results in Dutch - countrycodes: 'de', // limit search results to the Netherlands - addressdetails: 1, // include additional address detail parts - viewbox: "" + (Number(__env.initialLongitude) - 0.001) + "," + (Number(__env.initialLatitude) - 0.001) + "," + (Number(__env.initialLongitude) + 0.001) + "," + (Number(__env.initialLatitude) + 0.001) - }, - searchUrl: __env.targetUrlToGeocoderService + '/search', - reverseUrl: __env.targetUrlToGeocoderService + '/reverse' - } - ); - - console.log(provider); - - this.geosearchControl = new GeoSearchControl({ - position: "topright", - provider: provider, - style: 'button', - autoComplete: true, - autoCompleteDelay: 250, - showMarker: false, // optional: true|false - default true - showPopup: false, // optional: true|false - default false - marker: { // optional: L.Marker - default L.Icon.Default - icon: new L.Icon.Default(), - draggable: false, - }, - popupFormat: ({ query, result }) => result.label, // optional: function - default returns result label - maxMarkers: 1, // optional: number - default 1 - retainZoomLevel: false, // optional: true|false - default false - animateZoom: true, // optional: true|false - default true - autoClose: false, // optional: true|false - default false - searchLabel: 'Suche nach Adressen ...', // optional: string - default 'Enter address' - keepResult: false // optional: true|false - default false - }); - - this.map.addControl(this.geosearchControl); - // this.map.on('geosearch/showlocation', function(event){ - // console.log(event); - // let geoJSON = { - // type: "Feature", - // geometry: { - // type: "Point", - // coordinates: [event.x, event.y] - // }, - // properties: { - - // } - // }; - // $rootScope.$broadcast("onUpdateSingleFeatureGeometry", geoJSON); - // }); - }; - - this.initDrawControlOptions = function(resourceType, enableDrawToolbar){ - let options = { - edit: { - featureGroup: this.featureLayer - }, - position: 'bottomright' + this.initLayerControl = function () { + let baseLayers = { + "OpenStreetMap Graustufen": this.backgroundLayer + }; + let overlays = {}; + this.layerControl = L.control.layers(baseLayers, overlays, { position: "topleft" }).addTo(this.map); }; - - if(enableDrawToolbar){ - options.draw = { - polyline: resourceType == this.resourceType_line ? true : false, - polygon: resourceType == this.resourceType_polygon ? true : false, - rectangle: false, - circle: false, - circlemarker: false, - marker: resourceType == this.resourceType_point ? true : false - }; - } - else{ - options.draw = false; - } - - return options; - }; - - this.initDrawControl = function(resourceType){ - // FeatureGroup is to store editable layers - this.featureLayer = new L.FeatureGroup(); - - L.drawLocal = { - edit: { - toolbar: { - actions: { - save: { - title: "Bearbeitung speichern.", - text: "Speichern", - }, - cancel: { - title: "Bearbeitung verwerfen.", - text: "Abbrechen", + this.initGeosearchControl = function () { + ///////////////////////////////////////////////////// + ///// LEAFLET GEOSEARCH SETUP + ///////////////////////////////////////////////////// + var GeoSearchControl = window.GeoSearch.GeoSearchControl; + var OpenStreetMapProvider = window.GeoSearch.OpenStreetMapProvider; + // remaining is the same as in the docs, accept for the var instead of const declarations + var provider = new OpenStreetMapProvider({ + params: { + 'accept-language': 'de', + countrycodes: 'de', + addressdetails: 1, + viewbox: "" + (Number(__env.initialLongitude) - 0.001) + "," + (Number(__env.initialLatitude) - 0.001) + "," + (Number(__env.initialLongitude) + 0.001) + "," + (Number(__env.initialLatitude) + 0.001) }, - clearAll: { - title: "Alle Features entfernen.", - text: "Alle Features entfernen", - }, - }, - buttons: { - edit: "Layer editieren.", - editDisabled: "Keine Layer zum editieren vorhanden.", - remove: "Layer entfernen.", - removeDisabled: "Keine Layer zum entfernen vorhanden.", - }, - }, - handlers: { - edit: { - tooltip: { - text: "Bearbeitungspunkte oder Punktmarker ziehen, um Feature zu editieren.", - subtext: "Abbrechen klicken, um Bearbeitung zu verwefen.", + searchUrl: __env.targetUrlToGeocoderService + '/search', + reverseUrl: __env.targetUrlToGeocoderService + '/reverse' + }); + console.log(provider); + this.geosearchControl = new GeoSearchControl({ + position: "topright", + provider: provider, + style: 'button', + autoComplete: true, + autoCompleteDelay: 250, + showMarker: false, + showPopup: false, + marker: { + icon: new L.Icon.Default(), + draggable: false, }, - }, - remove: { - tooltip: { - text: "Feature anklicken, um es zu entfernen", + popupFormat: ({ query, result }) => result.label, + maxMarkers: 1, + retainZoomLevel: false, + animateZoom: true, + autoClose: false, + searchLabel: 'Suche nach Adressen ...', + keepResult: false // optional: true|false - default false + }); + this.map.addControl(this.geosearchControl); + // this.map.on('geosearch/showlocation', function(event){ + // console.log(event); + // let geoJSON = { + // type: "Feature", + // geometry: { + // type: "Point", + // coordinates: [event.x, event.y] + // }, + // properties: { + // } + // }; + // $rootScope.$broadcast("onUpdateSingleFeatureGeometry", geoJSON); + // }); + }; + this.initDrawControlOptions = function (resourceType, enableDrawToolbar) { + let options = { + edit: { + featureGroup: this.featureLayer }, - }, + position: 'bottomright' + }; + if (enableDrawToolbar) { + options.draw = { + polyline: resourceType == this.resourceType_line ? true : false, + polygon: resourceType == this.resourceType_polygon ? true : false, + rectangle: false, + circle: false, + circlemarker: false, + marker: resourceType == this.resourceType_point ? true : false + }; } - }, - draw: { - toolbar: { - actions: { - title: "Zeichnen abbrechen", - text: "Abbrechen", - }, - finish: { - title: "Zeichnen beenden", - text: "Beenden", - }, - undo: { - title: "Zuletzt gezeichneten Punkt entfernen", - text: "Letzten Punkt entfernen", - }, - buttons: { - polyline: "Polylinie zeichnen", - polygon: "Polygon zeichnen", - rectangle: "Rechteck zeichnen", - circle: "Kreis zeichnen", - marker: "Punkt zeichnen", - circlemarker: "Kreispunkt zeichnen", - }, - }, - handlers: { - circle: { - tooltip: { - start: "Klicken und halten, um Kreis zu zeichnen.", - }, - radius: "Radius", - }, - circlemarker: { - tooltip: { - start: "Klicken, um einen Punkt zu markieren.", - }, - }, - marker: { - tooltip: { - start: "Klicken, um einen Punkt zu markieren.", - }, - }, - polygon: { - tooltip: { - start: "Klicken, um ein Polygon zu beginnen.", - cont: "Klicken, um das Polygon weiter zu zeichnen.", - end: "Ersten Punkt anklicken, um Polygon zu beenden.", - }, - }, - polyline: { - error: "Fehler: Selbstueberschneidung!", - tooltip: { - start: "Klicken, um eine Polylinie zu beginnen.", - cont: "Klicken, um die Polylinie weiter zu zeichnen.", - end: "Letzten Punkt erneut anklicken, um Polylinie zu beenden.", - }, - }, - rectangle: { - tooltip: { - start: "Klicken und halten, um Rechteck zu zeichnen.", - }, - }, - simpleshape: { - tooltip: { - end: "Maus loslassen, um Zeichnung zu beenden.", + else { + options.draw = false; + } + return options; + }; + this.initDrawControl = function (resourceType) { + // FeatureGroup is to store editable layers + this.featureLayer = new L.FeatureGroup(); + L.drawLocal = { + edit: { + toolbar: { + actions: { + save: { + title: "Bearbeitung speichern.", + text: "Speichern", + }, + cancel: { + title: "Bearbeitung verwerfen.", + text: "Abbrechen", + }, + clearAll: { + title: "Alle Features entfernen.", + text: "Alle Features entfernen", + }, + }, + buttons: { + edit: "Layer editieren.", + editDisabled: "Keine Layer zum editieren vorhanden.", + remove: "Layer entfernen.", + removeDisabled: "Keine Layer zum entfernen vorhanden.", + }, + }, + handlers: { + edit: { + tooltip: { + text: "Bearbeitungspunkte oder Punktmarker ziehen, um Feature zu editieren.", + subtext: "Abbrechen klicken, um Bearbeitung zu verwefen.", + }, + }, + remove: { + tooltip: { + text: "Feature anklicken, um es zu entfernen", + }, + }, + } }, - }, + draw: { + toolbar: { + actions: { + title: "Zeichnen abbrechen", + text: "Abbrechen", + }, + finish: { + title: "Zeichnen beenden", + text: "Beenden", + }, + undo: { + title: "Zuletzt gezeichneten Punkt entfernen", + text: "Letzten Punkt entfernen", + }, + buttons: { + polyline: "Polylinie zeichnen", + polygon: "Polygon zeichnen", + rectangle: "Rechteck zeichnen", + circle: "Kreis zeichnen", + marker: "Punkt zeichnen", + circlemarker: "Kreispunkt zeichnen", + }, + }, + handlers: { + circle: { + tooltip: { + start: "Klicken und halten, um Kreis zu zeichnen.", + }, + radius: "Radius", + }, + circlemarker: { + tooltip: { + start: "Klicken, um einen Punkt zu markieren.", + }, + }, + marker: { + tooltip: { + start: "Klicken, um einen Punkt zu markieren.", + }, + }, + polygon: { + tooltip: { + start: "Klicken, um ein Polygon zu beginnen.", + cont: "Klicken, um das Polygon weiter zu zeichnen.", + end: "Ersten Punkt anklicken, um Polygon zu beenden.", + }, + }, + polyline: { + error: "Fehler: Selbstueberschneidung!", + tooltip: { + start: "Klicken, um eine Polylinie zu beginnen.", + cont: "Klicken, um die Polylinie weiter zu zeichnen.", + end: "Letzten Punkt erneut anklicken, um Polylinie zu beenden.", + }, + }, + rectangle: { + tooltip: { + start: "Klicken und halten, um Rechteck zu zeichnen.", + }, + }, + simpleshape: { + tooltip: { + end: "Maus loslassen, um Zeichnung zu beenden.", + }, + }, + } + } + }; + this.map.addLayer(this.featureLayer); + this.drawControlOptions = this.initDrawControlOptions(resourceType, true); + this.drawControl = new L.Control.Draw(this.drawControlOptions); + this.map.addControl(this.drawControl); + this.map.on(L.Draw.Event.CREATED, function (event) { + var layer = event.layer; + self.featureLayer.addLayer(layer); + // disable draw tools + self.map.removeControl(self.drawControl); + self.drawControl = new L.Control.Draw(self.initDrawControlOptions(resourceType, false)); + self.map.addControl(self.drawControl); + $rootScope.$broadcast("onUpdateSingleFeatureGeometry", self.featureLayer.toGeoJSON()); + }); + this.map.on(L.Draw.Event.EDITED, function (event) { + $rootScope.$broadcast("onUpdateSingleFeatureGeometry", self.featureLayer.toGeoJSON()); + }); + this.map.on(L.Draw.Event.DELETED, function (event) { + // reinit featureGroupLayer + self.featureLayer = new L.FeatureGroup(); + // enable draw tools + self.map.removeControl(self.drawControl); + self.drawControl = new L.Control.Draw(self.initDrawControlOptions(resourceType, true)); + self.map.addControl(self.drawControl); + $rootScope.$broadcast("onUpdateSingleFeatureGeometry", undefined); + }); + }; + /** + * binds the popup of a clicked output + * to layer.feature.properties.popupContent + */ + this.onEachFeatureGeoresource = function (feature, layer) { + layer.on({ + click: function () { + var popupContent = '
        '; + for (var p in feature.properties) { + popupContent += ''; + } + popupContent += '
        ' + p + '' + feature.properties[p] + '
        '; + layer.bindPopup(popupContent); + } + }); + }; + this.addDataLayertoSingleFeatureGeoMap = function (geoJSON) { + if (this.map) { + this.dataLayer = L.geoJSON(geoJSON, { + pointToLayer: function (geoJsonPoint, latlng) { + return L.circleMarker(latlng, { + radius: 6 + }); + }, + style: function (feature) { + return { + color: "red", + weight: 1, + opacity: 1 + }; + }, + onEachFeature: self.onEachFeatureGeoresource + }); + // this.layerControl.addOverlay(this.dataLayer, "weitere Objekte des Datensatzes"); + this.dataLayer.addTo(this.map); + this.map.fitBounds(this.dataLayer.getBounds()); + this.invalidateMap(); } - } - }; - - this.map.addLayer(this.featureLayer); - this.drawControlOptions = this.initDrawControlOptions(resourceType, true); - this.drawControl = new L.Control.Draw(this.drawControlOptions); - - this.map.addControl(this.drawControl); - - this.map.on(L.Draw.Event.CREATED, function (event) { - var layer = event.layer; - - self.featureLayer.addLayer(layer); - - // disable draw tools - self.map.removeControl(self.drawControl); - self.drawControl = new L.Control.Draw(self.initDrawControlOptions(resourceType, false)); - self.map.addControl(self.drawControl); - - $rootScope.$broadcast("onUpdateSingleFeatureGeometry", self.featureLayer.toGeoJSON()); - }); - - this.map.on(L.Draw.Event.EDITED, function (event) { - - $rootScope.$broadcast("onUpdateSingleFeatureGeometry", self.featureLayer.toGeoJSON()); - }); - - this.map.on(L.Draw.Event.DELETED, function (event) { - - // reinit featureGroupLayer - self.featureLayer = new L.FeatureGroup(); - - // enable draw tools - self.map.removeControl(self.drawControl); - self.drawControl = new L.Control.Draw(self.initDrawControlOptions(resourceType, true)); - self.map.addControl(self.drawControl); - - $rootScope.$broadcast("onUpdateSingleFeatureGeometry", undefined); - }); - }; - - /** - * binds the popup of a clicked output - * to layer.feature.properties.popupContent - */ - this.onEachFeatureGeoresource = function(feature, layer) { - layer.on({ - click: function () { - - var popupContent = '
        '; - for (var p in feature.properties) { - popupContent += ''; - } - popupContent += '
        ' + p + ''+ feature.properties[p] + '
        '; - - layer.bindPopup(popupContent); - } - }); - }; - - this.addDataLayertoSingleFeatureGeoMap = function(geoJSON){ - if(this.map){ - this.dataLayer = L.geoJSON(geoJSON, { - pointToLayer: function(geoJsonPoint, latlng) { - return L.circleMarker(latlng, { - radius: 6 - }); - }, - style: function (feature) { - return { - color: "red", - weight: 1, - opacity: 1 - }; - }, - onEachFeature: self.onEachFeatureGeoresource - }); - - // this.layerControl.addOverlay(this.dataLayer, "weitere Objekte des Datensatzes"); - this.dataLayer.addTo(this.map); - this.map.fitBounds(this.dataLayer.getBounds()); - this.invalidateMap(); - } - }; - - }]); +//# sourceMappingURL=kommonitor-single-feature-map-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorSingleFeatureMapHelperService/kommonitor-single-feature-map-helper-service.module.js.map b/app/util/genericServices/kommonitorSingleFeatureMapHelperService/kommonitor-single-feature-map-helper-service.module.js.map new file mode 100644 index 000000000..765081bd8 --- /dev/null +++ b/app/util/genericServices/kommonitorSingleFeatureMapHelperService/kommonitor-single-feature-map-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-single-feature-map-helper-service.module.js","sourceRoot":"","sources":["kommonitor-single-feature-map-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/app/util/genericServices/kommonitorVisualStyleHelperService/kommonitor-visual-style-helper-service.module.js b/app/util/genericServices/kommonitorVisualStyleHelperService/kommonitor-visual-style-helper-service.module.js index 158544890..7cbd45f02 100644 --- a/app/util/genericServices/kommonitorVisualStyleHelperService/kommonitor-visual-style-helper-service.module.js +++ b/app/util/genericServices/kommonitorVisualStyleHelperService/kommonitor-visual-style-helper-service.module.js @@ -1,5 +1,5 @@ +"use strict"; angular.module('kommonitorVisualStyleHelper', ['kommonitorDataExchange']); - /** * a common serviceInstance that holds all needed properties for a WPS service. * @@ -10,559 +10,470 @@ angular.module('kommonitorVisualStyleHelper', ['kommonitorDataExchange']); * parameters for each WPS operation represented by different Angular components */ angular - .module('kommonitorVisualStyleHelper', []) - .service( - 'kommonitorVisualStyleHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', - function ($rootScope, $timeout, - kommonitorDataExchangeService, $http, __env) { - - const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; - - this.defaultBrew = undefined; - this.measureOfValueBrew = undefined; - this.dynamicBrew = undefined; - - //allowesValues: equal_interval, quantile, jenks - this.classifyMethods = [{ - name: "Jenks", - value: "jenks" - }, { - name: "Gleiches Intervall", - value: "equal_interval" - }, { - name: "Quantile", - value: "quantile" - }]; - - this.classifyMethod = __env.defaultClassifyMethod || "jenks"; - - this.isCustomComputation = false; - - const numberOfDecimals = __env.numberOfDecimals; - var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; - var defaultBorderColorForFilteredValues = __env.defaultBorderColorForFilteredValues; - var defaultBorderColor = __env.defaultBorderColor; - var defaultFillOpacity = __env.defaultFillOpacity; - var defaultFillOpacityForFilteredFeatures = __env.defaultFillOpacityForFilteredFeatures; - var defaultFillOpacityForHighlightedFeatures = __env.defaultFillOpacityForHighlightedFeatures; - var defaultFillOpacityForZeroFeatures = __env.defaultFillOpacityForZeroFeatures; - var defaultColorBrewerPaletteForBalanceIncreasingValues = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; - var defaultColorBrewerPaletteForBalanceDecreasingValues = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; - var defaultColorBrewerPaletteForGtMovValues = __env.defaultColorBrewerPaletteForGtMovValues; - var defaultColorBrewerPaletteForLtMovValues = __env.defaultColorBrewerPaletteForLtMovValues; - var defaultColorForHoveredFeatures = __env.defaultColorForHoveredFeatures; - var defaultColorForClickedFeatures = __env.defaultColorForClickedFeatures; - var defaultBorderColorForNoDataValues = __env.defaultBorderColorForNoDataValues; - var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; - var defaultFillOpacityForNoDataValues = __env.defaultFillOpacityForNoDataValues; - - this.indicatorTransparency = 1 - __env.defaultFillOpacity; - this.currentIndicatorOpacity = __env.defaultFillOpacity; - - var defaultColorForZeroValues = __env.defaultColorForZeroValues; - - - var defaultColorForOutliers_high = __env.defaultColorForOutliers_high; - var defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; - var defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; - var defaultColorForOutliers_low = __env.defaultColorForOutliers_low; - var defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; - var defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; - var useOutlierDetectionOnIndicator = __env.useOutlierDetectionOnIndicator; - - const outlierPropertyName = "outlier"; - const outlierPropertyValue_high_soft = "high-soft"; - const outlierPropertyValue_low_soft = "low-soft"; - const outlierPropertyValue_high_extreme = "high-extreme"; - const outlierPropertyValue_low_extreme = "low-extreme"; - const outlierPropertyValue_no = "no"; - - this.outlierFillPattern_low = new L.StripePattern({ weight: 1, spaceweight: 1, patternTransform: "rotate(45)" }); - - this.outlierFillPattern_high = new L.StripePattern({ weight: 1, spaceweight: 1, patternTransform: "rotate(-45)" }); - - var shape = new L.PatternCircle({ - x: 5, - y: 5, - radius: 1, - fill: true, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultColorForNoDataValues - }); - this.noDataFillPattern = new L.Pattern({ width: 8, height: 8 }); - this.noDataFillPattern.addShape(shape); - - var outliers_high = undefined; - var outliers_low = undefined; - - this.outlierStyle_high = { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColorForOutliers_high, - dashArray: '', - fillOpacity: defaultFillOpacityForOutliers_high, - fillColor: defaultColorForOutliers_high, - fillPattern: this.outlierFillPattern_high - }; - - this.outlierStyle_low = { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColorForOutliers_low, - dashArray: '', - fillOpacity: defaultFillOpacityForOutliers_low, - fillColor: defaultColorForOutliers_low, - fillPattern: this.outlierFillPattern_low - }; - - this.noDataStyle = { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColorForNoDataValues, - dashArray: '', - fillOpacity: defaultFillOpacityForNoDataValues, - fillColor: defaultColorForNoDataValues, - // fillPattern: this.noDataFillPattern - }; - - this.filteredStyle = { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColorForFilteredValues, - dashArray: '', - fillOpacity: defaultFillOpacityForFilteredFeatures, - fillColor: defaultColorForFilteredValues - }; - - this.featuresPerColorMap = new Map(); - this.featuresPerNoData = 0; - this.featuresPerZero = 0; - this.featuresPerOutlierHigh = 0; - this.featuresPerOutlierLow = 0; - - this.resetFeaturesPerColorObjects = function(){ + .module('kommonitorVisualStyleHelper', []) + .service('kommonitorVisualStyleHelperService', ['$rootScope', '$timeout', 'kommonitorDataExchangeService', '$http', '__env', + function ($rootScope, $timeout, kommonitorDataExchangeService, $http, __env) { + const INDICATOR_DATE_PREFIX = __env.indicatorDatePrefix; + this.defaultBrew = undefined; + this.measureOfValueBrew = undefined; + this.dynamicBrew = undefined; + //allowesValues: equal_interval, quantile, jenks + this.classifyMethods = [{ + name: "Jenks", + value: "jenks" + }, { + name: "Gleiches Intervall", + value: "equal_interval" + }, { + name: "Quantile", + value: "quantile" + }]; + this.classifyMethod = __env.defaultClassifyMethod || "jenks"; + this.isCustomComputation = false; + const numberOfDecimals = __env.numberOfDecimals; + var defaultColorForFilteredValues = __env.defaultColorForFilteredValues; + var defaultBorderColorForFilteredValues = __env.defaultBorderColorForFilteredValues; + var defaultBorderColor = __env.defaultBorderColor; + var defaultFillOpacity = __env.defaultFillOpacity; + var defaultFillOpacityForFilteredFeatures = __env.defaultFillOpacityForFilteredFeatures; + var defaultFillOpacityForHighlightedFeatures = __env.defaultFillOpacityForHighlightedFeatures; + var defaultFillOpacityForZeroFeatures = __env.defaultFillOpacityForZeroFeatures; + var defaultColorBrewerPaletteForBalanceIncreasingValues = __env.defaultColorBrewerPaletteForBalanceIncreasingValues; + var defaultColorBrewerPaletteForBalanceDecreasingValues = __env.defaultColorBrewerPaletteForBalanceDecreasingValues; + var defaultColorBrewerPaletteForGtMovValues = __env.defaultColorBrewerPaletteForGtMovValues; + var defaultColorBrewerPaletteForLtMovValues = __env.defaultColorBrewerPaletteForLtMovValues; + var defaultColorForHoveredFeatures = __env.defaultColorForHoveredFeatures; + var defaultColorForClickedFeatures = __env.defaultColorForClickedFeatures; + var defaultBorderColorForNoDataValues = __env.defaultBorderColorForNoDataValues; + var defaultColorForNoDataValues = __env.defaultColorForNoDataValues; + var defaultFillOpacityForNoDataValues = __env.defaultFillOpacityForNoDataValues; + this.indicatorTransparency = 1 - __env.defaultFillOpacity; + this.currentIndicatorOpacity = __env.defaultFillOpacity; + var defaultColorForZeroValues = __env.defaultColorForZeroValues; + var defaultColorForOutliers_high = __env.defaultColorForOutliers_high; + var defaultBorderColorForOutliers_high = __env.defaultBorderColorForOutliers_high; + var defaultFillOpacityForOutliers_high = __env.defaultFillOpacityForOutliers_high; + var defaultColorForOutliers_low = __env.defaultColorForOutliers_low; + var defaultBorderColorForOutliers_low = __env.defaultBorderColorForOutliers_low; + var defaultFillOpacityForOutliers_low = __env.defaultFillOpacityForOutliers_low; + var useOutlierDetectionOnIndicator = __env.useOutlierDetectionOnIndicator; + const outlierPropertyName = "outlier"; + const outlierPropertyValue_high_soft = "high-soft"; + const outlierPropertyValue_low_soft = "low-soft"; + const outlierPropertyValue_high_extreme = "high-extreme"; + const outlierPropertyValue_low_extreme = "low-extreme"; + const outlierPropertyValue_no = "no"; + this.outlierFillPattern_low = new L.StripePattern({ weight: 1, spaceweight: 1, patternTransform: "rotate(45)" }); + this.outlierFillPattern_high = new L.StripePattern({ weight: 1, spaceweight: 1, patternTransform: "rotate(-45)" }); + var shape = new L.PatternCircle({ + x: 5, + y: 5, + radius: 1, + fill: true, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultColorForNoDataValues + }); + this.noDataFillPattern = new L.Pattern({ width: 8, height: 8 }); + this.noDataFillPattern.addShape(shape); + var outliers_high = undefined; + var outliers_low = undefined; + this.outlierStyle_high = { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColorForOutliers_high, + dashArray: '', + fillOpacity: defaultFillOpacityForOutliers_high, + fillColor: defaultColorForOutliers_high, + fillPattern: this.outlierFillPattern_high + }; + this.outlierStyle_low = { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColorForOutliers_low, + dashArray: '', + fillOpacity: defaultFillOpacityForOutliers_low, + fillColor: defaultColorForOutliers_low, + fillPattern: this.outlierFillPattern_low + }; + this.noDataStyle = { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColorForNoDataValues, + dashArray: '', + fillOpacity: defaultFillOpacityForNoDataValues, + fillColor: defaultColorForNoDataValues, + // fillPattern: this.noDataFillPattern + }; + this.filteredStyle = { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColorForFilteredValues, + dashArray: '', + fillOpacity: defaultFillOpacityForFilteredFeatures, + fillColor: defaultColorForFilteredValues + }; this.featuresPerColorMap = new Map(); this.featuresPerNoData = 0; this.featuresPerZero = 0; - this.featuresPerOutlierLow = 0; this.featuresPerOutlierHigh = 0; - }; - - this.incrementFeaturesPerColor = function(color){ - if(this.featuresPerColorMap.has(color)){ - this.featuresPerColorMap.set(color, this.featuresPerColorMap.get(color) + 1); - } - else{ - this.featuresPerColorMap.set(color, 1); - } - }; - - this.getFillColorForZero = function(){ - this.featuresPerZero ++; - return defaultColorForZeroValues; - }; - - this.setupDefaultBrew = function (geoJSON, propertyName, numClasses, colorCode, classifyMethod, forceProvidedIndicator, indicator) { - this.resetFeaturesPerColorObjects(); - - var values = new Array(); - - if(kommonitorDataExchangeService.classifyUsingWholeTimeseries){ - values = this.setupDefaultBrewValues_wholeTimeseries(geoJSON, values, forceProvidedIndicator, indicator); - } - else{ - values = this.setupDefaultBrewValues_singleTimestamp(geoJSON, propertyName, values); - } - - this.defaultBrew = setupClassyBrew_usingFeatureCount(values, colorCode, classifyMethod, numClasses); - return this.defaultBrew; - }; - - this.setupDefaultBrewValues_singleTimestamp = function(geoJSON, propertyName, values){ - for (var i = 0; i < geoJSON.features.length; i++) { - if (kommonitorDataExchangeService.indicatorValueIsNoData(geoJSON.features[i].properties[propertyName])) - continue; - - if(kommonitorDataExchangeService.classifyZeroSeparately && (geoJSON.features[i].properties[propertyName] == 0 || geoJSON.features[i].properties[propertyName] == "0")){ - continue; - } - - // check if is outlier, then do not use within classification, as it will be marked on map with special color - if (geoJSON.features[i].properties[outlierPropertyName] && geoJSON.features[i].properties[outlierPropertyName] !== outlierPropertyValue_no && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { - continue; - } - - if(! values.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))){ - values.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); - } - } - - return values; - }; - - this.setupDefaultBrewValues_wholeTimeseries = function(geoJSON, values, forceProvidedIndicator, indicator){ - var indicatorTimeSeriesDatesArray; - if(forceProvidedIndicator) { - indicatorTimeSeriesDatesArray = indicator.applicableDates; - } else { - indicatorTimeSeriesDatesArray = kommonitorDataExchangeService.selectedIndicator.applicableDates; - } - - - for (const date of indicatorTimeSeriesDatesArray) { - var propertyName = __env.indicatorDatePrefix + date; - values = this.setupDefaultBrewValues_singleTimestamp(geoJSON, propertyName, values); - } - - return values; - }; - - /** - * Returns and array of color brewer instances for greater and lesser than measure of value colors - * - * [gtMeasureOfValueBrew, ltMeasureOfValueBrew] - */ - this.setupMeasureOfValueBrew = function (geoJSON, propertyName, colorCodeForGreaterThanValues, colorCodeForLesserThanValues, classifyMethod, measureOfValue) { - - /* - * Idea: Analyse the complete geoJSON property array for each feature and make conclusion about how to build the legend - - e.g. if there are only positive values then display only positive values within 5 categories - same for only negative values - - e.g. if there are equally many positive as negative values then display both using 3 categories each - - e.g. if there are way more positive than negative values, then display both with 2 (negative) and 4 (positive) classes - - --> implement special cases (0, 1 or 2 negative/positive values --> apply colors manually) - --> treat all other cases equally to measureOfValue - */ - - this.resetFeaturesPerColorObjects(); - - this.greaterThanValues = []; - this.lesserThanValues = []; - - if(kommonitorDataExchangeService.classifyUsingWholeTimeseries){ - this.setupMovBrewValues_wholeTimeseries(geoJSON, measureOfValue); - } - else{ - this.setupMovBrewValues_singleTimestamp(geoJSON, propertyName, measureOfValue); - } - - var gtMeasureOfValueBrew = this.setupGtMeasureOfValueBrew(this.greaterThanValues, colorCodeForGreaterThanValues, classifyMethod); - var ltMeasureOfValueBrew = this.setupLtMeasureOfValueBrew(this.lesserThanValues, colorCodeForLesserThanValues, classifyMethod); - - this.measureOfValueBrew = [gtMeasureOfValueBrew, ltMeasureOfValueBrew]; - return this.measureOfValueBrew; - }; - - this.setupMovBrewValues_singleTimestamp = function(geoJSON, propertyName, measureOfValue){ - for (var i = 0; i < geoJSON.features.length; i++) { - - if (kommonitorDataExchangeService.indicatorValueIsNoData(geoJSON.features[i].properties[propertyName])) - continue; - - if(kommonitorDataExchangeService.classifyZeroSeparately && (geoJSON.features[i].properties[propertyName] == 0 || geoJSON.features[i].properties[propertyName] == "0")){ - continue; - } - - // check if is outlier, then do not use within classification, as it will be marked on map with special color - if (geoJSON.features[i].properties[outlierPropertyName] && geoJSON.features[i].properties[outlierPropertyName] !== outlierPropertyValue_no && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { - continue; - } - - else if (kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]) >= kommonitorDataExchangeService.getIndicatorValue_asNumber(measureOfValue)){ - if(! this.greaterThanValues.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))){ - this.greaterThanValues.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); - } - } - else{ - if(! this.lesserThanValues.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))){ - this.lesserThanValues.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); - } - } - } - }; - - this.setupMovBrewValues_wholeTimeseries = function(geoJSON, measureOfValue){ - var indicatorTimeSeriesDatesArray = kommonitorDataExchangeService.selectedIndicator.applicableDates; - - for (const date of indicatorTimeSeriesDatesArray) { - var propertyName = __env.indicatorDatePrefix + date; - this.setupMovBrewValues_singleTimestamp(geoJSON, propertyName, measureOfValue); - } - }; - - function setupClassyBrew_usingFeatureCount(valuesArray, colorCode, classifyMethod, maxNumberOfClasses){ - - var tempBrew = new classyBrew(); - var colorBrewerInstance = new classyBrew(); - - if (valuesArray.length >= 5) { - // pass array to our classyBrew series - tempBrew.setSeries(valuesArray); - // define number of classes - tempBrew.setNumClasses(maxNumberOfClasses); - // set color ramp code - tempBrew.setColorCode(colorCode); - // classify by passing in statistical method - // i.e. equal_interval, jenks, quantile - tempBrew.classify(classifyMethod); - - colorBrewerInstance.colors = tempBrew.getColors(); - colorBrewerInstance.breaks = tempBrew.getBreaks(); - } - - else if (valuesArray.length === 4) { - valuesArray.sort((a, b) => a - b); - - colorBrewerInstance.colors = tempBrew.colorSchemes[colorCode]['4']; - colorBrewerInstance.breaks = valuesArray; - } - - else if (valuesArray.length === 3) { - valuesArray.sort((a, b) => a - b); - - colorBrewerInstance.colors = tempBrew.colorSchemes[colorCode]['3']; - colorBrewerInstance.breaks = valuesArray; - } - else if (valuesArray.length === 2) { - valuesArray.sort((a, b) => a - b); - - colorBrewerInstance.colors = tempBrew.colorSchemes[colorCode]['3']; - colorBrewerInstance.breaks = valuesArray; - - colorBrewerInstance.colors.shift(); // remove first element of array - } - else if (valuesArray.length === 1) { - valuesArray.sort((a, b) => a - b); - - colorBrewerInstance.colors = tempBrew.colorSchemes[colorCode]['3']; - colorBrewerInstance.breaks = valuesArray; - - colorBrewerInstance.colors.shift(); // remove first element of array - colorBrewerInstance.colors.shift(); // remove first element of array - } - else { - // no positive values - colorBrewerInstance = undefined; - } - - // round values - if (colorBrewerInstance && colorBrewerInstance.breaks){ - for (let index = 0; index < colorBrewerInstance.breaks.length; index++) { - colorBrewerInstance.breaks[index] = kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewerInstance.breaks[index]); - } - } - - return colorBrewerInstance; - } - - this.setupGtMeasureOfValueBrew = function (greaterThanValues, colorCodeForGreaterThanValues, classifyMethod) { - - return setupClassyBrew_usingFeatureCount(greaterThanValues, colorCodeForGreaterThanValues, classifyMethod, 3); - - }; - - this.setupLtMeasureOfValueBrew = function (lesserThanValues, colorCodeForLesserThanValues, classifyMethod) { - - var brew = setupClassyBrew_usingFeatureCount(lesserThanValues, colorCodeForLesserThanValues, classifyMethod, 3); - if(brew && brew.colors && brew.colors.length > 1){ - brew.colors = brew.colors.reverse(); - } - return brew; - }; - - /** - * Returns and array of color brewer instances for dynamic increase and decrease colors - * - * [dynamicIncreaseBrew, dynamicDecreaseBrew] - */ - this.setupDynamicIndicatorBrew = function (geoJSON, propertyName, colorCodeForPositiveValues, colorCodeForNegativeValues, classifyMethod) { - - /* - * Idea: Analyse the complete geoJSON property array for each feature and make conclusion about how to build the legend - - e.g. if there are only positive values then display only positive values within 5 categories - same for only negative values - - e.g. if there are equally many positive as negative values then display both using 3 categories each - - e.g. if there are way more positive than negative values, then display both with 2 (negative) and 4 (positive) classes - - --> implement special cases (0, 1 or 2 negative/positive values --> apply colors manually) - --> treat all other cases equally to measureOfValue - */ - - this.resetFeaturesPerColorObjects(); - - this.positiveValues = []; - this.negativeValues = []; - - if(kommonitorDataExchangeService.classifyUsingWholeTimeseries){ - this.setupDynamicBrewValues_wholeTimeseries(geoJSON); - } - else{ - this.setupDynamicBrewValues_singleTimestamp(geoJSON, propertyName); - } - - var dynamicIncreaseBrew = setupDynamicIncreaseBrew(this.positiveValues, colorCodeForPositiveValues, classifyMethod); - var dynamicDecreaseBrew = setupDynamicDecreaseBrew(this.negativeValues, colorCodeForNegativeValues, classifyMethod); - - this.dynamicBrew = [dynamicIncreaseBrew, dynamicDecreaseBrew]; - return this.dynamicBrew; - }; - - this.setupDynamicBrewValues_wholeTimeseries = function(geoJSON){ - var indicatorTimeSeriesDatesArray = kommonitorDataExchangeService.selectedIndicator.applicableDates; - - for (const date of indicatorTimeSeriesDatesArray) { - var propertyName = __env.indicatorDatePrefix + date; - this.setupDynamicBrewValues_singleTimestamp(geoJSON, propertyName); - } - }; - - this.setupDynamicBrewValues_singleTimestamp = function(geoJSON, propertyName){ - for (var i = 0; i < geoJSON.features.length; i++) { - if (kommonitorDataExchangeService.indicatorValueIsNoData(geoJSON.features[i].properties[propertyName])) - continue; - - if(kommonitorDataExchangeService.classifyZeroSeparately && (geoJSON.features[i].properties[propertyName] == 0 || geoJSON.features[i].properties[propertyName] == "0")){ - continue; - } - - // check if is outlier, then do not use within classification, as it will be marked on map with special color - if (geoJSON.features[i].properties[outlierPropertyName] && geoJSON.features[i].properties[outlierPropertyName] !== outlierPropertyValue_no && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { - continue; - } - - else if (kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]) >= 0){ - if(! this.positiveValues.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))){ - this.positiveValues.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); - } - } - else if (kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]) < 0){ - if(! this.negativeValues.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))){ - this.negativeValues.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); - } - } - } - }; - - function setupDynamicIncreaseBrew(positiveValues, colorCodeForPositiveValues, classifyMethod) { - return setupClassyBrew_usingFeatureCount(positiveValues, colorCodeForPositiveValues, classifyMethod, 3); - } - - function setupDynamicDecreaseBrew(negativeValues, colorCodeForNegativeValues, classifyMethod) { - var brew = setupClassyBrew_usingFeatureCount(negativeValues, colorCodeForNegativeValues, classifyMethod, 3); - if(brew && brew.colors && brew.colors.length > 1){ - brew.colors = brew.colors.reverse(); - } - return brew; - } - - this.styleNoData = function(feature) { - this.featuresPerNoData ++; - return this.noDataStyle; - }; - - this.styleOutlier = function(feature) { - if ((feature.properties[outlierPropertyName] === outlierPropertyValue_low_soft) || (feature.properties[outlierPropertyName] === outlierPropertyValue_low_extreme)) { - - this.featuresPerOutlierLow ++; - return this.outlierStyle_low; - } - else { - - this.featuresPerOutlierHigh ++; - return this.outlierStyle_high; - } - }; - - this.getOpacity = function(opacity){ - - return defaultFillOpacity; - }; - - this.setOpacity = function(opacity){ - - opacity = Number(opacity); - this.indicatorTransparency = Number((1 - opacity).toFixed(numberOfDecimals)); - this.currentIndicatorOpacity = opacity; - - defaultFillOpacity = opacity; - defaultFillOpacityForOutliers_low = opacity; - defaultFillOpacityForOutliers_high = opacity; - defaultFillOpacityForZeroFeatures = opacity; - defaultFillOpacityForNoDataValues = opacity; - defaultFillOpacityForFilteredFeatures = opacity; - - $timeout(function(){ - $rootScope.$apply(); - }); - }; - - // style function to return - this.styleDefault = function(feature, defaultBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, propertyName, useTransparencyOnIndicator, datasetContainsNegativeValues) { - - // check if feature is NoData - if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[propertyName])) { - return this.styleNoData(feature); - } - - // check if feature is outlier - if ((feature.properties[outlierPropertyName] !== outlierPropertyValue_no) && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { - return this.styleOutlier(feature); + this.featuresPerOutlierLow = 0; + this.resetFeaturesPerColorObjects = function () { + this.featuresPerColorMap = new Map(); + this.featuresPerNoData = 0; + this.featuresPerZero = 0; + this.featuresPerOutlierLow = 0; + this.featuresPerOutlierHigh = 0; + }; + this.incrementFeaturesPerColor = function (color) { + if (this.featuresPerColorMap.has(color)) { + this.featuresPerColorMap.set(color, this.featuresPerColorMap.get(color) + 1); + } + else { + this.featuresPerColorMap.set(color, 1); + } + }; + this.getFillColorForZero = function () { + this.featuresPerZero++; + return defaultColorForZeroValues; + }; + this.setupDefaultBrew = function (geoJSON, propertyName, numClasses, colorCode, classifyMethod, forceProvidedIndicator, indicator) { + this.resetFeaturesPerColorObjects(); + var values = new Array(); + if (kommonitorDataExchangeService.classifyUsingWholeTimeseries) { + values = this.setupDefaultBrewValues_wholeTimeseries(geoJSON, values, forceProvidedIndicator, indicator); + } + else { + values = this.setupDefaultBrewValues_singleTimestamp(geoJSON, propertyName, values); + } + this.defaultBrew = setupClassyBrew_usingFeatureCount(values, colorCode, classifyMethod, numClasses); + return this.defaultBrew; + }; + this.setupDefaultBrewValues_singleTimestamp = function (geoJSON, propertyName, values) { + for (var i = 0; i < geoJSON.features.length; i++) { + if (kommonitorDataExchangeService.indicatorValueIsNoData(geoJSON.features[i].properties[propertyName])) + continue; + if (kommonitorDataExchangeService.classifyZeroSeparately && (geoJSON.features[i].properties[propertyName] == 0 || geoJSON.features[i].properties[propertyName] == "0")) { + continue; + } + // check if is outlier, then do not use within classification, as it will be marked on map with special color + if (geoJSON.features[i].properties[outlierPropertyName] && geoJSON.features[i].properties[outlierPropertyName] !== outlierPropertyValue_no && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { + continue; + } + if (!values.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))) { + values.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); + } + } + return values; + }; + this.setupDefaultBrewValues_wholeTimeseries = function (geoJSON, values, forceProvidedIndicator, indicator) { + var indicatorTimeSeriesDatesArray; + if (forceProvidedIndicator) { + indicatorTimeSeriesDatesArray = indicator.applicableDates; + } + else { + indicatorTimeSeriesDatesArray = kommonitorDataExchangeService.selectedIndicator.applicableDates; + } + for (const date of indicatorTimeSeriesDatesArray) { + var propertyName = __env.indicatorDatePrefix + date; + values = this.setupDefaultBrewValues_singleTimestamp(geoJSON, propertyName, values); + } + return values; + }; + /** + * Returns and array of color brewer instances for greater and lesser than measure of value colors + * + * [gtMeasureOfValueBrew, ltMeasureOfValueBrew] + */ + this.setupMeasureOfValueBrew = function (geoJSON, propertyName, colorCodeForGreaterThanValues, colorCodeForLesserThanValues, classifyMethod, measureOfValue) { + /* + * Idea: Analyse the complete geoJSON property array for each feature and make conclusion about how to build the legend + + e.g. if there are only positive values then display only positive values within 5 categories - same for only negative values + + e.g. if there are equally many positive as negative values then display both using 3 categories each + + e.g. if there are way more positive than negative values, then display both with 2 (negative) and 4 (positive) classes + + --> implement special cases (0, 1 or 2 negative/positive values --> apply colors manually) + --> treat all other cases equally to measureOfValue + */ + this.resetFeaturesPerColorObjects(); + this.greaterThanValues = []; + this.lesserThanValues = []; + if (kommonitorDataExchangeService.classifyUsingWholeTimeseries) { + this.setupMovBrewValues_wholeTimeseries(geoJSON, measureOfValue); + } + else { + this.setupMovBrewValues_singleTimestamp(geoJSON, propertyName, measureOfValue); + } + var gtMeasureOfValueBrew = this.setupGtMeasureOfValueBrew(this.greaterThanValues, colorCodeForGreaterThanValues, classifyMethod); + var ltMeasureOfValueBrew = this.setupLtMeasureOfValueBrew(this.lesserThanValues, colorCodeForLesserThanValues, classifyMethod); + this.measureOfValueBrew = [gtMeasureOfValueBrew, ltMeasureOfValueBrew]; + return this.measureOfValueBrew; + }; + this.setupMovBrewValues_singleTimestamp = function (geoJSON, propertyName, measureOfValue) { + for (var i = 0; i < geoJSON.features.length; i++) { + if (kommonitorDataExchangeService.indicatorValueIsNoData(geoJSON.features[i].properties[propertyName])) + continue; + if (kommonitorDataExchangeService.classifyZeroSeparately && (geoJSON.features[i].properties[propertyName] == 0 || geoJSON.features[i].properties[propertyName] == "0")) { + continue; + } + // check if is outlier, then do not use within classification, as it will be marked on map with special color + if (geoJSON.features[i].properties[outlierPropertyName] && geoJSON.features[i].properties[outlierPropertyName] !== outlierPropertyValue_no && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { + continue; + } + else if (kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]) >= kommonitorDataExchangeService.getIndicatorValue_asNumber(measureOfValue)) { + if (!this.greaterThanValues.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))) { + this.greaterThanValues.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); + } + } + else { + if (!this.lesserThanValues.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))) { + this.lesserThanValues.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); + } + } + } + }; + this.setupMovBrewValues_wholeTimeseries = function (geoJSON, measureOfValue) { + var indicatorTimeSeriesDatesArray = kommonitorDataExchangeService.selectedIndicator.applicableDates; + for (const date of indicatorTimeSeriesDatesArray) { + var propertyName = __env.indicatorDatePrefix + date; + this.setupMovBrewValues_singleTimestamp(geoJSON, propertyName, measureOfValue); + } + }; + function setupClassyBrew_usingFeatureCount(valuesArray, colorCode, classifyMethod, maxNumberOfClasses) { + var tempBrew = new classyBrew(); + var colorBrewerInstance = new classyBrew(); + if (valuesArray.length >= 5) { + // pass array to our classyBrew series + tempBrew.setSeries(valuesArray); + // define number of classes + tempBrew.setNumClasses(maxNumberOfClasses); + // set color ramp code + tempBrew.setColorCode(colorCode); + // classify by passing in statistical method + // i.e. equal_interval, jenks, quantile + tempBrew.classify(classifyMethod); + colorBrewerInstance.colors = tempBrew.getColors(); + colorBrewerInstance.breaks = tempBrew.getBreaks(); + } + else if (valuesArray.length === 4) { + valuesArray.sort((a, b) => a - b); + colorBrewerInstance.colors = tempBrew.colorSchemes[colorCode]['4']; + colorBrewerInstance.breaks = valuesArray; + } + else if (valuesArray.length === 3) { + valuesArray.sort((a, b) => a - b); + colorBrewerInstance.colors = tempBrew.colorSchemes[colorCode]['3']; + colorBrewerInstance.breaks = valuesArray; + } + else if (valuesArray.length === 2) { + valuesArray.sort((a, b) => a - b); + colorBrewerInstance.colors = tempBrew.colorSchemes[colorCode]['3']; + colorBrewerInstance.breaks = valuesArray; + colorBrewerInstance.colors.shift(); // remove first element of array + } + else if (valuesArray.length === 1) { + valuesArray.sort((a, b) => a - b); + colorBrewerInstance.colors = tempBrew.colorSchemes[colorCode]['3']; + colorBrewerInstance.breaks = valuesArray; + colorBrewerInstance.colors.shift(); // remove first element of array + colorBrewerInstance.colors.shift(); // remove first element of array + } + else { + // no positive values + colorBrewerInstance = undefined; + } + // round values + if (colorBrewerInstance && colorBrewerInstance.breaks) { + for (let index = 0; index < colorBrewerInstance.breaks.length; index++) { + colorBrewerInstance.breaks[index] = kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewerInstance.breaks[index]); + } + } + return colorBrewerInstance; } - - var fillOpacity = 1; - if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacity; + this.setupGtMeasureOfValueBrew = function (greaterThanValues, colorCodeForGreaterThanValues, classifyMethod) { + return setupClassyBrew_usingFeatureCount(greaterThanValues, colorCodeForGreaterThanValues, classifyMethod, 3); + }; + this.setupLtMeasureOfValueBrew = function (lesserThanValues, colorCodeForLesserThanValues, classifyMethod) { + var brew = setupClassyBrew_usingFeatureCount(lesserThanValues, colorCodeForLesserThanValues, classifyMethod, 3); + if (brew && brew.colors && brew.colors.length > 1) { + brew.colors = brew.colors.reverse(); + } + return brew; + }; + /** + * Returns and array of color brewer instances for dynamic increase and decrease colors + * + * [dynamicIncreaseBrew, dynamicDecreaseBrew] + */ + this.setupDynamicIndicatorBrew = function (geoJSON, propertyName, colorCodeForPositiveValues, colorCodeForNegativeValues, classifyMethod) { + /* + * Idea: Analyse the complete geoJSON property array for each feature and make conclusion about how to build the legend + + e.g. if there are only positive values then display only positive values within 5 categories - same for only negative values + + e.g. if there are equally many positive as negative values then display both using 3 categories each + + e.g. if there are way more positive than negative values, then display both with 2 (negative) and 4 (positive) classes + + --> implement special cases (0, 1 or 2 negative/positive values --> apply colors manually) + --> treat all other cases equally to measureOfValue + */ + this.resetFeaturesPerColorObjects(); + this.positiveValues = []; + this.negativeValues = []; + if (kommonitorDataExchangeService.classifyUsingWholeTimeseries) { + this.setupDynamicBrewValues_wholeTimeseries(geoJSON); + } + else { + this.setupDynamicBrewValues_singleTimestamp(geoJSON, propertyName); + } + var dynamicIncreaseBrew = setupDynamicIncreaseBrew(this.positiveValues, colorCodeForPositiveValues, classifyMethod); + var dynamicDecreaseBrew = setupDynamicDecreaseBrew(this.negativeValues, colorCodeForNegativeValues, classifyMethod); + this.dynamicBrew = [dynamicIncreaseBrew, dynamicDecreaseBrew]; + return this.dynamicBrew; + }; + this.setupDynamicBrewValues_wholeTimeseries = function (geoJSON) { + var indicatorTimeSeriesDatesArray = kommonitorDataExchangeService.selectedIndicator.applicableDates; + for (const date of indicatorTimeSeriesDatesArray) { + var propertyName = __env.indicatorDatePrefix + date; + this.setupDynamicBrewValues_singleTimestamp(geoJSON, propertyName); + } + }; + this.setupDynamicBrewValues_singleTimestamp = function (geoJSON, propertyName) { + for (var i = 0; i < geoJSON.features.length; i++) { + if (kommonitorDataExchangeService.indicatorValueIsNoData(geoJSON.features[i].properties[propertyName])) + continue; + if (kommonitorDataExchangeService.classifyZeroSeparately && (geoJSON.features[i].properties[propertyName] == 0 || geoJSON.features[i].properties[propertyName] == "0")) { + continue; + } + // check if is outlier, then do not use within classification, as it will be marked on map with special color + if (geoJSON.features[i].properties[outlierPropertyName] && geoJSON.features[i].properties[outlierPropertyName] !== outlierPropertyValue_no && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { + continue; + } + else if (kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]) >= 0) { + if (!this.positiveValues.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))) { + this.positiveValues.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); + } + } + else if (kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]) < 0) { + if (!this.negativeValues.includes(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName]))) { + this.negativeValues.push(kommonitorDataExchangeService.getIndicatorValue_asNumber(geoJSON.features[i].properties[propertyName])); + } + } + } + }; + function setupDynamicIncreaseBrew(positiveValues, colorCodeForPositiveValues, classifyMethod) { + return setupClassyBrew_usingFeatureCount(positiveValues, colorCodeForPositiveValues, classifyMethod, 3); } - - var fillColor; - if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { - fillColor = this.getFillColorForZero(); - if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacityForZeroFeatures; - } - + function setupDynamicDecreaseBrew(negativeValues, colorCodeForNegativeValues, classifyMethod) { + var brew = setupClassyBrew_usingFeatureCount(negativeValues, colorCodeForNegativeValues, classifyMethod, 3); + if (brew && brew.colors && brew.colors.length > 1) { + brew.colors = brew.colors.reverse(); + } + return brew; } - else { - if (datasetContainsNegativeValues) { - if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) >= 0) { - if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { + this.styleNoData = function (feature) { + this.featuresPerNoData++; + return this.noDataStyle; + }; + this.styleOutlier = function (feature) { + if ((feature.properties[outlierPropertyName] === outlierPropertyValue_low_soft) || (feature.properties[outlierPropertyName] === outlierPropertyValue_low_extreme)) { + this.featuresPerOutlierLow++; + return this.outlierStyle_low; + } + else { + this.featuresPerOutlierHigh++; + return this.outlierStyle_high; + } + }; + this.getOpacity = function (opacity) { + return defaultFillOpacity; + }; + this.setOpacity = function (opacity) { + opacity = Number(opacity); + this.indicatorTransparency = Number((1 - opacity).toFixed(numberOfDecimals)); + this.currentIndicatorOpacity = opacity; + defaultFillOpacity = opacity; + defaultFillOpacityForOutliers_low = opacity; + defaultFillOpacityForOutliers_high = opacity; + defaultFillOpacityForZeroFeatures = opacity; + defaultFillOpacityForNoDataValues = opacity; + defaultFillOpacityForFilteredFeatures = opacity; + $timeout(function () { + $rootScope.$apply(); + }); + }; + // style function to return + this.styleDefault = function (feature, defaultBrew, dynamicIncreaseBrew, dynamicDecreaseBrew, propertyName, useTransparencyOnIndicator, datasetContainsNegativeValues) { + // check if feature is NoData + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[propertyName])) { + return this.styleNoData(feature); + } + // check if feature is outlier + if ((feature.properties[outlierPropertyName] !== outlierPropertyValue_no) && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { + return this.styleOutlier(feature); + } + var fillOpacity = 1; + if (useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacity; + } + var fillColor; + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { fillColor = this.getFillColorForZero(); if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacityForZeroFeatures; + fillOpacity = defaultFillOpacityForZeroFeatures; } - } - else { - fillColor = this.findColorInRange(feature, propertyName, dynamicIncreaseBrew); - } - - return { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, - dashArray: '', - fillOpacity: fillOpacity, - fillColor: fillColor, - fillPattern: undefined - }; } else { - - if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { - fillColor = this.getFillColorForZero(); - if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacityForZeroFeatures; + if (datasetContainsNegativeValues) { + if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) >= 0) { + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { + fillColor = this.getFillColorForZero(); + if (useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacityForZeroFeatures; + } + } + else { + fillColor = this.findColorInRange(feature, propertyName, dynamicIncreaseBrew); + } + return { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, + dashArray: '', + fillOpacity: fillOpacity, + fillColor: fillColor, + fillPattern: undefined + }; + } + else { + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { + fillColor = this.getFillColorForZero(); + if (useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacityForZeroFeatures; + } + } + else { + // invert colors, so that lowest values will become strong colored! + fillColor = this.findColorInRange(feature, propertyName, dynamicDecreaseBrew); + } + return { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, + dashArray: '', + fillOpacity: fillOpacity, + fillColor: fillColor, + fillPattern: undefined + }; + } } - } - else { - // invert colors, so that lowest values will become strong colored! - fillColor = this.findColorInRange(feature, propertyName, dynamicDecreaseBrew); - } - - return { + else { + fillColor = this.findColorInRange(feature, propertyName, defaultBrew); + } + } + return { weight: 1, opacity: 1, color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, @@ -570,225 +481,179 @@ angular fillOpacity: fillOpacity, fillColor: fillColor, fillPattern: undefined - }; + }; + }; + this.findColorInRange = function (feature, propertyName, colorBrewInstance) { + var color; + for (var index = 0; index < colorBrewInstance.breaks.length; index++) { + if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) == kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewInstance.breaks[index])) { + if (index < colorBrewInstance.breaks.length - 1) { + // min value + color = colorBrewInstance.colors[index]; + break; + } + else { + //max value + if (colorBrewInstance.colors[index]) { + color = colorBrewInstance.colors[index]; + } + else { + color = colorBrewInstance.colors[index - 1]; + } + break; + } + } + else { + if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) < kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewInstance.breaks[index + 1])) { + color = colorBrewInstance.colors[index]; + break; + } + } } - } - else { - fillColor = this.findColorInRange(feature, propertyName, defaultBrew); - } - } - - return { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, - dashArray: '', - fillOpacity: fillOpacity, - fillColor: fillColor, - fillPattern: undefined + this.incrementFeaturesPerColor(color); + return color; }; - }; - - this.findColorInRange = function(feature, propertyName, colorBrewInstance){ - var color; - - for (var index = 0; index < colorBrewInstance.breaks.length; index++) { - if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) == kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewInstance.breaks[index])) { - if (index < colorBrewInstance.breaks.length - 1) { - // min value - color = colorBrewInstance.colors[index]; - break; + // this.findColorInRange_invertedColorGradient = function (feature, propertyName, colorBrewInstance){ + // var color; + // for (var k = 0; k < colorBrewInstance.breaks.length; k++) { + // if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) == kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewInstance.breaks[k])) { + // if (k < colorBrewInstance.breaks.length - 1) { + // // min value + // color = colorBrewInstance.colors[colorBrewInstance.colors.length - k - 1]; + // break; + // } + // else { + // //max value + // if (colorBrewInstance.colors[colorBrewInstance.colors.length - k]) { + // color = colorBrewInstance.colors[colorBrewInstance.colors.length - k]; + // } + // else { + // color = colorBrewInstance.colors[colorBrewInstance.colors.length - k - 1]; + // } + // break; + // } + // } + // else { + // if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) < kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewInstance.breaks[k + 1])) { + // color = colorBrewInstance.colors[colorBrewInstance.colors.length - k - 1]; + // break; + // } + // } + // } + // this.incrementFeaturesPerColor(color); + // return color; + // }; + this.styleMeasureOfValue = function (feature, gtMeasureOfValueBrew, ltMeasureOfValueBrew, propertyName, useTransparencyOnIndicator) { + // check if feature is NoData + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[propertyName])) { + return this.styleNoData(feature); } - else { - //max value - if (colorBrewInstance.colors[index]) { - color = colorBrewInstance.colors[index]; - } - else { - color = colorBrewInstance.colors[index - 1]; - } - break; - } - } - else { - if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) < kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewInstance.breaks[index + 1])) { - color = colorBrewInstance.colors[index]; - break; - } - } - } - - this.incrementFeaturesPerColor(color); - - return color; - }; - - // this.findColorInRange_invertedColorGradient = function (feature, propertyName, colorBrewInstance){ - // var color; - - // for (var k = 0; k < colorBrewInstance.breaks.length; k++) { - // if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) == kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewInstance.breaks[k])) { - // if (k < colorBrewInstance.breaks.length - 1) { - // // min value - // color = colorBrewInstance.colors[colorBrewInstance.colors.length - k - 1]; - // break; - // } - // else { - // //max value - // if (colorBrewInstance.colors[colorBrewInstance.colors.length - k]) { - // color = colorBrewInstance.colors[colorBrewInstance.colors.length - k]; - // } - // else { - // color = colorBrewInstance.colors[colorBrewInstance.colors.length - k - 1]; - // } - // break; - // } - // } - // else { - // if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) < kommonitorDataExchangeService.getIndicatorValue_asNumber(colorBrewInstance.breaks[k + 1])) { - // color = colorBrewInstance.colors[colorBrewInstance.colors.length - k - 1]; - // break; - // } - // } - // } - - // this.incrementFeaturesPerColor(color); - - // return color; - // }; - - this.styleMeasureOfValue = function(feature, gtMeasureOfValueBrew, ltMeasureOfValueBrew, propertyName, useTransparencyOnIndicator) { - - - // check if feature is NoData - if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[propertyName])) { - return this.styleNoData(feature); - } - - // check if feature is outlier - if ((feature.properties[outlierPropertyName] !== outlierPropertyValue_no) && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { - return this.styleOutlier(feature); - } - - var fillOpacity = 1; - if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacity; - } - - var fillColor; - if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) >= kommonitorDataExchangeService.measureOfValue) { - - if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { - fillColor = this.getFillColorForZero(); - if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacityForZeroFeatures; - } - } - else { - - fillColor = this.findColorInRange(feature, propertyName, gtMeasureOfValueBrew); - } - - return { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, - dashArray: '', - fillOpacity: fillOpacity, - fillColor: fillColor, - fillPattern: undefined - }; - } - else { - if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { - fillColor = this.getFillColorForZero(); - if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacityForZeroFeatures; - } - } - else { - // invert colors, so that lowest values will become strong colored! - fillColor = this.findColorInRange(feature, propertyName, ltMeasureOfValueBrew); - } - - return { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, - dashArray: '', - fillOpacity: fillOpacity, - fillColor: fillColor, - fillPattern: undefined - }; - } - - }; - - this.styleDynamicIndicator = function(feature, dynamicIncreaseBrew, dynamicDecreaseBrew, propertyName, useTransparencyOnIndicator) { - - - - // check if feature is NoData - if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[propertyName])) { - return this.styleNoData(feature); - } - - // check if feature is outlier - if ((feature.properties[outlierPropertyName] !== outlierPropertyValue_no) && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { - return this.styleOutlier(feature); - } - - var fillOpacity = 1; - if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacity; - } - - var fillColor; - if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) >= 0) { - - if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { - fillColor = this.getFillColorForZero(); + // check if feature is outlier + if ((feature.properties[outlierPropertyName] !== outlierPropertyValue_no) && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { + return this.styleOutlier(feature); + } + var fillOpacity = 1; if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacityForZeroFeatures; - } - } - else { - fillColor = this.findColorInRange(feature, propertyName, dynamicIncreaseBrew); - } - - return { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, - dashArray: '', - fillOpacity: fillOpacity, - fillColor: fillColor, - fillPattern: undefined - }; - } - else { - if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { - fillColor = this.getFillColorForZero(); + fillOpacity = defaultFillOpacity; + } + var fillColor; + if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) >= kommonitorDataExchangeService.measureOfValue) { + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { + fillColor = this.getFillColorForZero(); + if (useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacityForZeroFeatures; + } + } + else { + fillColor = this.findColorInRange(feature, propertyName, gtMeasureOfValueBrew); + } + return { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, + dashArray: '', + fillOpacity: fillOpacity, + fillColor: fillColor, + fillPattern: undefined + }; + } + else { + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { + fillColor = this.getFillColorForZero(); + if (useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacityForZeroFeatures; + } + } + else { + // invert colors, so that lowest values will become strong colored! + fillColor = this.findColorInRange(feature, propertyName, ltMeasureOfValueBrew); + } + return { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, + dashArray: '', + fillOpacity: fillOpacity, + fillColor: fillColor, + fillPattern: undefined + }; + } + }; + this.styleDynamicIndicator = function (feature, dynamicIncreaseBrew, dynamicDecreaseBrew, propertyName, useTransparencyOnIndicator) { + // check if feature is NoData + if (kommonitorDataExchangeService.indicatorValueIsNoData(feature.properties[propertyName])) { + return this.styleNoData(feature); + } + // check if feature is outlier + if ((feature.properties[outlierPropertyName] !== outlierPropertyValue_no) && kommonitorDataExchangeService.useOutlierDetectionOnIndicator) { + return this.styleOutlier(feature); + } + var fillOpacity = 1; if (useTransparencyOnIndicator) { - fillOpacity = defaultFillOpacityForZeroFeatures; - } - } - else { - // invert colors, so that lowest values will become strong colored! - fillColor = this.findColorInRange(feature, propertyName, dynamicDecreaseBrew); - } - - return { - weight: 1, - opacity: 1, - color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, - dashArray: '', - fillOpacity: fillOpacity, - fillColor: fillColor, - fillPattern: undefined - }; - } - - }; - + fillOpacity = defaultFillOpacity; + } + var fillColor; + if (kommonitorDataExchangeService.getIndicatorValue_asNumber(feature.properties[propertyName]) >= 0) { + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { + fillColor = this.getFillColorForZero(); + if (useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacityForZeroFeatures; + } + } + else { + fillColor = this.findColorInRange(feature, propertyName, dynamicIncreaseBrew); + } + return { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, + dashArray: '', + fillOpacity: fillOpacity, + fillColor: fillColor, + fillPattern: undefined + }; + } + else { + if (kommonitorDataExchangeService.classifyZeroSeparately && (feature.properties[propertyName] == 0 || feature.properties[propertyName] == "0")) { + fillColor = this.getFillColorForZero(); + if (useTransparencyOnIndicator) { + fillOpacity = defaultFillOpacityForZeroFeatures; + } + } + else { + // invert colors, so that lowest values will become strong colored! + fillColor = this.findColorInRange(feature, propertyName, dynamicDecreaseBrew); + } + return { + weight: 1, + opacity: 1, + color: kommonitorDataExchangeService.selectedSpatialUnitIsRaster() ? undefined : defaultBorderColor, + dashArray: '', + fillOpacity: fillOpacity, + fillColor: fillColor, + fillPattern: undefined + }; + } + }; }]); +//# sourceMappingURL=kommonitor-visual-style-helper-service.module.js.map \ No newline at end of file diff --git a/app/util/genericServices/kommonitorVisualStyleHelperService/kommonitor-visual-style-helper-service.module.js.map b/app/util/genericServices/kommonitorVisualStyleHelperService/kommonitor-visual-style-helper-service.module.js.map new file mode 100644 index 000000000..a31804ec8 --- /dev/null +++ b/app/util/genericServices/kommonitorVisualStyleHelperService/kommonitor-visual-style-helper-service.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"kommonitor-visual-style-helper-service.module.js","sourceRoot":"","sources":["kommonitor-visual-style-helper-service.module.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 16e549e45..d1dcd2ebf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,18 @@ "version": "2.1.13", "license": "Apache 2.0", "dependencies": { + "@angular/animations": "^16.1.3", + "@angular/common": "^16.1.3", + "@angular/compiler": "^16.1.3", + "@angular/core": "^16.1.3", + "@angular/forms": "^16.1.3", + "@angular/platform-browser": "^16.1.3", + "@angular/platform-browser-dynamic": "^16.1.3", + "@angular/router": "^16.1.3", + "@angular/upgrade": "^16.1.3", "@fortawesome/fontawesome-free": "^6.1.1", + "@ng-bootstrap/ng-bootstrap": "^15.1.0", + "@popperjs/core": "^2.11.8", "@turf/turf": "^6.5.0", "admin-lte": "^2.4.15", "ag-grid-community": "^26.2.1", @@ -19,7 +30,7 @@ "angular-sanitize": "^1.7.8", "angular-ui-bootstrap": "^2.5.6", "angularjs-dropdown-multiselect": "^2.0.0-beta.10", - "bootstrap": "^3.3.7", + "bootstrap": "^3.4.1", "bootstrap-datepicker": "^1.7.0", "bootstrap-daterangepicker": "^2.1.25", "bootstrap-iconpicker-latest": "^1.12.0", @@ -28,6 +39,7 @@ "classybrew": "0.0.3", "code-prettify": "^0.1.0", "codemirror": "^5.59.1", + "colorbrewer": "^1.5.3", "crypto-js": "^4.0.0", "docx": "^7.3.0", "echarts": "^5.3.0", @@ -38,9 +50,9 @@ "html2pdf.js": "^0.10.1", "ion-rangeslider": "^2.3.0", "ionicons": "^3.0.0", - "jquery": "^3.5.1", + "jquery": "^3.7.0", "jquery-slimscroll": "^1.3.8", - "jquery-ui-dist": "^1.12.1", + "jquery-ui-dist": "^1.13.2", "jquery.easing": "^1.4.1", "js-xlsx": "^0.8.22", "jshint": "^2.13.5", @@ -61,17 +73,34 @@ "leaflet.pattern": "^0.1.0", "mathjax": "^3.1.2", "rangeslide.js": "^0.13.0", + "rxjs": "^7.8.1", "shp-write": "^0.3.2", "shpjs": "^3.4.3", "slimscroll": "^0.9.1", "sortablejs": "^1.13.0", "tableexport": "^5.0.5", - "ui-select": "^0.19.8" + "tslib": "^2.6.0", + "ui-select": "^0.19.8", + "zone.js": "^0.13.1" }, "devDependencies": { + "@angular-devkit/build-angular": "^16.1.3", + "@angular/cli": "^16.1.3", + "@angular/compiler-cli": "^16.1.3", "@babel/cli": "^7.17.3", "@babel/core": "^7.17.5", "@release-it/keep-a-changelog": "^3.1.0", + "@types/angular": "^1.8.5", + "@types/angular-animate": "^1.5.11", + "@types/angular-aria": "^1.7.2", + "@types/angular-cookies": "^1.8.1", + "@types/angular-mocks": "^1.7.1", + "@types/angular-resource": "^1.5.17", + "@types/angular-route": "^1.7.3", + "@types/angular-sanitize": "^1.8.1", + "@types/jasmine": "^4.3.5", + "@types/jquery": "^3.5.16", + "@types/node": "^20.4.8", "babel-core": "^6.26.0", "babel-plugin-angularjs-annotate": "^0.10.0", "babel-plugin-transform-es2015-destructuring": "^6.23.0", @@ -99,2220 +128,4482 @@ "http-server": "^14.1.0", "license-checker": "^25.0.1", "release-it": "^15.4.1", + "typescript": "^5.1.6", "webpack": "^5.1.0", "webpack-cli": "^4.5.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@babel/cli": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.17.3.tgz", - "integrity": "sha512-1+WRlh1IqLocOp122CLx4if345RSHMspwIZNJTlqG/GA46HVZC6p49N1kolfdd2/GOdr+tu4nScbAR3ACJ2ZiA==", + "node_modules/@angular-devkit/architect": { + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.4.tgz", + "integrity": "sha512-OOSbNlDy+Q3jY0oFHaq8kkna9HYI1zaS8IHeCIDP6T/ZIAVad4+HqXAL4SKQrKJikkoBQv1Z/eaDBL5XPFK9Bw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.1.4", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.4.tgz", + "integrity": "sha512-LiHM7R20fTHg/eM+Iabotj08edP5wVBQahRfVNLxERo8X6VJgSjVChnsh3AQJkRywlGuFe20AOQYpyLyN367Ug==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/build-webpack": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@babel/core": "7.22.5", + "@babel/generator": "7.22.7", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.5", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.5", + "@babel/preset-env": "7.22.5", + "@babel/runtime": "7.22.5", + "@babel/template": "7.22.5", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "16.1.4", + "@vitejs/plugin-basic-ssl": "1.0.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.2", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "cacache": "17.1.3", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.19", + "css-loader": "6.8.1", + "esbuild-wasm": "0.17.19", + "fast-glob": "3.2.12", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.0", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", + "piscina": "3.2.0", + "postcss": "8.4.24", + "postcss-loader": "7.3.2", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.63.2", + "sass-loader": "13.3.1", + "semver": "7.5.3", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.17.7", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.5.3", + "vite": "4.3.9", + "webpack": "5.86.0", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.0", + "webpack-merge": "5.9.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.17.19" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0", + "@angular/localize": "^16.0.0", + "@angular/platform-server": "^16.0.0", + "@angular/service-worker": "^16.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^16.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.9.3 <5.2" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.4", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/cli/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">= 6" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/cli/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "node_modules/@angular-devkit/build-angular/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "node_modules/@angular-devkit/build-angular/node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/@babel/core": { - "version": "7.17.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", - "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.2", - "@babel/parser": "^7.17.3", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" + "node_modules/@angular-devkit/build-angular/node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "node_modules/@angular-devkit/build-angular/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" } }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "node_modules/@angular-devkit/build-angular/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/core/node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "node_modules/@angular-devkit/build-angular/node_modules/globby/node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "node_modules/@angular-devkit/build-angular/node_modules/globby/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "node_modules/@babel/core/node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "randombytes": "^2.1.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "node_modules/@angular-devkit/build-angular/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/core/node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/webpack": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", - "dev": true, "bin": { - "parser": "bin/babel-parser.js" + "webpack": "bin/webpack.js" }, "engines": { - "node": ">=6.0.0" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/@babel/core/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "node_modules/@angular-devkit/build-angular/node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.4.tgz", + "integrity": "sha512-GC1y//ScAYbYQ68Wri2QgTEekC4hRxBC+xEkYL9OFiAMQ4mcN+eYvbkQBX8enJwDMXpkYfLR6VV8cChjAVYIgg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@angular-devkit/architect": "0.1601.4", + "rxjs": "7.8.1" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" } }, - "node_modules/@babel/core/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "node_modules/@angular-devkit/core": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.4.tgz", + "integrity": "sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@babel/core/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@angular-devkit/schematics": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.4.tgz", + "integrity": "sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@angular-devkit/core": "16.1.4", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" }, "engines": { - "node": ">=4" + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/core/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/@angular/animations": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.4.tgz", + "integrity": "sha512-QdqmnMEYsrZK1BB+/TGteyoQVRwIpRdBP4Jg+hX/BDhVpt35dptSwvNZj7+9zoYLwNo5DuGlttljEaLOs1UcUw==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "tslib": "^2.3.0" }, "engines": { - "node": ">=4" + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "16.1.4" + } + }, + "node_modules/@angular/cli": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.4.tgz", + "integrity": "sha512-coSOLVLpOCOD5q9K9EAFFMrTES+HtdJiLy/iI9kdKNCKWUJpm8/svZ3JZOej3vPxYEp0AokXNOwORQnX21/qZQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "@schematics/angular": "16.1.4", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.3", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, + "node_modules/@angular/common": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.4.tgz", + "integrity": "sha512-SDA8GZVY0nXCJaNUy13L22jAKuk1LZgQ6QzqOpqQc50C25bfBQbYv68PKjHCjQ62VxGKnDSTT85xCMNx+y/U4g==", "dependencies": { - "safe-buffer": "~5.1.1" + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "16.1.4", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, + "node_modules/@angular/compiler": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.4.tgz", + "integrity": "sha512-5iKx8g+6/LtiRhbqMS2Jw1AshFUb4M8LO9WQKfRoE+5mZrDOYkAQYgOlAO7fk0mOCXeZcHJBbq2nuwDfwsZIiw==", "dependencies": { - "ms": "2.1.2" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.0" + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "16.1.4" }, "peerDependenciesMeta": { - "supports-color": { + "@angular/core": { "optional": true } } }, - "node_modules/@babel/core/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/core/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/core/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, + "node_modules/@angular/compiler-cli": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.4.tgz", + "integrity": "sha512-JerJOZeOLaHFHrfWMm4m9tEw+MdNNIMPj3TSauJ6uZPbFokGeqS2GsUBMjuQlwh5xY4duh1HtRsohvshpl306A==", + "dependencies": { + "@babel/core": "7.22.5", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, "bin": { - "jsesc": "bin/jsesc" + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "16.1.4", + "typescript": ">=4.9.3 <5.2" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/core/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/@angular/core": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.4.tgz", + "integrity": "sha512-eWs++peAp+Lm2SHGfMsHAye2IOmlDKkVJ4dFf4TaZXW+AEev3FXKXLFp+dBUq8YkCKly7iAV26NXEUBOFFtplQ==", "dependencies": { - "has-flag": "^3.0.0" + "tslib": "^2.3.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/core/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.13.0" } }, - "node_modules/@babel/generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.0.tgz", - "integrity": "sha512-zBZfgvBB/ywjx0Rgc2+BwoH/3H+lDtlgD4hBOpEv5LxRnYsm/753iRuLepqnYlynpjC3AdQxtxsoeHJoEEwOAw==", - "dev": true, + "node_modules/@angular/forms": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.4.tgz", + "integrity": "sha512-JLhO7gM0WyTfr6tEWZMiCGikWLgaC/a2+tuxWsSlXUjlrbE4DyLzSAA6JqyDCFTvm9B/QzRPDfgExLTTZJY4eQ==", "dependencies": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.1.4", + "@angular/core": "16.1.4", + "@angular/platform-browser": "16.1.4", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/generator/node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/generator/node_modules/@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", - "dev": true, + "node_modules/@angular/localize": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.1.4.tgz", + "integrity": "sha512-owOzDzU8of6kFE8i82AM/ewjfciKsmzHAxaEGgUP1FdW9D9hEOoGQVoezGk6VKafhLWZ4Gu0i78jZ1/xhntMmw==", + "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/generator/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, + "@babel/core": "7.22.5", + "fast-glob": "3.2.12", + "yargs": "^17.2.1" + }, "bin": { - "jsesc": "bin/jsesc" + "localize-extract": "tools/bundles/src/extract/cli.js", + "localize-migrate": "tools/bundles/src/migrate/cli.js", + "localize-translate": "tools/bundles/src/translate/cli.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/generator/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "16.1.4", + "@angular/compiler-cli": "16.1.4" + } + }, + "node_modules/@angular/localize/node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "node_modules/@angular/localize/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, + "node_modules/@angular/platform-browser": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.4.tgz", + "integrity": "sha512-eQ1dBh/6ZwJVeiNGrcW6ePFmWeS+Oheu1RpuZSsvM/fI6qfsZE+or9IJ61SFvsMs65SbrO90Akc+ZXmpEidPdA==", "dependencies": { - "@babel/types": "^7.16.7" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "16.1.4", + "@angular/common": "16.1.4", + "@angular/core": "16.1.4" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } } }, - "node_modules/@babel/helper-environment-visitor/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, + "node_modules/@angular/platform-browser-dynamic": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.4.tgz", + "integrity": "sha512-OIszPs3NLCZWL8BEvn458JotNMdXPGyEVToNa2cEVgtakVxkhrhmoFlwJTWJN4GRkHNL5h2Vb0JLEYICwr7sgg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.1.4", + "@angular/compiler": "16.1.4", + "@angular/core": "16.1.4", + "@angular/platform-browser": "16.1.4" } }, - "node_modules/@babel/helper-function-name/node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", - "dev": true, + "node_modules/@angular/router": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.4.tgz", + "integrity": "sha512-ooAK7XsY7fLW80htej9jHmct37biK77aNApCdiY+KlLdd45x//ObGxRYXcSSyvs7mRS0AMTGuA/G7/5AMcqcZg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-function-name/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, + "tslib": "^2.3.0" + }, "engines": { - "node": ">=4" + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "16.1.4", + "@angular/core": "16.1.4", + "@angular/platform-browser": "16.1.4", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, + "node_modules/@angular/upgrade": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-16.1.4.tgz", + "integrity": "sha512-VQ/LJ3dzove2VisfibO+4lXDjp4B3seBgZ6rAXc/J4g5Ym7umuZR9nOwaQnTufBjXAlnVfiJCb9r1ba+wN3ZOg==", "dependencies": { - "@babel/types": "^7.12.13" + "tslib": "^2.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "16.1.4", + "@angular/core": "16.1.4", + "@angular/platform-browser": "16.1.4", + "@angular/platform-browser-dynamic": "16.1.4" } }, - "node_modules/@babel/helper-get-function-arity/node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", "dev": true }, - "node_modules/@babel/helper-get-function-arity/node_modules/@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "node_modules/@babel/cli": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.22.9.tgz", + "integrity": "sha512-nb2O7AThqRo7/E53EGiuAkMaRbb7J5Qp3RvN+dmua1U+kydm0oznkhqbTEG15yk26G/C3yL6OdZjzgl+DMXVVA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-get-function-arity/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/helper-hoist-variables/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, + "node_modules/@babel/generator": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", - "dev": true, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=6.9.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", + "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dependencies": { - "ms": "2.1.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/helper-module-transforms/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/helper-module-transforms/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", - "@babel/types": "^7.17.0" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", - "dev": true, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-plugin-utils": "^7.12.13" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.8.3" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", "dev": true, "dependencies": { - "ms": "2.1.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/helpers/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/helpers/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight": { + "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/parser": { - "version": "7.13.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.4.tgz", - "integrity": "sha512-uvoOulWHhI+0+1f9L4BoozY7U5cIkZ9PgJqvb041d6vypgUmtVPG4vmGm4pSggjl8BELzvHyUeJSUyEMY6b+qA==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", "dev": true, "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/template/node_modules/@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/template/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/template/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", "dev": true, "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/traverse/node_modules/@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, "dependencies": { - "ms": "2.1.2" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/traverse/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", - "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fortawesome/fontawesome-free": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.1.1.tgz", - "integrity": "sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg==", - "hasInstallScript": true, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, - "optional": true + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/auth-token": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.1.tgz", - "integrity": "sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, "dependencies": { - "@octokit/types": "^7.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/core": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.5.tgz", - "integrity": "sha512-4R3HeHTYVHCfzSAi0C6pbGXV8UDI5Rk+k3G7kLVNckswN9mvpOzW9oENfjfH3nEmzg8y3AmKmzs8Sg6pLCeOCA==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", "dev": true, "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^7.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/endpoint": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.2.tgz", - "integrity": "sha512-8/AUACfE9vpRpehE6ZLfEtzkibe5nfsSwFZVMsG8qabqRt1M81qZYUFRZa1B8w8lP6cdfDJfRq9HWS+MbmR7tw==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", "dev": true, "dependencies": { - "@octokit/types": "^7.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/endpoint/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/graphql": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.1.tgz", - "integrity": "sha512-sxmnewSwAixkP1TrLdE6yRG53eEhHhDTYUykUwdV9x8f91WcbhunIHk9x1PZLALdBZKRPUO2HRcm4kezZ79HoA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dev": true, "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", - "universal-user-agent": "^6.0.0" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/openapi-types": { - "version": "13.9.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.9.1.tgz", - "integrity": "sha512-98zOxAAR8MDHjXI2xGKgn/qkZLwfcNjHka0baniuEpN1fCv3kDJeh5qc0mBwim5y31eaPaYer9QikzwOkQq3wQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-4.2.3.tgz", - "integrity": "sha512-1RXJZ7hnxSANMtxKSVIEByjhYqqlu2GaKmLJJE/OVDya1aI++hdmXP4ORCUlsN2rt4hJzRYbWizBHlGYKz3dhQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", "dev": true, "dependencies": { - "@octokit/types": "^7.3.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" }, "peerDependencies": { - "@octokit/core": ">=4" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.5.2.tgz", - "integrity": "sha512-zUscUePMC3KEKyTAfuG/dA6hw4Yn7CncVJs2kM9xc4931Iqk3ZiwHfVwTUnxkqQJIVgeBRYUk3rM4hMfgASUxg==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", "dev": true, "dependencies": { - "@octokit/types": "^7.3.1", - "deprecation": "^2.3.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" }, "peerDependencies": { - "@octokit/core": ">=3" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/request": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.1.tgz", - "integrity": "sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^7.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/request-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", - "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", + "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", "dev": true, "dependencies": { - "@octokit/types": "^7.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "semver": "^6.3.0" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/request/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@octokit/request/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/rest": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.4.tgz", - "integrity": "sha512-LwG668+6lE8zlSYOfwPj4FxWdv/qFXYBpv79TWIQEpBLKA9D/IMcWsF/U9RGpA3YqMVDiTxpgVpEW3zTFfPFTA==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "dependencies": { - "@octokit/core": "^4.0.0", - "@octokit/plugin-paginate-rest": "^4.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { - "node": ">= 14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/types": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.3.1.tgz", - "integrity": "sha512-Vefohn8pHGFYWbSc6du0wXMK/Pmy6h0H4lttBw5WqquEuxjdXwyYX07CeZpJDkzSzpdKxBoWRNuDJGTE+FvtqA==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^13.9.1" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz", - "integrity": "sha512-gkINruT2KUhZLTaiHxwCOh1O4NVnFT0wLjWFBHmTz9vpKag/C/noIMJXBxFe4F0mYpUVX2puLwAieLYFg2NvoA==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "dependencies": { - "graceful-fs": "4.2.10" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=12.22.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "dependencies": { - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@release-it/keep-a-changelog": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@release-it/keep-a-changelog/-/keep-a-changelog-3.1.0.tgz", - "integrity": "sha512-o8lxZCAFwFkFpo88aIIgS5dR3kDy6yLjJVpe9QAGNY6tpKMMRHxsiJ8MS5NvrEeIC2VTzOoOjN/CDvdd3a4+/A==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", "dev": true, "dependencies": { - "detect-newline": "^4.0.0", - "string-template": "^1.0.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=14" + "node": ">=6.9.0" }, "peerDependencies": { - "release-it": "^15.0.0-esm.4" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@release-it/keep-a-changelog/node_modules/string-template": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", - "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=14.16" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "dependencies": { - "defer-to-connect": "^2.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=14.16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@turf/along": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/along/-/along-6.5.0.tgz", - "integrity": "sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw==", "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/along/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "engines": { + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@turf/along/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@babel/preset-env": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", + "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.5", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@turf/along/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@turf/angle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/angle/-/angle-6.5.0.tgz", - "integrity": "sha512-4pXMbWhFofJJAOvTMCns6N4C8CMd5Ih4O2jSAG9b3dDHakj3O4yN1+Zbm+NUei+eVEZ9gFeVp9svE3aMDenIkw==", + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, - "funding": { - "url": "https://opencollective.com/turf" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@turf/angle/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true }, - "node_modules/@turf/angle/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "dependencies": { - "@turf/helpers": "^6.5.0" + "regenerator-runtime": "^0.13.11" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@turf/area": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-5.1.5.tgz", - "integrity": "sha1-79iZv9Jgzb0VQbKjwVX4pdLu+h0=", + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dependencies": { - "@turf/helpers": "^5.1.5", - "@turf/meta": "^5.1.5" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@turf/area/node_modules/@turf/meta": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz", - "integrity": "sha1-OxrUhe4MOwsXdRMqMsOE1T5LpT0=", - "dependencies": { - "@turf/helpers": "^5.1.5" + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@turf/bbox": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", - "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "@babel/types": "^7.22.5" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@turf/bbox-clip": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-6.5.0.tgz", - "integrity": "sha512-F6PaIRF8WMp8EmgU/Ke5B1Y6/pia14UAYB5TiBC668w5rVVjy5L8rTm/m2lEkkDMHlzoP9vNY4pxpNthE7rLcQ==", + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@turf/bbox-clip/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/@turf/bbox-clip/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@turf/bbox-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-6.5.0.tgz", - "integrity": "sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@turf/bbox-polygon/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@turf/bbox/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@turf/bearing": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz", - "integrity": "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@turf/bearing/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz", + "integrity": "sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@googlemaps/js-api-loader": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.2.tgz", + "integrity": "sha512-psGw5u0QM6humao48Hn4lrChOM2/rA43ZCm3tKK9qQsEj1/VzqkCqnvGfEOshDbBQflydfaRovbKwZMF4AyqbA==", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@ng-bootstrap/ng-bootstrap": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-15.1.0.tgz", + "integrity": "sha512-4Z/sXYcAq22D15jtlnZV7qztuSnlSlOgO7EVp6rJ8dyGi3CPzX9PqMfetoM6K5sKQTiSW8IfsbdXCWN7rnzxWQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^16.0.0", + "@angular/core": "^16.0.0", + "@angular/forms": "^16.0.0", + "@angular/localize": "^16.0.0", + "@popperjs/core": "^2.11.6", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.4.tgz", + "integrity": "sha512-+8bfavDH8eWxjlJFYr6bkjcRHhy95j+f8oNn7/sGLNu4L96nuE2AZ011XIu2dJahCnNiBvwc1EpkKa92t9rkaA==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0", + "typescript": ">=4.9.3 <5.2", + "webpack": "^5.54.0" + } + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, + "dependencies": { + "@octokit/types": "^10.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/request/node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@octokit/rest": { + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, + "node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@release-it/keep-a-changelog": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@release-it/keep-a-changelog/-/keep-a-changelog-3.1.0.tgz", + "integrity": "sha512-o8lxZCAFwFkFpo88aIIgS5dR3kDy6yLjJVpe9QAGNY6tpKMMRHxsiJ8MS5NvrEeIC2VTzOoOjN/CDvdd3a4+/A==", + "dev": true, + "dependencies": { + "detect-newline": "^4.0.0", + "string-template": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "release-it": "^15.0.0-esm.4" + } + }, + "node_modules/@schematics/angular": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.4.tgz", + "integrity": "sha512-XfoeL+aBVIR/DzgVKGVhHW/TGQnqWvngyJVuCwXEVWzNfjxHYFkchXa78OItpAvTEr6/Y0Me9FQVAGVA4mMUyg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", + "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.4.1.tgz", + "integrity": "sha512-axlrvsHlHlFmKKMEg4VyvMzFr93JWJj4eIfXY1STVuO2fsImCa7ncaiG5gC8HKOX590AW5RtRsC41/B+OfrSqw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@turf/along": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/along/-/along-6.5.0.tgz", + "integrity": "sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw==", + "dependencies": { + "@turf/bearing": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/angle": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/angle/-/angle-6.5.0.tgz", + "integrity": "sha512-4pXMbWhFofJJAOvTMCns6N4C8CMd5Ih4O2jSAG9b3dDHakj3O4yN1+Zbm+NUei+eVEZ9gFeVp9svE3aMDenIkw==", + "dependencies": { + "@turf/bearing": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/rhumb-bearing": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-clip": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-6.5.0.tgz", + "integrity": "sha512-F6PaIRF8WMp8EmgU/Ke5B1Y6/pia14UAYB5TiBC668w5rVVjy5L8rTm/m2lEkkDMHlzoP9vNY4pxpNthE7rLcQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-polygon": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-6.5.0.tgz", + "integrity": "sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bearing": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz", + "integrity": "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bezier-spline": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-6.5.0.tgz", + "integrity": "sha512-vokPaurTd4PF96rRgGVm6zYYC5r1u98ZsG+wZEv9y3kJTuJRX/O3xIY2QnTGTdbVmAJN1ouOsD0RoZYaVoXORQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-clockwise": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-6.5.0.tgz", + "integrity": "sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-contains": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-6.5.0.tgz", + "integrity": "sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/boolean-point-on-line": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-crosses": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-6.5.0.tgz", + "integrity": "sha512-gvshbTPhAHporTlQwBJqyfW+2yV8q/mOTxG6PzRVl6ARsqNoqYQWkd4MLug7OmAqVyBzLK3201uAeBjxbGw0Ng==", + "dependencies": { + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/polygon-to-line": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-disjoint": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-6.5.0.tgz", + "integrity": "sha512-rZ2ozlrRLIAGo2bjQ/ZUu4oZ/+ZjGvLkN5CKXSKBcu6xFO6k2bgqeM8a1836tAW+Pqp/ZFsTA5fZHsJZvP2D5g==", + "dependencies": { + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/polygon-to-line": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-equal": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-6.5.0.tgz", + "integrity": "sha512-cY0M3yoLC26mhAnjv1gyYNQjn7wxIXmL2hBmI/qs8g5uKuC2hRWi13ydufE3k4x0aNRjFGlg41fjoYLwaVF+9Q==", + "dependencies": { + "@turf/clean-coords": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "geojson-equality": "0.1.6" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-intersects": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-6.5.0.tgz", + "integrity": "sha512-nIxkizjRdjKCYFQMnml6cjPsDOBCThrt+nkqtSEcxkKMhAQj5OO7o2CecioNTaX8EayqwMGVKcsz27oP4mKPTw==", + "dependencies": { + "@turf/boolean-disjoint": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-overlap": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-6.5.0.tgz", + "integrity": "sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/line-overlap": "^6.5.0", + "@turf/meta": "^6.5.0", + "geojson-equality": "0.1.6" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-parallel": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-6.5.0.tgz", + "integrity": "sha512-aSHJsr1nq9e5TthZGZ9CZYeXklJyRgR5kCLm5X4urz7+MotMOp/LsGOsvKvK9NeUl9+8OUmfMn8EFTT8LkcvIQ==", + "dependencies": { + "@turf/clean-coords": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/rhumb-bearing": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-in-polygon": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz", + "integrity": "sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-on-line": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-6.5.0.tgz", + "integrity": "sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-within": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-6.5.0.tgz", + "integrity": "sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/boolean-point-on-line": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/buffer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-6.5.0.tgz", + "integrity": "sha512-qeX4N6+PPWbKqp1AVkBVWFerGjMYMUyencwfnkCesoznU6qvfugFHNAngNqIBVnJjZ5n8IFyOf+akcxnrt9sNg==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/center": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/projection": "^6.5.0", + "d3-geo": "1.7.1", + "turf-jsts": "*" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/center/-/center-6.5.0.tgz", + "integrity": "sha512-T8KtMTfSATWcAX088rEDKjyvQCBkUsLnK/Txb6/8WUXIeOZyHu42G7MkdkHRoHtwieLdduDdmPLFyTdG5/e7ZQ==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-mean": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-6.5.0.tgz", + "integrity": "sha512-AAX6f4bVn12pTVrMUiB9KrnV94BgeBKpyg3YpfnEbBpkN/znfVhL8dG8IxMAxAoSZ61Zt9WLY34HfENveuOZ7Q==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-median": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-6.5.0.tgz", + "integrity": "sha512-dT8Ndu5CiZkPrj15PBvslpuf01ky41DEYEPxS01LOxp5HOUHXp1oJxsPxvc+i/wK4BwccPNzU1vzJ0S4emd1KQ==", + "dependencies": { + "@turf/center-mean": "^6.5.0", + "@turf/centroid": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-of-mass": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-6.5.0.tgz", + "integrity": "sha512-EWrriU6LraOfPN7m1jZi+1NLTKNkuIsGLZc2+Y8zbGruvUW+QV7K0nhf7iZWutlxHXTBqEXHbKue/o79IumAsQ==", + "dependencies": { + "@turf/centroid": "^6.5.0", + "@turf/convex": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/centroid": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", + "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/circle": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-6.5.0.tgz", + "integrity": "sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==", + "dependencies": { + "@turf/destination": "^6.5.0", + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clean-coords": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-6.5.0.tgz", + "integrity": "sha512-EMX7gyZz0WTH/ET7xV8MyrExywfm9qUi0/MY89yNffzGIEHuFfqwhcCqZ8O00rZIPZHUTxpmsxQSTfzJJA1CPw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clone": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-6.5.0.tgz", + "integrity": "sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-6.5.0.tgz", + "integrity": "sha512-Y6gfnTJzQ1hdLfCsyd5zApNbfLIxYEpmDibHUqR5z03Lpe02pa78JtgrgUNt1seeO/aJ4TG1NLN8V5gOrHk04g==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-dbscan": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-6.5.0.tgz", + "integrity": "sha512-SxZEE4kADU9DqLRiT53QZBBhu8EP9skviSyl+FGj08Y01xfICM/RR9ACUdM0aEQimhpu+ZpRVcUK+2jtiCGrYQ==", + "dependencies": { + "@turf/clone": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0", + "density-clustering": "1.3.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-kmeans": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-6.5.0.tgz", + "integrity": "sha512-DwacD5+YO8kwDPKaXwT9DV46tMBVNsbi1IzdajZu1JDSWoN7yc7N9Qt88oi+p30583O0UPVkAK+A10WAQv4mUw==", + "dependencies": { + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "skmeans": "0.9.7" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/collect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-6.5.0.tgz", + "integrity": "sha512-4dN/T6LNnRg099m97BJeOcTA5fSI8cu87Ydgfibewd2KQwBexO69AnjEFqfPX3Wj+Zvisj1uAVIZbPmSSrZkjg==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0", + "rbush": "2.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/combine": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-6.5.0.tgz", + "integrity": "sha512-Q8EIC4OtAcHiJB3C4R+FpB4LANiT90t17uOd851qkM2/o6m39bfN5Mv0PWqMZIHWrrosZqRqoY9dJnzz/rJxYQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/concave": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-6.5.0.tgz", + "integrity": "sha512-I/sUmUC8TC5h/E2vPwxVht+nRt+TnXIPRoztDFvS8/Y0+cBDple9inLSo9nnPXMXidrBlGXZ9vQx/BjZUJgsRQ==", + "dependencies": { + "@turf/clone": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/tin": "^6.5.0", + "topojson-client": "3.x", + "topojson-server": "3.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/convex": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-6.5.0.tgz", + "integrity": "sha512-x7ZwC5z7PJB0SBwNh7JCeCNx7Iu+QSrH7fYgK0RhhNop13TqUlvHMirMLRgf2db1DqUetrAO2qHJeIuasquUWg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0", + "concaveman": "*" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/destination": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz", + "integrity": "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/difference": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-6.5.0.tgz", + "integrity": "sha512-l8iR5uJqvI+5Fs6leNbhPY5t/a3vipUF/3AeVLpwPQcgmedNXyheYuy07PcMGH5Jdpi5gItOiTqwiU/bUH4b3A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "polygon-clipping": "^0.15.3" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/dissolve": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-6.5.0.tgz", + "integrity": "sha512-WBVbpm9zLTp0Bl9CE35NomTaOL1c4TQCtEoO43YaAhNEWJOOIhZMFJyr8mbvYruKl817KinT3x7aYjjCMjTAsQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "polygon-clipping": "^0.15.3" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", + "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance-weight": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/distance-weight/-/distance-weight-6.5.0.tgz", + "integrity": "sha512-a8qBKkgVNvPKBfZfEJZnC3DV7dfIsC3UIdpRci/iap/wZLH41EmS90nM+BokAJflUHYy8PqE44wySGWHN1FXrQ==", + "dependencies": { + "@turf/centroid": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/ellipse": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-6.5.0.tgz", + "integrity": "sha512-kuXtwFviw/JqnyJXF1mrR/cb496zDTSbGKtSiolWMNImYzGGkbsAsFTjwJYgD7+4FixHjp0uQPzo70KDf3AIBw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/rhumb-destination": "^6.5.0", + "@turf/transform-rotate": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/envelope": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-6.5.0.tgz", + "integrity": "sha512-9Z+FnBWvOGOU4X+fMZxYFs1HjFlkKqsddLuMknRaqcJd6t+NIv5DWvPtDL8ATD2GEExYDiFLwMdckfr1yqJgHA==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/explode": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-6.5.0.tgz", + "integrity": "sha512-6cSvMrnHm2qAsace6pw9cDmK2buAlw8+tjeJVXMfMyY+w7ZUi1rprWMsY92J7s2Dar63Bv09n56/1V7+tcj52Q==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flatten": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-6.5.0.tgz", + "integrity": "sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flip": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-6.5.0.tgz", + "integrity": "sha512-oyikJFNjt2LmIXQqgOGLvt70RgE2lyzPMloYWM7OR5oIFGRiBvqVD2hA6MNw6JewIm30fWZ8DQJw1NHXJTJPbg==", + "dependencies": { + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/great-circle": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-6.5.0.tgz", + "integrity": "sha512-7ovyi3HaKOXdFyN7yy1yOMa8IyOvV46RC1QOQTT+RYUN8ke10eyqExwBpL9RFUPvlpoTzoYbM/+lWPogQlFncg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/hex-grid": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-6.5.0.tgz", + "integrity": "sha512-Ln3tc2tgZT8etDOldgc6e741Smg1CsMKAz1/Mlel+MEL5Ynv2mhx3m0q4J9IB1F3a4MNjDeVvm8drAaf9SF33g==", + "dependencies": { + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/intersect": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/interpolate": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-6.5.0.tgz", + "integrity": "sha512-LSH5fMeiGyuDZ4WrDJNgh81d2DnNDUVJtuFryJFup8PV8jbs46lQGfI3r1DJ2p1IlEJIz3pmAZYeTfMMoeeohw==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/centroid": "^6.5.0", + "@turf/clone": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/hex-grid": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/point-grid": "^6.5.0", + "@turf/square-grid": "^6.5.0", + "@turf/triangle-grid": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/intersect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-6.5.0.tgz", + "integrity": "sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "polygon-clipping": "^0.15.3" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/bearing/node_modules/@turf/invariant": { + "node_modules/@turf/invariant": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", @@ -2323,30 +4614,43 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/bezier-spline": { + "node_modules/@turf/isobands": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-6.5.0.tgz", - "integrity": "sha512-vokPaurTd4PF96rRgGVm6zYYC5r1u98ZsG+wZEv9y3kJTuJRX/O3xIY2QnTGTdbVmAJN1ouOsD0RoZYaVoXORQ==", + "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-6.5.0.tgz", + "integrity": "sha512-4h6sjBPhRwMVuFaVBv70YB7eGz+iw0bhPRnp+8JBdX1UPJSXhoi/ZF2rACemRUr0HkdVB/a1r9gC32vn5IAEkw==", "dependencies": { + "@turf/area": "^6.5.0", + "@turf/bbox": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/explode": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "object-assign": "*" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/bezier-spline/node_modules/@turf/helpers": { + "node_modules/@turf/isolines": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-6.5.0.tgz", + "integrity": "sha512-6ElhiLCopxWlv4tPoxiCzASWt/jMRvmp6mRYrpzOm3EUl75OhHKa/Pu6Y9nWtCMmVC/RcWtiiweUocbPLZLm0A==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "object-assign": "*" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/bezier-spline/node_modules/@turf/invariant": { + "node_modules/@turf/kinks": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-6.5.0.tgz", + "integrity": "sha512-ViCngdPt1eEL7hYUHR2eHR662GvCgTc35ZJFaNR6kRtr6D8plLaDju0FILeFFWSc+o8e3fwxZEJKmFj9IzPiIQ==", "dependencies": { "@turf/helpers": "^6.5.0" }, @@ -2354,210 +4658,406 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-clockwise": { + "node_modules/@turf/length": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-6.5.0.tgz", - "integrity": "sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==", + "resolved": "https://registry.npmjs.org/@turf/length/-/length-6.5.0.tgz", + "integrity": "sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==", + "dependencies": { + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-arc": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-6.5.0.tgz", + "integrity": "sha512-I6c+V6mIyEwbtg9P9zSFF89T7QPe1DPTG3MJJ6Cm1MrAY0MdejwQKOpsvNl8LDU2ekHOlz2kHpPVR7VJsoMllA==", + "dependencies": { + "@turf/circle": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-chunk": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-6.5.0.tgz", + "integrity": "sha512-i1FGE6YJaaYa+IJesTfyRRQZP31QouS+wh/pa6O3CC0q4T7LtHigyBSYjrbjSLfn2EVPYGlPCMFEqNWCOkC6zg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/length": "^6.5.0", + "@turf/line-slice-along": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-intersect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-6.5.0.tgz", + "integrity": "sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "geojson-rbush": "3.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-offset": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-6.5.0.tgz", + "integrity": "sha512-CEXZbKgyz8r72qRvPchK0dxqsq8IQBdH275FE6o4MrBkzMcoZsfSjghtXzKaz9vvro+HfIXal0sTk2mqV1lQTw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-overlap": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-6.5.0.tgz", + "integrity": "sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==", + "dependencies": { + "@turf/boolean-point-on-line": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", + "deep-equal": "1.x", + "geojson-rbush": "3.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-segment": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz", + "integrity": "sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-6.5.0.tgz", + "integrity": "sha512-vDqJxve9tBHhOaVVFXqVjF5qDzGtKWviyjbyi2QnSnxyFAmLlLnBfMX8TLQCAf2GxHibB95RO5FBE6I2KVPRuw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice-along": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-6.5.0.tgz", + "integrity": "sha512-KHJRU6KpHrAj+BTgTNqby6VCTnDzG6a1sJx/I3hNvqMBLvWVA2IrkR9L9DtsQsVY63IBwVdQDqiwCuZLDQh4Ng==", + "dependencies": { + "@turf/bearing": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-split": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-6.5.0.tgz", + "integrity": "sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", + "@turf/square": "^6.5.0", + "@turf/truncate": "^6.5.0", + "geojson-rbush": "3.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-to-polygon": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-6.5.0.tgz", + "integrity": "sha512-qYBuRCJJL8Gx27OwCD1TMijM/9XjRgXH/m/TyuND4OXedBpIWlK5VbTIO2gJ8OCfznBBddpjiObLBrkuxTpN4Q==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/mask": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-6.5.0.tgz", + "integrity": "sha512-RQha4aU8LpBrmrkH8CPaaoAfk0Egj5OuXtv6HuCQnHeGNOQt3TQVibTA3Sh4iduq4EPxnZfDjgsOeKtrCA19lg==", "dependencies": { "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "polygon-clipping": "^0.15.3" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-clockwise/node_modules/@turf/helpers": { + "node_modules/@turf/meta": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-clockwise/node_modules/@turf/invariant": { + "node_modules/@turf/midpoint": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-6.5.0.tgz", + "integrity": "sha512-MyTzV44IwmVI6ec9fB2OgZ53JGNlgOpaYl9ArKoF49rXpL84F9rNATndbe0+MQIhdkw8IlzA6xVP4lZzfMNVCw==", "dependencies": { + "@turf/bearing": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-contains": { + "node_modules/@turf/moran-index": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-6.5.0.tgz", - "integrity": "sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==", + "resolved": "https://registry.npmjs.org/@turf/moran-index/-/moran-index-6.5.0.tgz", + "integrity": "sha512-ItsnhrU2XYtTtTudrM8so4afBCYWNaB0Mfy28NZwLjB5jWuAsvyV+YW+J88+neK/ougKMTawkmjQqodNJaBeLQ==", "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", + "@turf/distance-weight": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-contains/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-contains/node_modules/@turf/invariant": { + "node_modules/@turf/nearest-point": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-6.5.0.tgz", + "integrity": "sha512-fguV09QxilZv/p94s8SMsXILIAMiaXI5PATq9d7YWijLxWUj6Q/r43kxyoi78Zmwwh1Zfqz9w+bCYUAxZ5+euA==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/clone": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-crosses": { + "node_modules/@turf/nearest-point-on-line": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-6.5.0.tgz", - "integrity": "sha512-gvshbTPhAHporTlQwBJqyfW+2yV8q/mOTxG6PzRVl6ARsqNoqYQWkd4MLug7OmAqVyBzLK3201uAeBjxbGw0Ng==", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz", + "integrity": "sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==", "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/bearing": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0", "@turf/line-intersect": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0" + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-crosses/node_modules/@turf/helpers": { + "node_modules/@turf/nearest-point-to-line": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-6.5.0.tgz", + "integrity": "sha512-PXV7cN0BVzUZdjj6oeb/ESnzXSfWmEMrsfZSDRgqyZ9ytdiIj/eRsnOXLR13LkTdXVOJYDBuf7xt1mLhM4p6+Q==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/point-to-line-distance": "^6.5.0", + "object-assign": "*" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-crosses/node_modules/@turf/invariant": { + "node_modules/@turf/planepoint": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-6.5.0.tgz", + "integrity": "sha512-R3AahA6DUvtFbka1kcJHqZ7DMHmPXDEQpbU5WaglNn7NaCQg9HB0XM0ZfqWcd5u92YXV+Gg8QhC8x5XojfcM4Q==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-disjoint": { + "node_modules/@turf/point-grid": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-6.5.0.tgz", - "integrity": "sha512-rZ2ozlrRLIAGo2bjQ/ZUu4oZ/+ZjGvLkN5CKXSKBcu6xFO6k2bgqeM8a1836tAW+Pqp/ZFsTA5fZHsJZvP2D5g==", + "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-6.5.0.tgz", + "integrity": "sha512-Iq38lFokNNtQJnOj/RBKmyt6dlof0yhaHEDELaWHuECm1lIZLY3ZbVMwbs+nXkwTAHjKfS/OtMheUBkw+ee49w==", "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/boolean-within": "^6.5.0", + "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0" + "@turf/invariant": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-disjoint/node_modules/@turf/helpers": { + "node_modules/@turf/point-on-feature": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-6.5.0.tgz", + "integrity": "sha512-bDpuIlvugJhfcF/0awAQ+QI6Om1Y1FFYE8Y/YdxGRongivix850dTeXCo0mDylFdWFPGDo7Mmh9Vo4VxNwW/TA==", + "dependencies": { + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/center": "^6.5.0", + "@turf/explode": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/nearest-point": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-equal": { + "node_modules/@turf/point-to-line-distance": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-6.5.0.tgz", - "integrity": "sha512-cY0M3yoLC26mhAnjv1gyYNQjn7wxIXmL2hBmI/qs8g5uKuC2hRWi13ydufE3k4x0aNRjFGlg41fjoYLwaVF+9Q==", + "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-6.5.0.tgz", + "integrity": "sha512-opHVQ4vjUhNBly1bob6RWy+F+hsZDH9SA0UW36pIRzfpu27qipU18xup0XXEePfY6+wvhF6yL/WgCO2IbrLqEA==", "dependencies": { - "@turf/clean-coords": "^6.5.0", + "@turf/bearing": "^6.5.0", + "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0", - "geojson-equality": "0.1.6" + "@turf/meta": "^6.5.0", + "@turf/projection": "^6.5.0", + "@turf/rhumb-bearing": "^6.5.0", + "@turf/rhumb-distance": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-equal/node_modules/@turf/helpers": { + "node_modules/@turf/points-within-polygon": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-6.5.0.tgz", + "integrity": "sha512-YyuheKqjliDsBDt3Ho73QVZk1VXX1+zIA2gwWvuz8bR1HXOkcuwk/1J76HuFMOQI3WK78wyAi+xbkx268PkQzQ==", + "dependencies": { + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-equal/node_modules/@turf/invariant": { + "node_modules/@turf/polygon-smooth": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/polygon-smooth/-/polygon-smooth-6.5.0.tgz", + "integrity": "sha512-LO/X/5hfh/Rk4EfkDBpLlVwt3i6IXdtQccDT9rMjXEP32tRgy0VMFmdkNaXoGlSSKf/1mGqLl4y4wHd86DqKbg==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-intersects": { + "node_modules/@turf/polygon-tangents": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-6.5.0.tgz", - "integrity": "sha512-nIxkizjRdjKCYFQMnml6cjPsDOBCThrt+nkqtSEcxkKMhAQj5OO7o2CecioNTaX8EayqwMGVKcsz27oP4mKPTw==", + "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-6.5.0.tgz", + "integrity": "sha512-sB4/IUqJMYRQH9jVBwqS/XDitkEfbyqRy+EH/cMRJURTg78eHunvJ708x5r6umXsbiUyQU4eqgPzEylWEQiunw==", "dependencies": { - "@turf/boolean-disjoint": "^6.5.0", + "@turf/bbox": "^6.5.0", + "@turf/boolean-within": "^6.5.0", + "@turf/explode": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "@turf/invariant": "^6.5.0", + "@turf/nearest-point": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-intersects/node_modules/@turf/helpers": { + "node_modules/@turf/polygon-to-line": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-6.5.0.tgz", + "integrity": "sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-overlap": { + "node_modules/@turf/polygonize": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-6.5.0.tgz", - "integrity": "sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==", + "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-6.5.0.tgz", + "integrity": "sha512-a/3GzHRaCyzg7tVYHo43QUChCspa99oK4yPqooVIwTC61npFzdrmnywMv0S+WZjHZwK37BrFJGFrZGf6ocmY5w==", "dependencies": { + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/envelope": "^6.5.0", "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-overlap": "^6.5.0", - "@turf/meta": "^6.5.0", - "geojson-equality": "0.1.6" + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-overlap/node_modules/@turf/helpers": { + "node_modules/@turf/projection": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-6.5.0.tgz", + "integrity": "sha512-/Pgh9mDvQWWu8HRxqpM+tKz8OzgauV+DiOcr3FCjD6ubDnrrmMJlsf6fFJmggw93mtVPrZRL6yyi9aYCQBOIvg==", + "dependencies": { + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-overlap/node_modules/@turf/invariant": { + "node_modules/@turf/random": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/random/-/random-6.5.0.tgz", + "integrity": "sha512-8Q25gQ/XbA7HJAe+eXp4UhcXM9aOOJFaxZ02+XSNwMvY8gtWSCBLVqRcW4OhqilgZ8PeuQDWgBxeo+BIqqFWFQ==", "dependencies": { "@turf/helpers": "^6.5.0" }, @@ -2565,32 +5065,38 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-parallel": { + "node_modules/@turf/rectangle-grid": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-6.5.0.tgz", - "integrity": "sha512-aSHJsr1nq9e5TthZGZ9CZYeXklJyRgR5kCLm5X4urz7+MotMOp/LsGOsvKvK9NeUl9+8OUmfMn8EFTT8LkcvIQ==", + "resolved": "https://registry.npmjs.org/@turf/rectangle-grid/-/rectangle-grid-6.5.0.tgz", + "integrity": "sha512-yQZ/1vbW68O2KsSB3OZYK+72aWz/Adnf7m2CMKcC+aq6TwjxZjAvlbCOsNUnMAuldRUVN1ph6RXMG4e9KEvKvg==", "dependencies": { - "@turf/clean-coords": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0" + "@turf/boolean-intersects": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-parallel/node_modules/@turf/helpers": { + "node_modules/@turf/rewind": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-6.5.0.tgz", + "integrity": "sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==", + "dependencies": { + "@turf/boolean-clockwise": "^6.5.0", + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-point-in-polygon": { + "node_modules/@turf/rhumb-bearing": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz", - "integrity": "sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==", + "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-6.5.0.tgz", + "integrity": "sha512-jMyqiMRK4hzREjQmnLXmkJ+VTNTx1ii8vuqRwJPcTlKbNWfjDz/5JqJlb5NaFDcdMpftWovkW5GevfnuzHnOYA==", "dependencies": { "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0" @@ -2599,29 +5105,22 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-point-in-polygon/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-point-in-polygon/node_modules/@turf/invariant": { + "node_modules/@turf/rhumb-destination": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-6.5.0.tgz", + "integrity": "sha512-RHNP1Oy+7xTTdRrTt375jOZeHceFbjwohPHlr9Hf68VdHHPMAWgAKqiX2YgSWDcvECVmiGaBKWus1Df+N7eE4Q==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-point-on-line": { + "node_modules/@turf/rhumb-distance": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-6.5.0.tgz", - "integrity": "sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==", + "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-6.5.0.tgz", + "integrity": "sha512-oKp8KFE8E4huC2Z1a1KNcFwjVOqa99isxNOwfo4g3SUABQ6NezjKDDrnvC4yI5YZ3/huDjULLBvhed45xdCrzg==", "dependencies": { "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0" @@ -2630,7133 +5129,7464 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-point-on-line/node_modules/@turf/helpers": { + "node_modules/@turf/sample": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-6.5.0.tgz", + "integrity": "sha512-kSdCwY7el15xQjnXYW520heKUrHwRvnzx8ka4eYxX9NFeOxaFITLW2G7UtXb6LJK8mmPXI8Aexv23F2ERqzGFg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-point-on-line/node_modules/@turf/invariant": { + "node_modules/@turf/sector": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-6.5.0.tgz", + "integrity": "sha512-cYUOkgCTWqa23SOJBqxoFAc/yGCUsPRdn/ovbRTn1zNTm/Spmk6hVB84LCKOgHqvSF25i0d2kWqpZDzLDdAPbw==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/circle": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-arc": "^6.5.0", + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-within": { + "node_modules/@turf/shortest-path": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-6.5.0.tgz", - "integrity": "sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==", + "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-6.5.0.tgz", + "integrity": "sha512-4de5+G7+P4hgSoPwn+SO9QSi9HY5NEV/xRJ+cmoFVRwv2CDsuOPDheHKeuIAhKyeKDvPvPt04XYWbac4insJMg==", "dependencies": { "@turf/bbox": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", + "@turf/clean-coords": "^6.5.0", + "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/transform-scale": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-within/node_modules/@turf/helpers": { + "node_modules/@turf/simplify": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-6.5.0.tgz", + "integrity": "sha512-USas3QqffPHUY184dwQdP8qsvcVH/PWBYdXY5am7YTBACaQOMAlf6AKJs9FT8jiO6fQpxfgxuEtwmox+pBtlOg==", + "dependencies": { + "@turf/clean-coords": "^6.5.0", + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-within/node_modules/@turf/invariant": { + "node_modules/@turf/square": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/square/-/square-6.5.0.tgz", + "integrity": "sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==", "dependencies": { + "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/buffer": { + "node_modules/@turf/square-grid": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-6.5.0.tgz", - "integrity": "sha512-qeX4N6+PPWbKqp1AVkBVWFerGjMYMUyencwfnkCesoznU6qvfugFHNAngNqIBVnJjZ5n8IFyOf+akcxnrt9sNg==", + "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-6.5.0.tgz", + "integrity": "sha512-mlR0ayUdA+L4c9h7p4k3pX6gPWHNGuZkt2c5II1TJRmhLkW2557d6b/Vjfd1z9OVaajb1HinIs1FMSAPXuuUrA==", "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/center": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/projection": "^6.5.0", - "d3-geo": "1.7.1", - "turf-jsts": "*" + "@turf/rectangle-grid": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/buffer/node_modules/@turf/helpers": { + "node_modules/@turf/standard-deviational-ellipse": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-6.5.0.tgz", + "integrity": "sha512-02CAlz8POvGPFK2BKK8uHGUk/LXb0MK459JVjKxLC2yJYieOBTqEbjP0qaWhiBhGzIxSMaqe8WxZ0KvqdnstHA==", + "dependencies": { + "@turf/center-mean": "^6.5.0", + "@turf/ellipse": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/points-within-polygon": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center": { + "node_modules/@turf/tag": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center/-/center-6.5.0.tgz", - "integrity": "sha512-T8KtMTfSATWcAX088rEDKjyvQCBkUsLnK/Txb6/8WUXIeOZyHu42G7MkdkHRoHtwieLdduDdmPLFyTdG5/e7ZQ==", + "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-6.5.0.tgz", + "integrity": "sha512-XwlBvrOV38CQsrNfrxvBaAPBQgXMljeU0DV8ExOyGM7/hvuGHJw3y8kKnQ4lmEQcmcrycjDQhP7JqoRv8vFssg==", "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0" + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-mean": { + "node_modules/@turf/tesselate": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-6.5.0.tgz", - "integrity": "sha512-AAX6f4bVn12pTVrMUiB9KrnV94BgeBKpyg3YpfnEbBpkN/znfVhL8dG8IxMAxAoSZ61Zt9WLY34HfENveuOZ7Q==", + "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-6.5.0.tgz", + "integrity": "sha512-M1HXuyZFCfEIIKkglh/r5L9H3c5QTEsnMBoZOFQiRnGPGmJWcaBissGb7mTFX2+DKE7FNWXh4TDnZlaLABB0dQ==", "dependencies": { - "@turf/bbox": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "earcut": "^2.0.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-mean/node_modules/@turf/helpers": { + "node_modules/@turf/tin": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-6.5.0.tgz", + "integrity": "sha512-YLYikRzKisfwj7+F+Tmyy/LE3d2H7D4kajajIfc9mlik2+esG7IolsX/+oUz1biguDYsG0DUA8kVYXDkobukfg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-median": { + "node_modules/@turf/transform-rotate": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-6.5.0.tgz", - "integrity": "sha512-dT8Ndu5CiZkPrj15PBvslpuf01ky41DEYEPxS01LOxp5HOUHXp1oJxsPxvc+i/wK4BwccPNzU1vzJ0S4emd1KQ==", + "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-6.5.0.tgz", + "integrity": "sha512-A2Ip1v4246ZmpssxpcL0hhiVBEf4L8lGnSPWTgSv5bWBEoya2fa/0SnFX9xJgP40rMP+ZzRaCN37vLHbv1Guag==", "dependencies": { - "@turf/center-mean": "^6.5.0", "@turf/centroid": "^6.5.0", - "@turf/distance": "^6.5.0", + "@turf/clone": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/rhumb-bearing": "^6.5.0", + "@turf/rhumb-destination": "^6.5.0", + "@turf/rhumb-distance": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-median/node_modules/@turf/distance": { + "node_modules/@turf/transform-scale": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-6.5.0.tgz", + "integrity": "sha512-VsATGXC9rYM8qTjbQJ/P7BswKWXHdnSJ35JlV4OsZyHBMxJQHftvmZJsFbOqVtQnIQIzf2OAly6rfzVV9QLr7g==", "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/center": "^6.5.0", + "@turf/centroid": "^6.5.0", + "@turf/clone": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/rhumb-bearing": "^6.5.0", + "@turf/rhumb-destination": "^6.5.0", + "@turf/rhumb-distance": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-median/node_modules/@turf/helpers": { + "node_modules/@turf/transform-translate": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-6.5.0.tgz", + "integrity": "sha512-NABLw5VdtJt/9vSstChp93pc6oel4qXEos56RBMsPlYB8hzNTEKYtC146XJvyF4twJeeYS8RVe1u7KhoFwEM5w==", + "dependencies": { + "@turf/clone": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/rhumb-destination": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-median/node_modules/@turf/invariant": { + "node_modules/@turf/triangle-grid": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-6.5.0.tgz", + "integrity": "sha512-2jToUSAS1R1htq4TyLQYPTIsoy6wg3e3BQXjm2rANzw4wPQCXGOxrur1Fy9RtzwqwljlC7DF4tg0OnWr8RjmfA==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/intersect": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-of-mass": { + "node_modules/@turf/truncate": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-6.5.0.tgz", - "integrity": "sha512-EWrriU6LraOfPN7m1jZi+1NLTKNkuIsGLZc2+Y8zbGruvUW+QV7K0nhf7iZWutlxHXTBqEXHbKue/o79IumAsQ==", + "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-6.5.0.tgz", + "integrity": "sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==", "dependencies": { - "@turf/centroid": "^6.5.0", - "@turf/convex": "^6.5.0", "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-of-mass/node_modules/@turf/helpers": { + "node_modules/@turf/turf": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-6.5.0.tgz", + "integrity": "sha512-ipMCPnhu59bh92MNt8+pr1VZQhHVuTMHklciQURo54heoxRzt1neNYZOBR6jdL+hNsbDGAECMuIpAutX+a3Y+w==", + "dependencies": { + "@turf/along": "^6.5.0", + "@turf/angle": "^6.5.0", + "@turf/area": "^6.5.0", + "@turf/bbox": "^6.5.0", + "@turf/bbox-clip": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", + "@turf/bearing": "^6.5.0", + "@turf/bezier-spline": "^6.5.0", + "@turf/boolean-clockwise": "^6.5.0", + "@turf/boolean-contains": "^6.5.0", + "@turf/boolean-crosses": "^6.5.0", + "@turf/boolean-disjoint": "^6.5.0", + "@turf/boolean-equal": "^6.5.0", + "@turf/boolean-intersects": "^6.5.0", + "@turf/boolean-overlap": "^6.5.0", + "@turf/boolean-parallel": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/boolean-point-on-line": "^6.5.0", + "@turf/boolean-within": "^6.5.0", + "@turf/buffer": "^6.5.0", + "@turf/center": "^6.5.0", + "@turf/center-mean": "^6.5.0", + "@turf/center-median": "^6.5.0", + "@turf/center-of-mass": "^6.5.0", + "@turf/centroid": "^6.5.0", + "@turf/circle": "^6.5.0", + "@turf/clean-coords": "^6.5.0", + "@turf/clone": "^6.5.0", + "@turf/clusters": "^6.5.0", + "@turf/clusters-dbscan": "^6.5.0", + "@turf/clusters-kmeans": "^6.5.0", + "@turf/collect": "^6.5.0", + "@turf/combine": "^6.5.0", + "@turf/concave": "^6.5.0", + "@turf/convex": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/difference": "^6.5.0", + "@turf/dissolve": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/distance-weight": "^6.5.0", + "@turf/ellipse": "^6.5.0", + "@turf/envelope": "^6.5.0", + "@turf/explode": "^6.5.0", + "@turf/flatten": "^6.5.0", + "@turf/flip": "^6.5.0", + "@turf/great-circle": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/hex-grid": "^6.5.0", + "@turf/interpolate": "^6.5.0", + "@turf/intersect": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/isobands": "^6.5.0", + "@turf/isolines": "^6.5.0", + "@turf/kinks": "^6.5.0", + "@turf/length": "^6.5.0", + "@turf/line-arc": "^6.5.0", + "@turf/line-chunk": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/line-offset": "^6.5.0", + "@turf/line-overlap": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/line-slice": "^6.5.0", + "@turf/line-slice-along": "^6.5.0", + "@turf/line-split": "^6.5.0", + "@turf/line-to-polygon": "^6.5.0", + "@turf/mask": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/midpoint": "^6.5.0", + "@turf/moran-index": "^6.5.0", + "@turf/nearest-point": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", + "@turf/nearest-point-to-line": "^6.5.0", + "@turf/planepoint": "^6.5.0", + "@turf/point-grid": "^6.5.0", + "@turf/point-on-feature": "^6.5.0", + "@turf/point-to-line-distance": "^6.5.0", + "@turf/points-within-polygon": "^6.5.0", + "@turf/polygon-smooth": "^6.5.0", + "@turf/polygon-tangents": "^6.5.0", + "@turf/polygon-to-line": "^6.5.0", + "@turf/polygonize": "^6.5.0", + "@turf/projection": "^6.5.0", + "@turf/random": "^6.5.0", + "@turf/rewind": "^6.5.0", + "@turf/rhumb-bearing": "^6.5.0", + "@turf/rhumb-destination": "^6.5.0", + "@turf/rhumb-distance": "^6.5.0", + "@turf/sample": "^6.5.0", + "@turf/sector": "^6.5.0", + "@turf/shortest-path": "^6.5.0", + "@turf/simplify": "^6.5.0", + "@turf/square": "^6.5.0", + "@turf/square-grid": "^6.5.0", + "@turf/standard-deviational-ellipse": "^6.5.0", + "@turf/tag": "^6.5.0", + "@turf/tesselate": "^6.5.0", + "@turf/tin": "^6.5.0", + "@turf/transform-rotate": "^6.5.0", + "@turf/transform-scale": "^6.5.0", + "@turf/transform-translate": "^6.5.0", + "@turf/triangle-grid": "^6.5.0", + "@turf/truncate": "^6.5.0", + "@turf/union": "^6.5.0", + "@turf/unkink-polygon": "^6.5.0", + "@turf/voronoi": "^6.5.0" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center-of-mass/node_modules/@turf/invariant": { + "node_modules/@turf/union": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "resolved": "https://registry.npmjs.org/@turf/union/-/union-6.5.0.tgz", + "integrity": "sha512-igYWCwP/f0RFHIlC2c0SKDuM/ObBaqSljI3IdV/x71805QbIvY/BYGcJdyNcgEA6cylIGl/0VSlIbpJHZ9ldhw==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "polygon-clipping": "^0.15.3" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/center/node_modules/@turf/helpers": { + "node_modules/@turf/unkink-polygon": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-6.5.0.tgz", + "integrity": "sha512-8QswkzC0UqKmN1DT6HpA9upfa1HdAA5n6bbuzHy8NJOX8oVizVAqfEPY0wqqTgboDjmBR4yyImsdPGUl3gZ8JQ==", + "dependencies": { + "@turf/area": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0", + "rbush": "^2.0.1" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/centroid": { + "node_modules/@turf/voronoi": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", - "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", + "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-6.5.0.tgz", + "integrity": "sha512-C/xUsywYX+7h1UyNqnydHXiun4UPjK88VDghtoRypR9cLlb7qozkiLRphQxxsCM0KxyxpVPHBVQXdAL3+Yurow==", "dependencies": { "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "@turf/invariant": "^6.5.0", + "d3-voronoi": "1.1.2" }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/centroid/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/@types/angular": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.8.5.tgz", + "integrity": "sha512-tifGGLxuKOEl7Z1BoAkZKpu+eEyfZ/0Ugm5imM+D1Vj+QzuhPQS0icI34laN3CLbksyfZQPGTQa0i+jjZdpiLw==", + "dev": true }, - "node_modules/@turf/circle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-6.5.0.tgz", - "integrity": "sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==", + "node_modules/@types/angular-animate": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@types/angular-animate/-/angular-animate-1.5.11.tgz", + "integrity": "sha512-JJL2BM9pTLz00oqXh09knxHOjKLBbMyb9k9/DNWWvQome42iMGD+R9+iKaFX6nnvmlMnhoO1wOGWvnOFHhkujg==", + "dev": true, "dependencies": { - "@turf/destination": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/angular": "*" } }, - "node_modules/@turf/circle/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@types/angular-aria": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@types/angular-aria/-/angular-aria-1.7.2.tgz", + "integrity": "sha512-kO0ZqfOIen/SSftPdqjLFKUF/7YMRsM5AJg/pjV/Gdl+cvPwCdriTF94G9o6i4alAfw7LG5KlmCQr2d/lmuSgw==", + "dev": true, + "dependencies": { + "@types/angular": "*" } }, - "node_modules/@turf/clean-coords": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-6.5.0.tgz", - "integrity": "sha512-EMX7gyZz0WTH/ET7xV8MyrExywfm9qUi0/MY89yNffzGIEHuFfqwhcCqZ8O00rZIPZHUTxpmsxQSTfzJJA1CPw==", + "node_modules/@types/angular-cookies": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/angular-cookies/-/angular-cookies-1.8.1.tgz", + "integrity": "sha512-wcc/YtJTSRQNFrbXMj9nW8jLKWAkY1j0NkVKtbKBqhrP4Oz0tT0/Gug/Gjks87nXERfT/+fBnLWQB+RFiceKJQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/angular": "*" } }, - "node_modules/@turf/clean-coords/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@types/angular-mocks": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@types/angular-mocks/-/angular-mocks-1.7.1.tgz", + "integrity": "sha512-44kaQL8sMGUIDV76zbJ3MX6aqPng7Wmfz91uds+WcNQFHTdSu6KDZNIypIZVAdrWnJfqrfL5VysaCejTW3JVIw==", + "dev": true, + "dependencies": { + "@types/angular": "*" } }, - "node_modules/@turf/clean-coords/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/@types/angular-resource": { + "version": "1.5.17", + "resolved": "https://registry.npmjs.org/@types/angular-resource/-/angular-resource-1.5.17.tgz", + "integrity": "sha512-HPyxurb0qxkytQY/zwunMrdx/Hlb+VZ1Neiq3tL1J+HtdVvA1AgNcGTY5aonH3uqbLnKrBASdRbfvtAxT3GCXg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/angular": "*" } }, - "node_modules/@turf/clone": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-6.5.0.tgz", - "integrity": "sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==", + "node_modules/@types/angular-route": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@types/angular-route/-/angular-route-1.7.3.tgz", + "integrity": "sha512-ej7nZnKUNy3w4zXPfHa28lEhD/1gfEct/BfXvenS+kXUyy7Fbang5qFyEY0pNjAdKMhXoV42qTY+v1v6envLUA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/angular": "*" } }, - "node_modules/@turf/clone/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@types/angular-sanitize": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/angular-sanitize/-/angular-sanitize-1.8.1.tgz", + "integrity": "sha512-tQ6kyi7Q5iWv5k3yFmpqzTaBe1ZiCF5+rlGgmyLO/4ltu2ELXMPDnq38KACwNnHVWuLJJXXn2V+TfMFwUvF5qw==", + "dev": true, + "dependencies": { + "@types/angular": "*" } }, - "node_modules/@turf/clusters": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-6.5.0.tgz", - "integrity": "sha512-Y6gfnTJzQ1hdLfCsyd5zApNbfLIxYEpmDibHUqR5z03Lpe02pa78JtgrgUNt1seeO/aJ4TG1NLN8V5gOrHk04g==", + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@turf/clusters-dbscan": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-6.5.0.tgz", - "integrity": "sha512-SxZEE4kADU9DqLRiT53QZBBhu8EP9skviSyl+FGj08Y01xfICM/RR9ACUdM0aEQimhpu+ZpRVcUK+2jtiCGrYQ==", + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "density-clustering": "1.3.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/node": "*" } }, - "node_modules/@turf/clusters-dbscan/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/node": "*" } }, - "node_modules/@turf/clusters-dbscan/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/@turf/clusters-dbscan/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@turf/clusters-kmeans": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-6.5.0.tgz", - "integrity": "sha512-DwacD5+YO8kwDPKaXwT9DV46tMBVNsbi1IzdajZu1JDSWoN7yc7N9Qt88oi+p30583O0UPVkAK+A10WAQv4mUw==", + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "skmeans": "0.9.7" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@turf/clusters-kmeans/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true }, - "node_modules/@turf/clusters-kmeans/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/@turf/clusters/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/@turf/collect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-6.5.0.tgz", - "integrity": "sha512-4dN/T6LNnRg099m97BJeOcTA5fSI8cu87Ydgfibewd2KQwBexO69AnjEFqfPX3Wj+Zvisj1uAVIZbPmSSrZkjg==", + "node_modules/@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "rbush": "2.x" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/node": "*" } }, - "node_modules/@turf/collect/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@types/jasmine": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.5.tgz", + "integrity": "sha512-9YHUdvuNDDRJYXZwHqSsO72Ok0vmqoJbNn73ttyITQp/VA60SarnZ+MPLD37rJAhVoKp+9BWOvJP5tHIRfZylQ==", + "dev": true + }, + "node_modules/@types/jquery": { + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", + "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "dev": true, + "dependencies": { + "@types/sizzle": "*" } }, - "node_modules/@turf/collect/node_modules/quickselect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", - "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.4.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.8.tgz", + "integrity": "sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", + "optional": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true }, - "node_modules/@turf/collect/node_modules/rbush": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", - "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, "dependencies": { - "quickselect": "^1.0.1" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/@turf/combine": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-6.5.0.tgz", - "integrity": "sha512-Q8EIC4OtAcHiJB3C4R+FpB4LANiT90t17uOd851qkM2/o6m39bfN5Mv0PWqMZIHWrrosZqRqoY9dJnzz/rJxYQ==", + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/express": "*" } }, - "node_modules/@turf/combine/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" } }, - "node_modules/@turf/concave": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-6.5.0.tgz", - "integrity": "sha512-I/sUmUC8TC5h/E2vPwxVht+nRt+TnXIPRoztDFvS8/Y0+cBDple9inLSo9nnPXMXidrBlGXZ9vQx/BjZUJgsRQ==", + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/tin": "^6.5.0", - "topojson-client": "3.x", - "topojson-server": "3.x" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/node": "*" } }, - "node_modules/@turf/concave/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@types/node": "*" } }, - "node_modules/@turf/concave/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" } }, - "node_modules/@turf/concave/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" } }, - "node_modules/@turf/convex": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-6.5.0.tgz", - "integrity": "sha512-x7ZwC5z7PJB0SBwNh7JCeCNx7Iu+QSrH7fYgK0RhhNop13TqUlvHMirMLRgf2db1DqUetrAO2qHJeIuasquUWg==", + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "concaveman": "*" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, - "node_modules/@turf/convex/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true }, - "node_modules/@turf/destination": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz", - "integrity": "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true }, - "node_modules/@turf/destination/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true }, - "node_modules/@turf/destination/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" } }, - "node_modules/@turf/difference": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-6.5.0.tgz", - "integrity": "sha512-l8iR5uJqvI+5Fs6leNbhPY5t/a3vipUF/3AeVLpwPQcgmedNXyheYuy07PcMGH5Jdpi5gItOiTqwiU/bUH4b3A==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, - "node_modules/@turf/difference/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/@turf/difference/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@xtuc/long": "4.2.2" } }, - "node_modules/@turf/dissolve": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-6.5.0.tgz", - "integrity": "sha512-WBVbpm9zLTp0Bl9CE35NomTaOL1c4TQCtEoO43YaAhNEWJOOIhZMFJyr8mbvYruKl817KinT3x7aYjjCMjTAsQ==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, - "node_modules/@turf/dissolve/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } - }, - "node_modules/@turf/dissolve/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, - "node_modules/@turf/distance": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-5.1.5.tgz", - "integrity": "sha1-Oc8YIEu/h1h9cH5gmmARiQkVZAk=", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^5.1.5", - "@turf/invariant": "^5.1.5" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/@turf/distance-weight": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance-weight/-/distance-weight-6.5.0.tgz", - "integrity": "sha512-a8qBKkgVNvPKBfZfEJZnC3DV7dfIsC3UIdpRci/iap/wZLH41EmS90nM+BokAJflUHYy8PqE44wySGWHN1FXrQ==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, "dependencies": { - "@turf/centroid": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" } }, - "node_modules/@turf/distance-weight/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" } }, - "node_modules/@turf/distance-weight/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "envinfo": "^7.7.3" }, - "funding": { - "url": "https://opencollective.com/turf" + "peerDependencies": { + "webpack-cli": "4.x.x" } }, - "node_modules/@turf/ellipse": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-6.5.0.tgz", - "integrity": "sha512-kuXtwFviw/JqnyJXF1mrR/cb496zDTSbGKtSiolWMNImYzGGkbsAsFTjwJYgD7+4FixHjp0uQPzo70KDf3AIBw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/transform-rotate": "^6.5.0" + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" }, - "funding": { - "url": "https://opencollective.com/turf" + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/@turf/ellipse/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, - "node_modules/@turf/ellipse/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@turf/envelope": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-6.5.0.tgz", - "integrity": "sha512-9Z+FnBWvOGOU4X+fMZxYFs1HjFlkKqsddLuMknRaqcJd6t+NIv5DWvPtDL8ATD2GEExYDiFLwMdckfr1yqJgHA==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0" + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@turf/envelope/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" } }, - "node_modules/@turf/explode": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-6.5.0.tgz", - "integrity": "sha512-6cSvMrnHm2qAsace6pw9cDmK2buAlw8+tjeJVXMfMyY+w7ZUi1rprWMsY92J7s2Dar63Bv09n56/1V7+tcj52Q==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@turf/explode/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" } }, - "node_modules/@turf/flatten": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-6.5.0.tgz", - "integrity": "sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==", + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=8.9.0" } }, - "node_modules/@turf/flatten/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "engines": { + "node": ">=0.8" } }, - "node_modules/@turf/flip": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-6.5.0.tgz", - "integrity": "sha512-oyikJFNjt2LmIXQqgOGLvt70RgE2lyzPMloYWM7OR5oIFGRiBvqVD2hA6MNw6JewIm30fWZ8DQJw1NHXJTJPbg==", + "node_modules/admin-lte": { + "version": "2.4.18", + "resolved": "https://registry.npmjs.org/admin-lte/-/admin-lte-2.4.18.tgz", + "integrity": "sha512-AfIdoUWdbQA0OmW7PnP8GJ3u6RMKNXefN3DRTBHCQXd7VeyJahUfZWtV62ppDxcdjpx0L08ypPV55ARmdGdOIw==", "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "bootstrap": "^3.4", + "bootstrap-colorpicker": "^2.5.3", + "bootstrap-datepicker": "^1.8", + "bootstrap-daterangepicker": "^2.1.25", + "bootstrap-slider": "^9.10.0", + "chart.js": "^1", + "ckeditor": "^4.11.2", + "datatables.net": "^1.10.19", + "datatables.net-bs": "^1.10.19", + "fastclick": "^1.0.6", + "flot": "^0.8.3", + "font-awesome": "^4.7", + "fullcalendar": "^3.10", + "inputmask": "^3.3.7", + "ion-rangeslider": "^2.3", + "ionicons": "^3", + "jquery": "^3.4.1", + "jquery-knob": "^1.2.11", + "jquery-sparkline": "^2.4", + "jquery-ui": "^1.12.1", + "jvectormap": "^1.2.2", + "moment": "^2.24", + "morris.js": "^0.5", + "pace": "0.0.4", + "raphael": "^2.2.7", + "select2": "^4.0.3", + "slimscroll": "^0.9.1" } }, - "node_modules/@turf/flip/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/ag-grid-community": { + "version": "26.2.1", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-26.2.1.tgz", + "integrity": "sha512-aChSGNdPkBda4BhOUUEAmAkRlIG7rFU8UTXx3NPStavrCOHKLDRV90djIKuiXfM6ONBqKmeqw2as0yuLnSN8dw==" }, - "node_modules/@turf/great-circle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-6.5.0.tgz", - "integrity": "sha512-7ovyi3HaKOXdFyN7yy1yOMa8IyOvV46RC1QOQTT+RYUN8ke10eyqExwBpL9RFUPvlpoTzoYbM/+lWPogQlFncg==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "debug": "4" }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/great-circle/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/@turf/great-circle/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 8.0.0" } }, - "node_modules/@turf/helpers": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", - "integrity": "sha1-FTQFInq5M9AEpbuWQantmZ/L4M8=" - }, - "node_modules/@turf/hex-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-6.5.0.tgz", - "integrity": "sha512-Ln3tc2tgZT8etDOldgc6e741Smg1CsMKAz1/Mlel+MEL5Ynv2mhx3m0q4J9IB1F3a4MNjDeVvm8drAaf9SF33g==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/intersect": "^6.5.0", - "@turf/invariant": "^6.5.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=8" } }, - "node_modules/@turf/hex-grid/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://opencollective.com/turf" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@turf/hex-grid/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@turf/hex-grid/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "url": "https://opencollective.com/turf" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/@turf/interpolate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-6.5.0.tgz", - "integrity": "sha512-LSH5fMeiGyuDZ4WrDJNgh81d2DnNDUVJtuFryJFup8PV8jbs46lQGfI3r1DJ2p1IlEJIz3pmAZYeTfMMoeeohw==", + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dev": true, "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/hex-grid": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/point-grid": "^6.5.0", - "@turf/square-grid": "^6.5.0", - "@turf/triangle-grid": "^6.5.0" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/interpolate/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/align-text/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "is-buffer": "^1.1.5" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/interpolate/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/angular": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz", + "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==", + "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + }, + "node_modules/angular-legacy-sortablejs-maintained": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/angular-legacy-sortablejs-maintained/-/angular-legacy-sortablejs-maintained-0.6.2.tgz", + "integrity": "sha512-rZA9LImEc+Q/OUYK8apg2iN7KCslrU6Dctk4hwY0ZDfFsWLzybHbMx97lqXK4J2crv41MQictW4D0PIIk4YfFA==", + "peerDependencies": { + "sortablejs": ">=1.5.x" } }, - "node_modules/@turf/interpolate/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/angular-route": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.8.3.tgz", + "integrity": "sha512-kpIcRmDR2+o1FxDVVYy8Rvfab86/7LDbOgTRb9T+X9ewPQiBRuDEnZtM3oJYBiQLvAXDYTJXHV48n/bGE9Mv2g==", + "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + }, + "node_modules/angular-sanitize": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.8.3.tgz", + "integrity": "sha512-2rxdqzlUVafUeWOwvY/FtyWk1pFTyCtzreeiTytG9m4smpuAEKaIJAjYeVwWsoV+nlTOcgpwV4W1OCmR+BQbUg==", + "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + }, + "node_modules/angular-ui-bootstrap": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/angular-ui-bootstrap/-/angular-ui-bootstrap-2.5.6.tgz", + "integrity": "sha512-yzcHpPMLQl0232nDzm5P4iAFTFQ9dMw0QgFLuKYbDj9M0xJ62z0oudYD/Lvh1pWfRsukiytP4Xj6BHOSrSXP8A==" + }, + "node_modules/angularjs-dropdown-multiselect": { + "version": "2.0.0-beta.10", + "resolved": "https://registry.npmjs.org/angularjs-dropdown-multiselect/-/angularjs-dropdown-multiselect-2.0.0-beta.10.tgz", + "integrity": "sha512-dZosCLW0xO4s/yjGGShlBje/R+gPFjs5XO18XL6TujHSGr/Sq6I6snu28E5fLqdgGxYVfQn/yEXlM2n8QnM89Q==", "dependencies": { - "@turf/helpers": "^6.5.0" + "angular": "~1" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=0.10.10" } }, - "node_modules/@turf/intersect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-6.5.0.tgz", - "integrity": "sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==", + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" + "string-width": "^4.1.0" } }, - "node_modules/@turf/intersect/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/@turf/intersect/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@turf/invariant": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.1.5.tgz", - "integrity": "sha1-9Z9P76CSJLFdzhZR+QPIaNV6JOE=", - "dependencies": { - "@turf/helpers": "^5.1.5" + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" } }, - "node_modules/@turf/isobands": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-6.5.0.tgz", - "integrity": "sha512-4h6sjBPhRwMVuFaVBv70YB7eGz+iw0bhPRnp+8JBdX1UPJSXhoi/ZF2rACemRUr0HkdVB/a1r9gC32vn5IAEkw==", - "dependencies": { - "@turf/area": "^6.5.0", - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "object-assign": "*" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" } }, - "node_modules/@turf/isobands/node_modules/@turf/area": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", - "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/isobands/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=4" } }, - "node_modules/@turf/isobands/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { - "@turf/helpers": "^6.5.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 8" } }, - "node_modules/@turf/isolines": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-6.5.0.tgz", - "integrity": "sha512-6ElhiLCopxWlv4tPoxiCzASWt/jMRvmp6mRYrpzOm3EUl75OhHKa/Pu6Y9nWtCMmVC/RcWtiiweUocbPLZLm0A==", + "node_modules/append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "object-assign": "*" + "default-require-extensions": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=4" } }, - "node_modules/@turf/isolines/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, - "node_modules/@turf/isolines/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 10" } }, - "node_modules/@turf/kinks": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-6.5.0.tgz", - "integrity": "sha512-ViCngdPt1eEL7hYUHR2eHR662GvCgTc35ZJFaNR6kRtr6D8plLaDju0FILeFFWSc+o8e3fwxZEJKmFj9IzPiIQ==", + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 6" } }, - "node_modules/@turf/kinks/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, - "node_modules/@turf/length": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/length/-/length-5.1.5.tgz", - "integrity": "sha1-86X4ZMK5lqi7RxeUU1ofrxLuvvs=", + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { - "@turf/distance": "^5.1.5", - "@turf/helpers": "^5.1.5", - "@turf/meta": "^5.1.5" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/@turf/length/node_modules/@turf/meta": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz", - "integrity": "sha1-OxrUhe4MOwsXdRMqMsOE1T5LpT0=", + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { - "@turf/helpers": "^5.1.5" + "safe-buffer": "~5.1.0" } }, - "node_modules/@turf/line-arc": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-6.5.0.tgz", - "integrity": "sha512-I6c+V6mIyEwbtg9P9zSFF89T7QPe1DPTG3MJJ6Cm1MrAY0MdejwQKOpsvNl8LDU2ekHOlz2kHpPVR7VJsoMllA==", + "node_modules/archiver/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, "dependencies": { - "@turf/circle": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/helpers": "^6.5.0" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@turf/line-arc/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, - "node_modules/@turf/line-chunk": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-6.5.0.tgz", - "integrity": "sha512-i1FGE6YJaaYa+IJesTfyRRQZP31QouS+wh/pa6O3CC0q4T7LtHigyBSYjrbjSLfn2EVPYGlPCMFEqNWCOkC6zg==", + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/length": "^6.5.0", - "@turf/line-slice-along": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "sprintf-js": "~1.0.2" } }, - "node_modules/@turf/line-chunk/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@turf/line-chunk/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/line-chunk/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/line-chunk/node_modules/@turf/length": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/length/-/length-6.5.0.tgz", - "integrity": "sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==", - "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true }, - "node_modules/@turf/line-intersect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-6.5.0.tgz", - "integrity": "sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "geojson-rbush": "3.x" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/line-intersect/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/@turf/line-intersect/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/array.prototype.map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", + "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-offset": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-6.5.0.tgz", - "integrity": "sha512-CEXZbKgyz8r72qRvPchK0dxqsq8IQBdH275FE6o4MrBkzMcoZsfSjghtXzKaz9vvro+HfIXal0sTk2mqV1lQTw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@turf/line-offset/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" } }, - "node_modules/@turf/line-offset/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/@turf/line-overlap": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-6.5.0.tgz", - "integrity": "sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==", + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dependencies": { - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "deep-equal": "1.x", - "geojson-rbush": "3.x" - }, - "funding": { - "url": "https://opencollective.com/turf" + "object-assign": "^4.1.1", + "util": "0.10.3" } }, - "node_modules/@turf/line-overlap/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" } }, - "node_modules/@turf/line-overlap/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "inherits": "2.0.1" } }, - "node_modules/@turf/line-segment": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz", - "integrity": "sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" + "tslib": "^2.0.1" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=4" } }, - "node_modules/@turf/line-segment/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true }, - "node_modules/@turf/line-segment/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "retry": "0.13.1" } }, - "node_modules/@turf/line-slice": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-6.5.0.tgz", - "integrity": "sha512-vDqJxve9tBHhOaVVFXqVjF5qDzGtKWviyjbyi2QnSnxyFAmLlLnBfMX8TLQCAf2GxHibB95RO5FBE6I2KVPRuw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/async-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" } }, - "node_modules/@turf/line-slice-along": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-6.5.0.tgz", - "integrity": "sha512-KHJRU6KpHrAj+BTgTNqby6VCTnDzG6a1sJx/I3hNvqMBLvWVA2IrkR9L9DtsQsVY63IBwVdQDqiwCuZLDQh4Ng==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 4.5.0" } }, - "node_modules/@turf/line-slice-along/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-slice-along/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/@turf/line-slice-along/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@turf/line-slice/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" } }, - "node_modules/@turf/line-slice/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, - "node_modules/@turf/line-split": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-6.5.0.tgz", - "integrity": "sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "@turf/square": "^6.5.0", - "@turf/truncate": "^6.5.0", - "geojson-rbush": "3.x" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/line-split/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/line-split/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/line-to-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-6.5.0.tgz", - "integrity": "sha512-qYBuRCJJL8Gx27OwCD1TMijM/9XjRgXH/m/TyuND4OXedBpIWlK5VbTIO2gJ8OCfznBBddpjiObLBrkuxTpN4Q==", + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "ansi-regex": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/line-to-polygon/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@turf/line-to-polygon/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" } }, - "node_modules/@turf/mask": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-6.5.0.tgz", - "integrity": "sha512-RQha4aU8LpBrmrkH8CPaaoAfk0Egj5OuXtv6HuCQnHeGNOQt3TQVibTA3Sh4iduq4EPxnZfDjgsOeKtrCA19lg==", + "node_modules/babel-core/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" + "ms": "2.0.0" } }, - "node_modules/@turf/mask/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-core/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/@turf/meta": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", - "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/babel-core/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "node_modules/@turf/meta/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-core/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/midpoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-6.5.0.tgz", - "integrity": "sha512-MyTzV44IwmVI6ec9fB2OgZ53JGNlgOpaYl9ArKoF49rXpL84F9rNATndbe0+MQIhdkw8IlzA6xVP4lZzfMNVCw==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/midpoint/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, - "node_modules/@turf/midpoint/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-generator/node_modules/jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/@turf/midpoint/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/moran-index": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/moran-index/-/moran-index-6.5.0.tgz", - "integrity": "sha512-ItsnhrU2XYtTtTudrM8so4afBCYWNaB0Mfy28NZwLjB5jWuAsvyV+YW+J88+neK/ougKMTawkmjQqodNJaBeLQ==", + "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", + "dev": true, "dependencies": { - "@turf/distance-weight": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/moran-index/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/nearest-point": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-6.5.0.tgz", - "integrity": "sha512-fguV09QxilZv/p94s8SMsXILIAMiaXI5PATq9d7YWijLxWUj6Q/r43kxyoi78Zmwwh1Zfqz9w+bCYUAxZ5+euA==", + "node_modules/babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==", + "dev": true, "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "node_modules/@turf/nearest-point-on-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz", - "integrity": "sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/nearest-point-on-line/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/nearest-point-on-line/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/nearest-point-on-line/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/nearest-point-to-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-6.5.0.tgz", - "integrity": "sha512-PXV7cN0BVzUZdjj6oeb/ESnzXSfWmEMrsfZSDRgqyZ9ytdiIj/eRsnOXLR13LkTdXVOJYDBuf7xt1mLhM4p6+Q==", + "node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/point-to-line-distance": "^6.5.0", - "object-assign": "*" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/nearest-point-to-line/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "node_modules/@turf/nearest-point-to-line/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/nearest-point/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/nearest-point/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/@turf/nearest-point/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, - "node_modules/@turf/planepoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-6.5.0.tgz", - "integrity": "sha512-R3AahA6DUvtFbka1kcJHqZ7DMHmPXDEQpbU5WaglNn7NaCQg9HB0XM0ZfqWcd5u92YXV+Gg8QhC8x5XojfcM4Q==", + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/planepoint/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-angularjs-annotate": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz", + "integrity": "sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/types": "^7.2.0", + "simple-is": "~0.2.0" } }, - "node_modules/@turf/planepoint/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/point-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-6.5.0.tgz", - "integrity": "sha512-Iq38lFokNNtQJnOj/RBKmyt6dlof0yhaHEDELaWHuECm1lIZLY3ZbVMwbs+nXkwTAHjKfS/OtMheUBkw+ee49w==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, "dependencies": { - "@turf/boolean-within": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=8" } }, - "node_modules/@turf/point-grid/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", + "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.1", + "@nicolo-ribaudo/semver-v6": "^6.3.3" }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/point-grid/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@turf/point-grid/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", + "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "@babel/helper-define-polyfill-provider": "^0.4.1", + "core-js-compat": "^3.31.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@turf/point-on-feature": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-6.5.0.tgz", - "integrity": "sha512-bDpuIlvugJhfcF/0awAQ+QI6Om1Y1FFYE8Y/YdxGRongivix850dTeXCo0mDylFdWFPGDo7Mmh9Vo4VxNwW/TA==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", + "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", + "dev": true, "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/nearest-point": "^6.5.0" + "@babel/helper-define-polyfill-provider": "^0.4.1" }, - "funding": { - "url": "https://opencollective.com/turf" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@turf/point-on-feature/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==", + "dev": true }, - "node_modules/@turf/point-to-line-distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-6.5.0.tgz", - "integrity": "sha512-opHVQ4vjUhNBly1bob6RWy+F+hsZDH9SA0UW36pIRzfpu27qipU18xup0XXEePfY6+wvhF6yL/WgCO2IbrLqEA==", + "node_modules/babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", + "dev": true + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==", + "dev": true + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==", + "dev": true + }, + "node_modules/babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==", + "dev": true, "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/projection": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/point-to-line-distance/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/point-to-line-distance/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/point-to-line-distance/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "node_modules/@turf/points-within-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-6.5.0.tgz", - "integrity": "sha512-YyuheKqjliDsBDt3Ho73QVZk1VXX1+zIA2gwWvuz8bR1HXOkcuwk/1J76HuFMOQI3WK78wyAi+xbkx268PkQzQ==", + "node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==", + "dev": true, "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/points-within-polygon/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/@turf/polygon-smooth": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-smooth/-/polygon-smooth-6.5.0.tgz", - "integrity": "sha512-LO/X/5hfh/Rk4EfkDBpLlVwt3i6IXdtQccDT9rMjXEP32tRgy0VMFmdkNaXoGlSSKf/1mGqLl4y4wHd86DqKbg==", + "node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/polygon-smooth/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/polygon-tangents": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-6.5.0.tgz", - "integrity": "sha512-sB4/IUqJMYRQH9jVBwqS/XDitkEfbyqRy+EH/cMRJURTg78eHunvJ708x5r6umXsbiUyQU4eqgPzEylWEQiunw==", + "node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==", + "dev": true, "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-within": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/nearest-point": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/polygon-tangents/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/polygon-tangents/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/polygon-to-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-6.5.0.tgz", - "integrity": "sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw==", + "node_modules/babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/@turf/polygon-to-line/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "dependencies": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, - "node_modules/@turf/polygon-to-line/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/@turf/polygonize": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-6.5.0.tgz", - "integrity": "sha512-a/3GzHRaCyzg7tVYHo43QUChCspa99oK4yPqooVIwTC61npFzdrmnywMv0S+WZjHZwK37BrFJGFrZGf6ocmY5w==", + "node_modules/babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==", + "dev": true, "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/envelope": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/@turf/polygonize/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==", + "dev": true, + "dependencies": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/polygonize/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/projection": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-6.5.0.tgz", - "integrity": "sha512-/Pgh9mDvQWWu8HRxqpM+tKz8OzgauV+DiOcr3FCjD6ubDnrrmMJlsf6fFJmggw93mtVPrZRL6yyi9aYCQBOIvg==", + "node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==", + "dev": true, "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/projection/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/random": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/random/-/random-6.5.0.tgz", - "integrity": "sha512-8Q25gQ/XbA7HJAe+eXp4UhcXM9aOOJFaxZ02+XSNwMvY8gtWSCBLVqRcW4OhqilgZ8PeuQDWgBxeo+BIqqFWFQ==", + "node_modules/babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/random/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/rectangle-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rectangle-grid/-/rectangle-grid-6.5.0.tgz", - "integrity": "sha512-yQZ/1vbW68O2KsSB3OZYK+72aWz/Adnf7m2CMKcC+aq6TwjxZjAvlbCOsNUnMAuldRUVN1ph6RXMG4e9KEvKvg==", + "node_modules/babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==", + "dev": true, "dependencies": { - "@turf/boolean-intersects": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/rectangle-grid/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, - "node_modules/@turf/rectangle-grid/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-es2015-unicode-regex/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/@turf/rectangle-grid/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-transform-es2015-unicode-regex/node_modules/regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, - "node_modules/@turf/rewind": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-6.5.0.tgz", - "integrity": "sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==", + "node_modules/babel-plugin-transform-es2015-unicode-regex/node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", + "dev": true, "dependencies": { - "@turf/boolean-clockwise": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" + "jsesc": "~0.5.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/@turf/rewind/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", + "dev": true, + "dependencies": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "node_modules/@turf/rewind/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, - "node_modules/@turf/rhumb-bearing": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-6.5.0.tgz", - "integrity": "sha512-jMyqiMRK4hzREjQmnLXmkJ+VTNTx1ii8vuqRwJPcTlKbNWfjDz/5JqJlb5NaFDcdMpftWovkW5GevfnuzHnOYA==", + "node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "regenerator-transform": "^0.10.0" } }, - "node_modules/@turf/rhumb-bearing/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-plugin-transform-regenerator/node_modules/regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, - "node_modules/@turf/rhumb-bearing/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/@turf/rhumb-destination": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-6.5.0.tgz", - "integrity": "sha512-RHNP1Oy+7xTTdRrTt375jOZeHceFbjwohPHlr9Hf68VdHHPMAWgAKqiX2YgSWDcvECVmiGaBKWus1Df+N7eE4Q==", + "node_modules/babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" } }, - "node_modules/@turf/rhumb-destination/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/babel-polyfill/node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true }, - "node_modules/@turf/rhumb-destination/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, - "node_modules/@turf/rhumb-distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-6.5.0.tgz", - "integrity": "sha512-oKp8KFE8E4huC2Z1a1KNcFwjVOqa99isxNOwfo4g3SUABQ6NezjKDDrnvC4yI5YZ3/huDjULLBvhed45xdCrzg==", + "node_modules/babel-preset-env/node_modules/browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" }, - "funding": { - "url": "https://opencollective.com/turf" + "bin": { + "browserslist": "cli.js" } }, - "node_modules/@turf/rhumb-distance/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-preset-env/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/@turf/rhumb-distance/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, - "node_modules/@turf/sample": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-6.5.0.tgz", - "integrity": "sha512-kSdCwY7el15xQjnXYW520heKUrHwRvnzx8ka4eYxX9NFeOxaFITLW2G7UtXb6LJK8mmPXI8Aexv23F2ERqzGFg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-register/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/sample/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-register/node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" } }, - "node_modules/@turf/sector": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-6.5.0.tgz", - "integrity": "sha512-cYUOkgCTWqa23SOJBqxoFAc/yGCUsPRdn/ovbRTn1zNTm/Spmk6hVB84LCKOgHqvSF25i0d2kWqpZDzLDdAPbw==", + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, "dependencies": { - "@turf/circle": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-arc": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "node_modules/@turf/sector/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, - "node_modules/@turf/sector/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, - "node_modules/@turf/shortest-path": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-6.5.0.tgz", - "integrity": "sha512-4de5+G7+P4hgSoPwn+SO9QSi9HY5NEV/xRJ+cmoFVRwv2CDsuOPDheHKeuIAhKyeKDvPvPt04XYWbac4insJMg==", + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/clean-coords": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/transform-scale": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, - "node_modules/@turf/shortest-path/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/babel-traverse/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "ms": "2.0.0" } }, - "node_modules/@turf/shortest-path/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/shortest-path/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, - "node_modules/@turf/simplify": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-6.5.0.tgz", - "integrity": "sha512-USas3QqffPHUY184dwQdP8qsvcVH/PWBYdXY5am7YTBACaQOMAlf6AKJs9FT8jiO6fQpxfgxuEtwmox+pBtlOg==", - "dependencies": { - "@turf/clean-coords": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/simplify/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" } }, - "node_modules/@turf/square": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/square/-/square-6.5.0.tgz", - "integrity": "sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==", - "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" } }, - "node_modules/@turf/square-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-6.5.0.tgz", - "integrity": "sha512-mlR0ayUdA+L4c9h7p4k3pX6gPWHNGuZkt2c5II1TJRmhLkW2557d6b/Vjfd1z9OVaajb1HinIs1FMSAPXuuUrA==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/rectangle-grid": "^6.5.0" + "safe-buffer": "5.1.2" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 0.8" } }, - "node_modules/@turf/square-grid/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "dev": true, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/@turf/square/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "tweetnacl": "^0.14.3" } }, - "node_modules/@turf/square/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true }, - "node_modules/@turf/square/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" } }, - "node_modules/@turf/standard-deviational-ellipse": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-6.5.0.tgz", - "integrity": "sha512-02CAlz8POvGPFK2BKK8uHGUk/LXb0MK459JVjKxLC2yJYieOBTqEbjP0qaWhiBhGzIxSMaqe8WxZ0KvqdnstHA==", - "dependencies": { - "@turf/center-mean": "^6.5.0", - "@turf/ellipse": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/points-within-polygon": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" } }, - "node_modules/@turf/standard-deviational-ellipse/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" } }, - "node_modules/@turf/standard-deviational-ellipse/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/bind-obj-methods": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.2.tgz", + "integrity": "sha512-bUkRdEOppT1Xg/jG0+bp0JSjUD9U0r7skxb/42WeBUjfBpW6COQTIgQmKX5J2Z3aMXcORKgN2N+d7IQwTK3pag==", + "dev": true }, - "node_modules/@turf/tag": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-6.5.0.tgz", - "integrity": "sha512-XwlBvrOV38CQsrNfrxvBaAPBQgXMljeU0DV8ExOyGM7/hvuGHJw3y8kKnQ4lmEQcmcrycjDQhP7JqoRv8vFssg==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/@turf/tag/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/blobjs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/blobjs/-/blobjs-1.1.1.tgz", + "integrity": "sha512-WmY2n/bRFkuPUJXx72sc21Z7n20qJ52qsN0pzxM4lYM5K7/kB1o0TYVjeMiC74/iUELdC/Gor8fTkLA5MR+eIQ==" }, - "node_modules/@turf/tesselate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-6.5.0.tgz", - "integrity": "sha512-M1HXuyZFCfEIIKkglh/r5L9H3c5QTEsnMBoZOFQiRnGPGmJWcaBissGb7mTFX2+DKE7FNWXh4TDnZlaLABB0dQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "earcut": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "node_modules/@turf/tesselate/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==", + "dev": true, + "dependencies": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" } }, - "node_modules/@turf/tin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-6.5.0.tgz", - "integrity": "sha512-YLYikRzKisfwj7+F+Tmyy/LE3d2H7D4kajajIfc9mlik2+esG7IolsX/+oUz1biguDYsG0DUA8kVYXDkobukfg==", + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/@turf/tin/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@turf/transform-rotate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-6.5.0.tgz", - "integrity": "sha512-A2Ip1v4246ZmpssxpcL0hhiVBEf4L8lGnSPWTgSv5bWBEoya2fa/0SnFX9xJgP40rMP+ZzRaCN37vLHbv1Guag==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/transform-rotate/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "ms": "2.0.0" } }, - "node_modules/@turf/transform-rotate/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "safer-buffer": ">= 2.1.2 < 3" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@turf/transform-scale": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-6.5.0.tgz", - "integrity": "sha512-VsATGXC9rYM8qTjbQJ/P7BswKWXHdnSJ35JlV4OsZyHBMxJQHftvmZJsFbOqVtQnIQIzf2OAly6rfzVV9QLr7g==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" }, "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/transform-scale/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@turf/transform-scale/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 0.8" } }, - "node_modules/@turf/transform-translate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-6.5.0.tgz", - "integrity": "sha512-NABLw5VdtJt/9vSstChp93pc6oel4qXEos56RBMsPlYB8hzNTEKYtC146XJvyF4twJeeYS8RVe1u7KhoFwEM5w==", + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/@turf/transform-translate/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "engines": { + "node": ">=6" } }, - "node_modules/@turf/transform-translate/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/bootstrap-colorpicker": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/bootstrap-colorpicker/-/bootstrap-colorpicker-2.5.3.tgz", + "integrity": "sha512-xdllX8LSMvKULs3b8JrgRXTvyvjkSMHHHVuHjjN5FNMqr6kRe5NPiMHFmeAFjlgDF73MspikudLuEwR28LbzLw==", "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "jquery": ">=1.10" } }, - "node_modules/@turf/triangle-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-6.5.0.tgz", - "integrity": "sha512-2jToUSAS1R1htq4TyLQYPTIsoy6wg3e3BQXjm2rANzw4wPQCXGOxrur1Fy9RtzwqwljlC7DF4tg0OnWr8RjmfA==", + "node_modules/bootstrap-datepicker": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.10.0.tgz", + "integrity": "sha512-lWxtSYddAQOpbAO8UhYhHLcK6425eWoSjb5JDvZU3ePHEPF6A3eUr51WKaFy4PccU19JRxUG6wEU3KdhtKfvpg==", "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/intersect": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "jquery": ">=3.4.0 <4.0.0" } }, - "node_modules/@turf/triangle-grid/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "node_modules/bootstrap-daterangepicker": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-2.1.30.tgz", + "integrity": "sha512-lZAmyQxwsthEbsIBKl2KVcUca+b/O8uAJxxY8AvlsCYF9dQlIY7WjskuqMJ3b/1YdXUgxHN/R6HFdVVNFSgeVQ==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "jquery": ">=1.10", + "moment": "^2.9.0" } }, - "node_modules/@turf/triangle-grid/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/bootstrap-iconpicker-latest": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/bootstrap-iconpicker-latest/-/bootstrap-iconpicker-latest-1.12.0.tgz", + "integrity": "sha512-bmZyv2SD0YGCMvkG2Lc7D00DaUL5dT7t7o4CGJ83ZHT8hoxUFfL3TOi9yl40eB7NET8HUtH4SqSzywCKvLmT0w==" }, - "node_modules/@turf/triangle-grid/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/bootstrap-slider": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz", + "integrity": "sha512-a9MtENtt4r3ttPW5mpIpOFmCaIsm37EGukOgw5cfHlxKvsUSN8AN9JtwKrKuqgEnxs86kUSsMvMn8kqewMorKw==" }, - "node_modules/@turf/truncate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-6.5.0.tgz", - "integrity": "sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==", + "node_modules/bootstrap-tour": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/bootstrap-tour/-/bootstrap-tour-0.12.0.tgz", + "integrity": "sha512-J+Nure5q3eHKVAy0Oi0Y7bGhdVsnCl2bfaAYFg7hNcdWK+lyXtS3fLHIUqzbvdW//wcy2FRMHSr7G6EuisBWoA==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "bootstrap": "~3", + "jquery": ">=1.8" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/@turf/truncate/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } + "node_modules/bootstrap-validator": { + "version": "0.11.9", + "resolved": "https://registry.npmjs.org/bootstrap-validator/-/bootstrap-validator-0.11.9.tgz", + "integrity": "sha512-BJlnaTeFNr5+SNtZ71DNaiFx7qY0X2c7m/KvZE1GiVXbyD8PihJlALvS6TeRGUs8mY8qga/LrhG80N9dw8UWqA==" }, - "node_modules/@turf/turf": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-6.5.0.tgz", - "integrity": "sha512-ipMCPnhu59bh92MNt8+pr1VZQhHVuTMHklciQURo54heoxRzt1neNYZOBR6jdL+hNsbDGAECMuIpAutX+a3Y+w==", + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dev": true, "dependencies": { - "@turf/along": "^6.5.0", - "@turf/angle": "^6.5.0", - "@turf/area": "^6.5.0", - "@turf/bbox": "^6.5.0", - "@turf/bbox-clip": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/bearing": "^6.5.0", - "@turf/bezier-spline": "^6.5.0", - "@turf/boolean-clockwise": "^6.5.0", - "@turf/boolean-contains": "^6.5.0", - "@turf/boolean-crosses": "^6.5.0", - "@turf/boolean-disjoint": "^6.5.0", - "@turf/boolean-equal": "^6.5.0", - "@turf/boolean-intersects": "^6.5.0", - "@turf/boolean-overlap": "^6.5.0", - "@turf/boolean-parallel": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/boolean-within": "^6.5.0", - "@turf/buffer": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/center-mean": "^6.5.0", - "@turf/center-median": "^6.5.0", - "@turf/center-of-mass": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/circle": "^6.5.0", - "@turf/clean-coords": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/clusters": "^6.5.0", - "@turf/clusters-dbscan": "^6.5.0", - "@turf/clusters-kmeans": "^6.5.0", - "@turf/collect": "^6.5.0", - "@turf/combine": "^6.5.0", - "@turf/concave": "^6.5.0", - "@turf/convex": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/difference": "^6.5.0", - "@turf/dissolve": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/distance-weight": "^6.5.0", - "@turf/ellipse": "^6.5.0", - "@turf/envelope": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/flatten": "^6.5.0", - "@turf/flip": "^6.5.0", - "@turf/great-circle": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/hex-grid": "^6.5.0", - "@turf/interpolate": "^6.5.0", - "@turf/intersect": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/isobands": "^6.5.0", - "@turf/isolines": "^6.5.0", - "@turf/kinks": "^6.5.0", - "@turf/length": "^6.5.0", - "@turf/line-arc": "^6.5.0", - "@turf/line-chunk": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-offset": "^6.5.0", - "@turf/line-overlap": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/line-slice": "^6.5.0", - "@turf/line-slice-along": "^6.5.0", - "@turf/line-split": "^6.5.0", - "@turf/line-to-polygon": "^6.5.0", - "@turf/mask": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/midpoint": "^6.5.0", - "@turf/moran-index": "^6.5.0", - "@turf/nearest-point": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "@turf/nearest-point-to-line": "^6.5.0", - "@turf/planepoint": "^6.5.0", - "@turf/point-grid": "^6.5.0", - "@turf/point-on-feature": "^6.5.0", - "@turf/point-to-line-distance": "^6.5.0", - "@turf/points-within-polygon": "^6.5.0", - "@turf/polygon-smooth": "^6.5.0", - "@turf/polygon-tangents": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0", - "@turf/polygonize": "^6.5.0", - "@turf/projection": "^6.5.0", - "@turf/random": "^6.5.0", - "@turf/rewind": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0", - "@turf/sample": "^6.5.0", - "@turf/sector": "^6.5.0", - "@turf/shortest-path": "^6.5.0", - "@turf/simplify": "^6.5.0", - "@turf/square": "^6.5.0", - "@turf/square-grid": "^6.5.0", - "@turf/standard-deviational-ellipse": "^6.5.0", - "@turf/tag": "^6.5.0", - "@turf/tesselate": "^6.5.0", - "@turf/tin": "^6.5.0", - "@turf/transform-rotate": "^6.5.0", - "@turf/transform-scale": "^6.5.0", - "@turf/transform-translate": "^6.5.0", - "@turf/triangle-grid": "^6.5.0", - "@turf/truncate": "^6.5.0", - "@turf/union": "^6.5.0", - "@turf/unkink-polygon": "^6.5.0", - "@turf/voronoi": "^6.5.0" + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@turf/turf/node_modules/@turf/area": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", - "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@turf/turf/node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@turf/turf/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@turf/turf/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@turf/turf/node_modules/@turf/length": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/length/-/length-6.5.0.tgz", - "integrity": "sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==", + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@turf/union": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/union/-/union-6.5.0.tgz", - "integrity": "sha512-igYWCwP/f0RFHIlC2c0SKDuM/ObBaqSljI3IdV/x71805QbIvY/BYGcJdyNcgEA6cylIGl/0VSlIbpJHZ9ldhw==", + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@turf/union/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@turf/union/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "dependencies": { - "@turf/helpers": "^6.5.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/turf" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@turf/unkink-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-6.5.0.tgz", - "integrity": "sha512-8QswkzC0UqKmN1DT6HpA9upfa1HdAA5n6bbuzHy8NJOX8oVizVAqfEPY0wqqTgboDjmBR4yyImsdPGUl3gZ8JQ==", + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, "dependencies": { - "@turf/area": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "rbush": "^2.0.1" + "big-integer": "^1.6.44" }, - "funding": { - "url": "https://opencollective.com/turf" + "engines": { + "node": ">= 5.10.0" } }, - "node_modules/@turf/unkink-polygon/node_modules/@turf/area": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", - "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@turf/unkink-polygon/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@turf/unkink-polygon/node_modules/quickselect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", - "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/@turf/unkink-polygon/node_modules/rbush": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", - "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", "dependencies": { - "quickselect": "^1.0.1" + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" } }, - "node_modules/@turf/voronoi": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-6.5.0.tgz", - "integrity": "sha512-C/xUsywYX+7h1UyNqnydHXiun4UPjK88VDghtoRypR9cLlb7qozkiLRphQxxsCM0KxyxpVPHBVQXdAL3+Yurow==", + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "d3-voronoi": "1.1.2" - }, - "funding": { - "url": "https://opencollective.com/turf" + "resolve": "^1.17.0" } }, - "node_modules/@turf/voronoi/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "node_modules/browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@turf/voronoi/node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/@types/eslint": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.2.tgz", - "integrity": "sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==", - "dev": true, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/@types/geojson": { - "version": "7946.0.8", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", - "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dependencies": { - "@types/node": "*" + "pako": "~1.0.5" } }, - "node_modules/@types/node": { - "version": "14.14.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz", - "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "node_modules/browserify/node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } }, - "node_modules/@types/raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", - "optional": true + "node_modules/browserify/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } }, - "node_modules/@types/responselike": { + "node_modules/browserify/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/browserify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "@types/node": "*" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "dev": true, - "optional": true, + "node_modules/browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "@types/node": "*" + "safe-buffer": "~5.1.0" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "semver": "^7.0.0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, "dependencies": { - "@xtuc/long": "4.2.2" + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==", "dev": true }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "node_modules/cacache": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", + "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "balanced-match": "^1.0.0" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "node_modules/cacache/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "node_modules/cacache/node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@webpack-cli/configtest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", - "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "engines": { + "node": ">=12" } }, - "node_modules/@webpack-cli/info": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", - "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "envinfo": "^7.7.3" + "brace-expansion": "^2.0.1" }, - "peerDependencies": { - "webpack-cli": "4.x.x" + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@webpack-cli/serve": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", - "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", + "node_modules/cacache/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">=14.16" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/cacheable-request": { + "version": "10.2.12", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.12.tgz", + "integrity": "sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==", "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-node": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.7.0.tgz", - "integrity": "sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw==", "dependencies": { - "acorn": "^6.1.1", - "acorn-dynamic-import": "^4.0.0", - "acorn-walk": "^6.1.1", - "xtend": "^4.0.1" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node/node_modules/acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk", - "peerDependencies": { - "acorn": "^6.0.0" + "node": ">=14.16" } }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/adler-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", - "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" + }, + "node_modules/caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "adler32": "bin/adler32.njs" + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" }, "engines": { - "node": ">=0.8" + "node": ">=6" } }, - "node_modules/admin-lte": { - "version": "2.4.18", - "resolved": "https://registry.npmjs.org/admin-lte/-/admin-lte-2.4.18.tgz", - "integrity": "sha512-AfIdoUWdbQA0OmW7PnP8GJ3u6RMKNXefN3DRTBHCQXd7VeyJahUfZWtV62ppDxcdjpx0L08ypPV55ARmdGdOIw==", + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { - "bootstrap": "^3.4", - "bootstrap-colorpicker": "^2.5.3", - "bootstrap-datepicker": "^1.8", - "bootstrap-daterangepicker": "^2.1.25", - "bootstrap-slider": "^9.10.0", - "chart.js": "^1", - "ckeditor": "^4.11.2", - "datatables.net": "^1.10.19", - "datatables.net-bs": "^1.10.19", - "fastclick": "^1.0.6", - "flot": "^0.8.3", - "font-awesome": "^4.7", - "fullcalendar": "^3.10", - "inputmask": "^3.3.7", - "ion-rangeslider": "^2.3", - "ionicons": "^3", - "jquery": "^3.4.1", - "jquery-knob": "^1.2.11", - "jquery-sparkline": "^2.4", - "jquery-ui": "^1.12.1", - "jvectormap": "^1.2.2", - "moment": "^2.24", - "morris.js": "^0.5", - "pace": "0.0.4", - "raphael": "^2.2.7", - "select2": "^4.0.3", - "slimscroll": "^0.9.1" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ag-grid-community": { - "version": "26.2.1", - "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-26.2.1.tgz", - "integrity": "sha512-aChSGNdPkBda4BhOUUEAmAkRlIG7rFU8UTXx3NPStavrCOHKLDRV90djIKuiXfM6ONBqKmeqw2as0yuLnSN8dw==" + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { - "node": ">= 6.0.0" + "node": ">=6" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/canvg": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", + "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", + "optional": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/canvg/node_modules/core-js": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", + "hasInstallScript": true, + "optional": true, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", "dev": true, "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/angular": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz", - "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==", - "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } }, - "node_modules/angular-legacy-sortablejs-maintained": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/angular-legacy-sortablejs-maintained/-/angular-legacy-sortablejs-maintained-0.6.2.tgz", - "integrity": "sha512-rZA9LImEc+Q/OUYK8apg2iN7KCslrU6Dctk4hwY0ZDfFsWLzybHbMx97lqXK4J2crv41MQictW4D0PIIk4YfFA==", - "peerDependencies": { - "sortablejs": ">=1.5.x" + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/angular-route": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.7.8.tgz", - "integrity": "sha512-VVk89PH0fsY5kfbx+N7IVX1IwnaPWYhMGY0uA+rjej2v1sjvrTx1SLkxUK4E0UpW1hXeLJhN7ncBcwoBiPtAtA==", - "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, - "node_modules/angular-sanitize": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.7.8.tgz", - "integrity": "sha512-sVq51is1cVNiPytH4JIEd7iRW0OBIRQGNETWkz1c/jnLv2sBf9oDxEd8enwDz/W2ULBIpqJPK/3AsIxmZyh9pA==", - "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + "node_modules/charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==" }, - "node_modules/angular-ui-bootstrap": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/angular-ui-bootstrap/-/angular-ui-bootstrap-2.5.6.tgz", - "integrity": "sha512-yzcHpPMLQl0232nDzm5P4iAFTFQ9dMw0QgFLuKYbDj9M0xJ62z0oudYD/Lvh1pWfRsukiytP4Xj6BHOSrSXP8A==" + "node_modules/chart.js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-1.1.1.tgz", + "integrity": "sha512-1lcx4nsmYk3C50xMWFucOccdU7jh+RoHP25IiPlUoE6Qf317my+Nm48JOyPFrBRscqy6O4kkxif+omPKPkqWMA==" }, - "node_modules/angularjs-dropdown-multiselect": { - "version": "2.0.0-beta.10", - "resolved": "https://registry.npmjs.org/angularjs-dropdown-multiselect/-/angularjs-dropdown-multiselect-2.0.0-beta.10.tgz", - "integrity": "sha1-/7R63w33M/PalM5JyE+PBdJHKl8=", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "angular": "~1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=0.10.10" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, - "dependencies": { - "string-width": "^4.1.0" + "engines": { + "node": ">=10" } }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6.0" } }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { "node": ">=8" } }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ckeditor": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/ckeditor/-/ckeditor-4.12.1.tgz", + "integrity": "sha512-pH2Su4oi0D4iN/3U8nUcwI7/lXHoOJi0aiN8e2zxnm4Ow5kq8eZP2ZGmpYyuqRyKZ2tHaU8+OyYi7laXcjiq9Q==", + "deprecated": "We have renamed the @ckeditor package. New versions are available under the @ckeditor4 name." + }, + "node_modules/classie": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/classie/-/classie-1.0.0.tgz", + "integrity": "sha512-r2RnvJXK9l5+NClh9exbgAdhJBl/nxGWFIhRhp2syqY1nT/Lt/ijELemTlGaoaFWVCrJ3eDDeDG6KM4WJw02NA==", + "engines": { + "node": ">=0.10.x" + } + }, + "node_modules/classybrew": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/classybrew/-/classybrew-0.0.3.tgz", + "integrity": "sha512-Z1ky+DGpSFKaUpmIcWEM31c8U9gj1e1/gAUb/PWT5gUJBz+8gtFeXnn7HVUgEuWxsRFhxgKB9fs3gf7sTWt0GQ==" + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "source-map": "~0.6.0" }, "engines": { - "node": ">=8" + "node": ">= 10.0" } }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "engines": { "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", "dev": true, - "dependencies": { - "type-fest": "^1.0.2" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "dependencies": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.2.5" } }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "optional": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, - "dependencies": { - "default-require-extensions": "^2.0.0" - }, "engines": { - "node": ">=4" + "node": ">= 10" } }, - "node_modules/archiver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", - "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", - "dev": true, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^1.2.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 4" + "node": ">=12" } }, - "node_modules/archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, - "dependencies": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, "engines": { - "node": ">= 0.10.0" + "node": ">=0.8" } }, - "node_modules/archiver/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "dependencies": { - "lodash": "^4.17.14" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true + "node_modules/code-prettify": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/code-prettify/-/code-prettify-0.1.0.tgz", + "integrity": "sha512-tNOWwXoF3ycqtvLCGPLYds2hKekmZfsPWinbRcLk6BBHBaSf+v+HJOvfg33VfVzYzvQ6zmVq+WO88oKweiJSQg==" }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "node_modules/codemirror": { + "version": "5.65.13", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.13.tgz", + "integrity": "sha512-SVWEzKXmbHmTQQWaz03Shrh4nybG0wXx2MEu3FO4ezbPW8IbnZEd5iGHGEffSUaitKYa3i+pHpBsSvw8sPHtzg==" }, - "node_modules/argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, + "node_modules/codepage": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.3.8.tgz", + "integrity": "sha512-cjAoQW5L/TCKWRbzt/xGBvhwJKQFhcIVO0jWQtpKQx4gr9qvXNkpRfq6gSmjjA8dB2Is/DPOb7gNwqQXP7UgTQ==", "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true, + "commander": "", + "concat-stream": "", + "voc": "" + }, + "bin": { + "codepage": "bin/codepage.njs" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, - "engines": { - "node": ">=8" + "bin": { + "color-support": "bin.js" } }, - "node_modules/array.prototype.map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", - "integrity": "sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/colorbrewer": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.5.3.tgz", + "integrity": "sha512-ee4k+3P0rzHtikVcmBsO0N81J2JBjE93S9BM21WwdHS30oZe6Okp0VDJViS9y5aUL8kedEXzL7Yfi9WzO5ghYQ==" }, - "node_modules/array.prototype.map/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.1.90" } }, - "node_modules/array.prototype.map/node_modules/es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", - "dev": true, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/combine-source-map/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" + }, + "node_modules/combine-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/array.prototype.map/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "delayed-stream": "~1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8" } }, - "node_modules/array.prototype.map/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/array.prototype.map/node_modules/is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 10" } }, - "node_modules/array.prototype.map/node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "mime-db": ">= 1.43.0 < 2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6" } }, - "node_modules/array.prototype.map/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/array.prototype.map/node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8" } }, - "node_modules/array.prototype.map/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ms": "2.0.0" } }, - "node_modules/array.prototype.map/node_modules/object.assign/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, - "node_modules/array.prototype.map/node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, + "node_modules/concaveman": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.2.1.tgz", + "integrity": "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "point-in-polygon": "^1.1.0", + "rbush": "^3.0.1", + "robust-predicates": "^2.0.4", + "tinyqueue": "^2.0.3" } }, - "node_modules/array.prototype.map/node_modules/string.prototype.trimend/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, + "node_modules/concaveman/node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "node_modules/concaveman/node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "quickselect": "^2.0.0" } }, - "node_modules/array.prototype.map/node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/array.prototype.map/node_modules/string.prototype.trimstart/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/yeoman/configstore?sponsor=1" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "dependencies": { - "safer-buffer": "~2.1.0" + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" } }, - "node_modules/assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", "dependencies": { - "util": "0.10.3" + "date-now": "^0.1.4" } }, - "node_modules/assert-plus": { + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, "engines": { - "node": ">=0.8" + "node": ">= 0.6" } }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dependencies": { - "inherits": "2.0.1" - } + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "node_modules/continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==", "dev": true }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, - "dependencies": { - "retry": "0.13.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" }, - "engines": { - "node": ">= 4.5.0" + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "node_modules/copy-webpack-plugin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-7.0.0.tgz", + "integrity": "sha512-SLjQNa5iE3BoCP76ESU9qYo9ZkEWtXoZxDurHoqPchAFRblJ9g96xTeC560UXBMre1Nx6ixIIUfiY3VcjpJw3g==", + "dev": true, "dependencies": { - "array-filter": "^1.0.0" + "fast-glob": "^3.2.4", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/available-typed-arrays/node_modules/array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "engines": { - "node": "*" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "node_modules/copy-webpack-plugin/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" } }, - "node_modules/babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/babel-core/node_modules/convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } + "hasInstallScript": true }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "node_modules/core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, - "node_modules/babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "engines": { + "node": ">= 0.4.0" } }, - "node_modules/babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "node_modules/babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "node_modules/coveralls": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "node_modules/cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=6" } }, - "node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "node_modules/critters": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", + "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "pretty-bytes": "^5.3.0" } }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/babel-plugin-angularjs-annotate": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz", - "integrity": "sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ==", + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/types": "^7.2.0", - "simple-is": "~0.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "node_modules/babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=8" } }, - "node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" } }, - "node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", "dependencies": { - "babel-runtime": "^6.22.0" + "utrie": "^1.0.2" } }, - "node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "node_modules/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" } }, - "node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "dev": true, "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, + "node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/d3-geo": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", + "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "d3-array": "1" } }, - "node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "node_modules/d3-voronoi": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", + "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==" + }, + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/datatables.net": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.13.5.tgz", + "integrity": "sha512-XoCQHkUM5MwbC3Wx7WpVvt4i880J8pIFDA9HIKD4GhvtalryBfmdd+bZvrc/rEbraZS7U4eR2k8/wFY0NeHVqQ==", "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "jquery": ">=1.7" } }, - "node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, + "node_modules/datatables.net-bs": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.13.5.tgz", + "integrity": "sha512-ZIiQAKwwIV+BoGijH3MHm6Vc7WB0icFxAF8uxx7nyZr5WMw1R7Pt5pqU1MqwjyjWtu81OveXQdRuwHMijey6ww==", "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "datatables.net": ">=1.13.4", + "jquery": ">=1.7" } }, - "node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==" + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/dbf": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dbf/-/dbf-0.1.4.tgz", + "integrity": "sha512-7tQ8w5NB74PL1f0Z/NQ6Y+URjBFhtEsFxzEQSzot2+VpLwWfrNnxFVhzWm6dJyEtFq0WkYWcGEMDf39fy8JFaw==", "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "jdataview": "~2.5.0" } }, - "node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" + "engines": { + "node": "*" } }, - "node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0" + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dependencies": { - "babel-runtime": "^6.22.0" + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "engines": { + "node": ">=4.0.0" } }, - "node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, "dependencies": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "dependencies": { - "regenerator-transform": "^0.10.0" + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-polyfill/node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "node_modules/babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" + "engines": { + "node": ">=10.17.0" } }, - "node_modules/babel-preset-env/node_modules/browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" + "engines": { + "node": ">=8" }, - "bin": { - "browserslist": "cli.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", + "node_modules/default-gateway/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "engines": { + "node": ">=6" } }, - "node_modules/babel-register/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "source-map": "^0.5.6" + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "node_modules/default-gateway/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "node_modules/default-gateway/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "engines": { + "node": ">=6" } }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "node_modules/default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==", "dev": true, "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, - "bin": { - "babylon": "bin/babylon.js" + "engines": { + "node": ">=10" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=8" } }, - "node_modules/base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dependencies": { - "safe-buffer": "5.1.2" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "node_modules/degenerator": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-4.0.4.tgz", + "integrity": "sha512-MTZdZsuNxSBL92rsjx3VFWe57OpRlikyLbcx2B5Dmdv6oScqpMrvpY7zHLMymrUxo3U5+suPUMsNgW/+SZB1lg==", "dev": true, "dependencies": { - "tweetnacl": "^0.14.3" + "ast-types": "^0.13.4", + "escodegen": "^1.14.3", + "esprima": "^4.0.1", + "vm2": "^3.9.19" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", - "dev": true - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { - "node": "*" + "node": ">=0.4.0" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/density-clustering": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/density-clustering/-/density-clustering-1.3.0.tgz", + "integrity": "sha512-icpmBubVTwLnsaor9qH/4tG5+7+f61VcqMN3V3pm9sxxSCt2Jcs0zWOgwZW9ARJYaKD3FumIgHiMOcIMRRAzFQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "optional": true, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/bind-obj-methods": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", - "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, - "node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/blobjs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/blobjs/-/blobjs-1.1.1.tgz", - "integrity": "sha1-VEr224h7HGL0XqjgfOtFwTtZlao=" - }, - "node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/body": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", - "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", "dev": true, "dependencies": { - "continuable-cache": "^0.3.1", - "error": "^7.0.0", - "raw-body": "~1.1.0", - "safe-json-parse": "~1.0.1" + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/bootstrap": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "node_modules/detect-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.0.tgz", + "integrity": "sha512-1aXUEPdfGdzVPFpzGJJNgq9o81bGg1s09uxTWsqBlo9PI332uyJRQq13+LK/UN4JfxJbFdCXonUFQ9R/p7yCtw==", + "dev": true, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bootstrap-colorpicker": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/bootstrap-colorpicker/-/bootstrap-colorpicker-2.5.3.tgz", - "integrity": "sha512-xdllX8LSMvKULs3b8JrgRXTvyvjkSMHHHVuHjjN5FNMqr6kRe5NPiMHFmeAFjlgDF73MspikudLuEwR28LbzLw==", - "dependencies": { - "jquery": ">=1.10" - } + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true }, - "node_modules/bootstrap-datepicker": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.9.0.tgz", - "integrity": "sha512-9rYYbaVOheGYxjOr/+bJCmRPihfy+LkLSg4fIFMT9Od8WwWB/MB50w0JO1eBgKUMbb7PFHQD5uAfI3ArAxZRXA==", + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", "dependencies": { - "jquery": ">=1.7.1 <4.0.0" + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/bootstrap-daterangepicker": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-2.1.30.tgz", - "integrity": "sha1-+JPb//Wk19+qt1Rg6OppabuJaJo=", + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, "dependencies": { - "jquery": ">=1.10", - "moment": "^2.9.0" + "asap": "^2.0.0", + "wrappy": "1" } }, - "node_modules/bootstrap-iconpicker-latest": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/bootstrap-iconpicker-latest/-/bootstrap-iconpicker-latest-1.12.0.tgz", - "integrity": "sha512-bmZyv2SD0YGCMvkG2Lc7D00DaUL5dT7t7o4CGJ83ZHT8hoxUFfL3TOi9yl40eB7NET8HUtH4SqSzywCKvLmT0w==" - }, - "node_modules/bootstrap-slider": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz", - "integrity": "sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8=" + "node_modules/diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha512-VzVc42hMZbYU9Sx/ltb7KYuQ6pqAw+cbFWVy4XKdkuEL2CFaRLGEnISPs7YdzaUGpi+CpIqvRmu7hPQ4T7EQ5w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } }, - "node_modules/bootstrap-tour": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/bootstrap-tour/-/bootstrap-tour-0.12.0.tgz", - "integrity": "sha512-J+Nure5q3eHKVAy0Oi0Y7bGhdVsnCl2bfaAYFg7hNcdWK+lyXtS3fLHIUqzbvdW//wcy2FRMHSr7G6EuisBWoA==", + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dependencies": { - "bootstrap": "~3", - "jquery": ">=1.8" - }, - "engines": { - "node": ">= 0.8.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/bootstrap-validator": { - "version": "0.11.9", - "resolved": "https://registry.npmjs.org/bootstrap-validator/-/bootstrap-validator-0.11.9.tgz", - "integrity": "sha1-+3BY7vU2I+ePWqeWcCb5j4dalAQ=" + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" + "path-type": "^4.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=6" + } + }, + "node_modules/docx": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/docx/-/docx-7.8.2.tgz", + "integrity": "sha512-ptaiVZunYO04z113E/jR3yZx7/VaeUap2CHM9V1YwlmGygJ2W8y2KBmAsVgzlzs+qT7+3d5W3Q7+57BgvGiL+Q==", + "dependencies": { + "@types/node": "^18.0.0", + "jszip": "^3.1.5", + "nanoid": "^3.1.20", + "xml": "^1.0.1", + "xml-js": "^1.6.8" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=10" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", - "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", + "node_modules/docx/node_modules/@types/node": { + "version": "18.17.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.3.tgz", + "integrity": "sha512-2x8HWtFk0S99zqVQABU9wTpr8wPoaDHZUcAkoTKH+nL7kPv3WUI9cRi/Kk5Mz4xdqXSqTkKP7IWNoQQYCnDsTA==" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "engines": { - "node": ">=14.16" + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true, + "node_modules/dom-to-image-more": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/dom-to-image-more/-/dom-to-image-more-2.16.0.tgz", + "integrity": "sha512-RyjtkaM/zVy90uJ20lT+/G7MwBZx6l/ePliq5CQOeAnPeew7aUGS6IqRWBkHpstU+POmhaKA8A9H9qf476gisQ==" + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.4", + "npm": ">=1.2" } }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">=12" + "node": ">= 4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, + "node_modules/domhelper": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/domhelper/-/domhelper-0.9.1.tgz", + "integrity": "sha512-TVyA6YHUnoMErPt1dGZ6vCwts+NzkIgHPTmYD1F9EcHebAlsQ3NSAsXLZh1oPMYlz4bPwptx/C8qF3pphMCyDw==", "dependencies": { - "ansi-regex": "^6.0.1" + "browserify": ">=3.46.0", + "classie": ">=0.0.1", + "util-extend": "^1.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=0.10.x" } }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/dompurify": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", + "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==", + "optional": true + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "engines": { - "node": ">=12.20" + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", - "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "is-obj": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "readable-stream": "^2.0.2" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "node_modules/browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "bin": { - "browser-pack": "bin/cmd.js" + "safe-buffer": "~5.1.0" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "node_modules/browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/echarts": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.2.tgz", + "integrity": "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.4.3" + } + }, + "node_modules/echarts-stat": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/echarts-stat/-/echarts-stat-1.2.0.tgz", + "integrity": "sha512-zLd7Kgs+tuTSeaK0VQEMNmnMivEkhvHIk1gpBtLzpRerfcIQ+Bd5XudOMmtwpaTc1WDZbA7d1V//iiBccR46Qg==" + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true, + "hasInstallScript": true, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "node_modules/electron-to-chromium": { + "version": "1.4.459", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.459.tgz", + "integrity": "sha512-XXRS5NFv8nCrBL74Rm3qhJjA2VCsRFx0OjHKBMPI0otij56aun8UWiKTDABmd5/7GTR021pA4wivs+Ri6XCElg==" }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/browserify-des/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/browserify-rsa": { - "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dependencies": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" } }, - "node_modules/browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dependencies": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, "dependencies": { - "pako": "~0.2.0" + "iconv-lite": "^0.6.2" } }, - "node_modules/browserify/node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "dependencies": { - "resolve": "^1.17.0" + "once": "^1.4.0" } }, - "node_modules/browserify/node_modules/browser-resolve/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/browserify/node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dependencies": { - "pako": "~1.0.5" + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/browserify/node_modules/buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/browserify/node_modules/cached-path-relative": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", - "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" - }, - "node_modules/browserify/node_modules/deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dependencies": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, "bin": { - "deps-sort": "bin/cmd.js" + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/browserify/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "prr": "~1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "bin": { + "errno": "cli.js" } }, - "node_modules/browserify/node_modules/insert-module-globals": { + "node_modules/error": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" + "string-template": "~0.2.1" } }, - "node_modules/browserify/node_modules/insert-module-globals/node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "is-arrayish": "^0.2.1" } }, - "node_modules/browserify/node_modules/module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "node_modules/error/node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", + "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", + "dev": true, "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browserify/node_modules/module-deps/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browserify/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/browserify/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "node_modules/browserify/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true }, - "node_modules/browserify/node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/browserify/node_modules/stream-browserify/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/browserify/node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browserify/node_modules/stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true }, - "node_modules/browserify/node_modules/stream-http/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, - "node_modules/browserify/node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 6" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", + "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" } }, - "node_modules/browserify/node_modules/stream-http/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { - "node": ">=0.4" + "node": ">=6" } }, - "node_modules/browserify/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/browserify/node_modules/timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dependencies": { - "process": "~0.11.0" - }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">=0.6.0" + "node": ">=0.8.0" } }, - "node_modules/browserify/node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" - }, - "node_modules/browserify/node_modules/util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/browserify/node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/browserslist": { - "version": "4.21.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.8.tgz", - "integrity": "sha512-j+7xYe+v+q2Id9qbBeCI8WX5NmZSRe8es1+0xntD/+gaWXznP8tFEkv5IgSaHf5dS1YwVMbX/4W6m937mj+wQw==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "caniuse-lite": "^1.0.30001502", - "electron-to-chromium": "^1.4.428", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=8.0.0" } }, - "node_modules/btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "bin": { - "btoa": "bin/btoa.js" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 0.4.0" + "node": ">=4" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": "*" + "node": ">=4.0" } }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "node_modules/buffer/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "engines": { + "node": ">=4.0" + } }, - "node_modules/buffer/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "node_modules/eve-raphael": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz", + "integrity": "sha512-jrxnPsCGqng1UZuEp9DecX/AuSyAszATSjf4oEcRxvfxa1Oux4KkIPKBAAWWnpdwfARtr+Q0o9aPYWjsROD7ug==" }, - "node_modules/bytes": { + "node_modules/eventemitter-asyncresource": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", "dev": true }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=8" + "node": ">=0.8.x" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", + "dev": true + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "dependencies": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=6" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "homedir-polyfill": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001502", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001502.tgz", - "integrity": "sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true }, - "node_modules/canvg": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", - "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", - "optional": true, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/raf": "^3.4.0", - "core-js": "^3.8.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "svg-pathdata": "^6.0.3" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.10.0" } }, - "node_modules/canvg/node_modules/core-js": { - "version": "3.23.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.4.tgz", - "integrity": "sha512-vjsKqRc1RyAJC3Ye2kYqgfdThb3zYnx9CrqoCcjMOENMtQPC7ZViBvlDxwYU/2z2NI/IPuiXw5mT4hWhddqjzQ==", - "hasInstallScript": true, - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/canvg/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "optional": true + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "node_modules/capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cfb": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", - "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, "engines": { - "node": ">=0.8" - } - }, - "node_modules/cfb/node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "engines": { - "node": ">=0.8" + "node": ">=4" } }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=" - }, - "node_modules/chart.js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-1.1.1.tgz", - "integrity": "sha512-1lcx4nsmYk3C50xMWFucOccdU7jh+RoHP25IiPlUoE6Qf317my+Nm48JOyPFrBRscqy6O4kkxif+omPKPkqWMA==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "optional": true, "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 10.17.0" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "@types/yauzl": "^2.9.1" } }, - "node_modules/chokidar/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "devOptional": true }, - "node_modules/chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dependencies": { - "tslib": "^1.9.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=6.0" + "node": ">=8.6.0" } }, - "node_modules/ci-info": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", - "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, - "node_modules/ckeditor": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/ckeditor/-/ckeditor-4.12.1.tgz", - "integrity": "sha512-pH2Su4oi0D4iN/3U8nUcwI7/lXHoOJi0aiN8e2zxnm4Ow5kq8eZP2ZGmpYyuqRyKZ2tHaU8+OyYi7laXcjiq9Q==", - "deprecated": "We have renamed the @ckeditor package. New versions are available under the @ckeditor4 name." + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "node_modules/classie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/classie/-/classie-1.0.0.tgz", - "integrity": "sha1-/JsptH5k43SiBi+2JNBaYc1wOrI=", + "node_modules/fastclick": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fastclick/-/fastclick-1.0.6.tgz", + "integrity": "sha512-cXyDBT4g0uWl/Xe75QspBDAgAWQ0lkPi/zgp6YFEUHj6WV6VIZl7R6TiDZhdOVU3W4ehp/8tG61Jev1jit+ztQ==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, "engines": { - "node": ">=0.10.x" + "node": ">= 4.9.1" } }, - "node_modules/classybrew": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/classybrew/-/classybrew-0.0.3.tgz", - "integrity": "sha1-fbkd9W3XCF8IZI/YL4PU7wMExzs=" + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } }, - "node_modules/clean-css": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.0.tgz", - "integrity": "sha512-98ALLW4NOhZpvUEoSc2dJO23xE4S4SXc4mLieCVFGo8DNLTFQ3gzi7msW1lqSYJeGZSF5r5+W3KF6cEnkILnFQ==", + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", "dev": true, "dependencies": { - "source-map": "~0.6.0" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">= 10.0" + "node": ">=0.4.0" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "pend": "~1.2.0" } }, - "node_modules/clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], "dependencies": { - "exit": "0.1.2", - "glob": "^7.1.1" + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" }, "engines": { - "node": ">=0.2.5" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.20 || >= 14.13" } }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "node_modules/fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "dependencies": { - "restore-cursor": "^4.0.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, - "node_modules/cli-width": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", - "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", - "dev": true, - "engines": { - "node": ">= 12" - } + "node_modules/file-saverjs": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/file-saverjs/-/file-saverjs-1.3.6.tgz", + "integrity": "sha512-b8Re91Mmhc2i2wRGEhzeBp3Mbv+y/+uZt6Ty5Fld9LNDxS3bzESyvB0a4WTBk8U4vznmFaD5sQtBR90L6W6a0A==" + }, + "node_modules/file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", + "dev": true }, - "node_modules/cli/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">=0.8" + "node": ">= 0.8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" + "ms": "2.0.0" } }, - "node_modules/clone-deep/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/code-prettify": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/code-prettify/-/code-prettify-0.1.0.tgz", - "integrity": "sha1-RocMyMGlDQm61TmzOpg9vUqjSx4=" - }, - "node_modules/codemirror": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.59.1.tgz", - "integrity": "sha512-d0SSW/PCCD4LoSCBPdnP0BzmZB1v3emomCUtVlIWgZHJ06yVeBOvBtOH7vYz707pfAvEeWbO9aP6akh8vl1V3w==" - }, - "node_modules/codepage": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", - "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { - "commander": "~2.14.1", - "exit-on-epipe": "~1.0.1" - }, - "bin": { - "codepage": "bin/codepage.njs" + "semver": "^6.0.0" }, "engines": { - "node": ">=0.8" - } - }, - "node_modules/codepage/node_modules/commander": { - "version": "2.14.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { - "color-support": "bin.js" + "semver": "bin/semver.js" } }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=0.1.90" + "node": ">=8" } }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/commondir": { + "node_modules/flagged-respawn": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true, - "dependencies": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.10" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "node_modules/flot": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/flot/-/flot-0.8.3.tgz", + "integrity": "sha512-xg2otcTJDvS+ERK+my4wxG/ASq90QURXtoM4LhacCq0jQW2jbyjdttbRNqU2cPykrpMvJ6b2uSp6SAgYAzj9tQ==" }, - "node_modules/concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "engines": [ - "node >= 0.8" + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } ], - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/concaveman": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.2.1.tgz", - "integrity": "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==", + "node_modules/font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==", + "engines": { + "node": ">=0.10.3" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dependencies": { - "point-in-polygon": "^1.1.0", - "rbush": "^3.0.1", - "robust-predicates": "^2.0.4", - "tinyqueue": "^2.0.3" + "is-callable": "^1.1.3" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" + "for-in": "^1.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "node_modules/foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g==", "dev": true, "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "cross-spawn": "^4", + "signal-exit": "^3.0.0" } }, - "node_modules/console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "node_modules/foreground-child/node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", + "dev": true, "dependencies": { - "date-now": "^0.1.4" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "node_modules/continuable-cache": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", - "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + "node_modules/foreground-child/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } }, - "node_modules/copy-webpack-plugin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-7.0.0.tgz", - "integrity": "sha512-SLjQNa5iE3BoCP76ESU9qYo9ZkEWtXoZxDurHoqPchAFRblJ9g96xTeC560UXBMre1Nx6ixIIUfiY3VcjpJw3g==", + "node_modules/foreground-child/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { - "fast-glob": "^3.2.4", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "isexe": "^2.0.0" }, - "peerDependencies": { - "webpack": "^5.1.0" + "bin": { + "which": "bin/which" } }, - "node_modules/copy-webpack-plugin/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/foreground-child/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/copy-webpack-plugin/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.12" } }, - "node_modules/core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">= 14.17" } }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=10" + "node": ">=12.20.0" } }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/cosmiconfig/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + "node_modules/frac": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/frac/-/frac-0.3.1.tgz", + "integrity": "sha512-1Lzf2jOjhIkRaa013KlxNOn2D9FemmQNeYUDpEIyPeFXmpLvbZXJOlaayMBT6JKXx+afQFgQ1QJ4kaF7Z07QFQ==", "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/coveralls": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", - "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, - "dependencies": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.2" - }, - "bin": { - "coveralls": "bin/coveralls.js" - }, "engines": { - "node": ">=6" - } - }, - "node_modules/cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" + "node": "*" }, - "engines": { - "node": ">=6" + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" } }, - "node_modules/cp-file/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/crc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", - "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=", + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, - "node_modules/crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "node_modules/fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "crc32": "bin/crc32.njs" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=0.8" + "node": ">=6 <7 || >=8" } }, - "node_modules/crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "node_modules/fs-minipass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", "dev": true, "dependencies": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" + "minipass": "^5.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" + "node_modules/fullcalendar": { + "version": "3.10.5", + "resolved": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.5.tgz", + "integrity": "sha512-JGWpECKgza/344bbF5QT0hBJpx04DZ/7QGPlR1ZbAwrG6Yz6mWEkQd+NnZUh1sK6HCBIPnPRW2x53aJxeLGvvQ==", + "peerDependencies": { + "jquery": "2 - 3", + "moment": "^2.20.1" } }, - "node_modules/crypto-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", - "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "node_modules/function-loop": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", + "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "dependencies": { - "type-fest": "^1.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "dependencies": { - "utrie": "^1.0.2" + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "dependencies": { - "array-find-index": "^1.0.1" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/d3-geo": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", - "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", - "dependencies": { - "d3-array": "1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/d3-voronoi": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", - "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==" - }, - "node_modules/dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "globule": "^1.0.0" }, "engines": { - "node": ">=0.10" + "node": ">= 4.0.0" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { - "node": ">= 12" + "node": ">=6.9.0" } }, - "node_modules/datatables.net": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.12.1.tgz", - "integrity": "sha512-e6XAMUoV41JdQPS/r9YRfRcmTPcCVvyZbWI+xog1Zg+kjVliMQbEkvWK5XFItmi64Cvwg+IqsZbTUJ1KSY3umA==", + "node_modules/geojson-equality": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/geojson-equality/-/geojson-equality-0.1.6.tgz", + "integrity": "sha512-TqG8YbqizP3EfwP5Uw4aLu6pKkg6JQK9uq/XZ1lXQntvTHD1BBKJWhNpJ2M0ax6TuWMP3oyx6Oq7FCIfznrgpQ==", "dependencies": { - "jquery": ">=1.7" + "deep-equal": "^1.0.0" } }, - "node_modules/datatables.net-bs": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.12.1.tgz", - "integrity": "sha512-oaX1mNhjnASo33mwv6QzgGxD3pAz69qAL+8YlCro3e7oMvszE6wJyprEt80vl8E/TiMp/UUvsaqsup1JZFfMBQ==", + "node_modules/geojson-rbush": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.2.0.tgz", + "integrity": "sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==", "dependencies": { - "datatables.net": ">=1.11.3", - "jquery": ">=1.7" + "@turf/bbox": "*", + "@turf/helpers": "6.x", + "@turf/meta": "6.x", + "@types/geojson": "7946.0.8", + "rbush": "^3.0.1" } }, - "node_modules/date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + "node_modules/geojson-rbush/node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" + "node_modules/geojson-rbush/node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dependencies": { + "quickselect": "^2.0.0" } }, - "node_modules/dbf": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dbf/-/dbf-0.1.4.tgz", - "integrity": "sha1-Fi8Nj9HbN8l2RYrG/m9VtIxy9GY=", - "dependencies": { - "jdataview": "~2.5.0" + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { - "ms": "2.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "dependencies": { - "mimic-response": "^3.1.0" + "pump": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/get-uri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^5.0.1", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, "engines": { - "node": ">=4.0.0" + "node": ">= 14" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", "dev": true, - "dependencies": { - "strip-bom": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">= 14" } }, - "node_modules/default-require-extensions/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "dependencies": { - "clone": "^1.0.2" + "assert-plus": "^1.0.0" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "git-up": "^7.0.0" } }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "object-keys": "^1.0.12" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "node_modules/degenerator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", - "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", - "dev": true, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0", - "vm2": "^3.9.8" + "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, + "dependencies": { + "ini": "2.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/density-clustering": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/density-clustering/-/density-clustering-1.3.0.tgz", - "integrity": "sha512-icpmBubVTwLnsaor9qH/4tG5+7+f61VcqMN3V3pm9sxxSCt2Jcs0zWOgwZW9ARJYaKD3FumIgHiMOcIMRRAzFQ==" - }, - "node_modules/depd": { + "node_modules/global-dirs/node_modules/ini": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "node": ">=10" } }, - "node_modules/detect-file": { + "node_modules/global-modules": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, "dependencies": { - "repeating": "^2.0.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/detect-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.0.tgz", - "integrity": "sha512-1aXUEPdfGdzVPFpzGJJNgq9o81bGg1s09uxTWsqBlo9PI332uyJRQq13+LK/UN4JfxJbFdCXonUFQ9R/p7yCtw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" + "isexe": "^2.0.0" }, "bin": { - "detective": "bin/detective.js" - }, + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/dezalgo": { + "node_modules/globalthis": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha512-VzVc42hMZbYU9Sx/ltb7KYuQ6pqAw+cbFWVy4XKdkuEL2CFaRLGEnISPs7YdzaUGpi+CpIqvRmu7hPQ4T7EQ5w==", - "dev": true, + "define-properties": "^1.1.3" + }, "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "path-type": "^4.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/docx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/docx/-/docx-7.3.0.tgz", - "integrity": "sha512-OkSGlDNWMRFY07OEhUTx1ouuzYi8s1b67JDI6m5/5ek4xoshtP+/Rx8eRdY8LbhvpFkngvUantvTsxY4XW8Heg==", + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, "dependencies": { - "@types/node": "^17.0.0", - "jszip": "^3.1.5", - "nanoid": "^3.1.20", - "xml": "^1.0.1", - "xml-js": "^1.6.8" + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/docx/node_modules/@types/node": { - "version": "17.0.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.19.tgz", - "integrity": "sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA==" - }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" - }, - "node_modules/dom-to-image-more": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/dom-to-image-more/-/dom-to-image-more-2.9.5.tgz", - "integrity": "sha512-7pr43ZY/Nk0k2z3NXDKN4GvnZqP/3iZvddLeIuGfNTyFJuzzr0UeLl+poZ1ewYt3YIK+WHCEZUkz+RNuocN3/Q==" - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.4", - "npm": ">=1.2" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, "dependencies": { - "domelementtype": "1" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/domhelper": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/domhelper/-/domhelper-0.9.1.tgz", - "integrity": "sha1-JlVOW6wsnpWF3KUAl431Bn1kvQA=", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { - "browserify": ">=3.46.0", - "classie": ">=0.0.1", - "util-extend": "^1.0.1" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">=0.10.x" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dompurify": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.9.tgz", - "integrity": "sha512-3zOnuTwup4lPV/GfGS6UzG4ub9nhSYagR/5tB3AvDEwqyy5dtyCM2dVjwGDCnrPerXifBKTYh/UWCGKK7ydhhw==", - "optional": true - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/dot-prop": { + "node_modules/got/node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, "engines": { "node": ">=10" }, @@ -9764,792 +12594,672 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "node_modules/grunt": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", + "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", "dev": true, "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/echarts": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.3.0.tgz", - "integrity": "sha512-zENufmwFE6WjM+24tW3xQq4ICqQtI0CGj4bDVDNd3BK3LtaA/5wBp+64ykIyKy3QElz0cieKqSYP4FX9Lv9MwQ==", - "dependencies": { - "tslib": "2.3.0", - "zrender": "5.3.0" + "dateformat": "~4.6.2", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~5.0.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.6.3", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "nopt": "~3.0.6" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=16" } }, - "node_modules/echarts-stat": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/echarts-stat/-/echarts-stat-1.2.0.tgz", - "integrity": "sha512-zLd7Kgs+tuTSeaK0VQEMNmnMivEkhvHIk1gpBtLzpRerfcIQ+Bd5XudOMmtwpaTc1WDZbA7d1V//iiBccR46Qg==" - }, - "node_modules/echarts/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - }, - "node_modules/ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "node_modules/grunt-babel": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/grunt-babel/-/grunt-babel-7.0.0.tgz", + "integrity": "sha512-AFilvH/iPbnIYhL4Wx36AJQCaVEvK55xh0tujAt1DIM5tuxYxRsgUPEpwijBU147B+as/ssGuY9/6JYfTiAWpw==", "dev": true, - "hasInstallScript": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.428", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.428.tgz", - "integrity": "sha512-L7uUknyY286of0AYC8CKfgWstD0Smk2DvHDi9F0GWQhSH90Bzi7iDrmCbZKz75tYJxeGSAc7TYeKpmbjMDoh1w==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "node": ">=4" + }, + "peerDependencies": { + "babel-core": "^6.0.0 || ^7.0.0-alpha", + "grunt": ">=0.4.0" } }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/elliptic/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", "dev": true, + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, "engines": { - "node": ">= 4" + "node": ">=10" } }, - "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "dependencies": { - "once": "^1.4.0" + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" } }, - "node_modules/enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "node_modules/grunt-contrib-clean": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", + "integrity": "sha512-tET+TYTd8vCtKeGwbLjoH8+SdI8ngVzGbPr7vlWkewG7mYYHIccd2Ldxq+PK3DyBp5Www3ugdkfsjoNKUl5MTg==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "async": "^1.5.2", + "rimraf": "^2.5.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.10.0" + }, + "peerDependencies": { + "grunt": ">=0.4.5" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "node_modules/grunt-contrib-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", + "integrity": "sha512-QdTmcxe8aim2Z0dFeuSJ+f7fHIeY7PZaTMZxgvosjXwyMhpy2GUR5WHkr12lksHfZVE80v2wUwqF56wyfPUwoQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "chalk": "^1.0.0", + "source-map": "^0.5.3" }, "engines": { - "node": ">=8.6" + "node": ">=0.10.0" + }, + "peerDependencies": { + "grunt": ">=0.4.0" } }, - "node_modules/entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" - }, - "node_modules/envinfo": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", - "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", + "node_modules/grunt-contrib-concat/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/error": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", - "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "node_modules/grunt-contrib-concat/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, - "dependencies": { - "string-template": "~0.2.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "node_modules/grunt-contrib-concat/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true + "node_modules/grunt-contrib-concat/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "node_modules/grunt-contrib-concat/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" + "ansi-regex": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/es-get-iterator/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/grunt-contrib-concat/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/es-get-iterator/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "node_modules/grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "chalk": "^1.1.1", + "file-sync-cmp": "^0.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/es-get-iterator/node_modules/get-intrinsic/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/grunt-contrib-copy/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "dev": true + "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/grunt-contrib-copy/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/grunt-contrib-copy/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "node_modules/grunt-contrib-copy/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/grunt-contrib-cssmin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-4.0.0.tgz", + "integrity": "sha512-jXU+Zlk8Q8XztOGNGpjYlD/BDQ0n95IHKrQKtFR7Gd8hZrzgqiG1Ra7cGYc8h2DD9vkSFGNlweb9Q00rBxOK2w==", "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "clean-css": "^5.0.1", + "maxmin": "^3.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=10.0" } }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "node_modules/grunt-contrib-cssmin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4.0" + "node": ">=8" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/grunt-contrib-cssmin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/grunt-contrib-cssmin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=7.0.0" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "node_modules/grunt-contrib-cssmin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/grunt-contrib-cssmin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/grunt-contrib-cssmin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/grunt-contrib-jshint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", + "integrity": "sha512-N8jtQ/FmvuRdJoEGphmGt+ov1oi5bJq4hPBPT/g54ed1glF34l2z5VAdHHhcgOaezBxur3kcMPChB0pfZxxcFw==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "chalk": "^1.1.1", + "hooker": "^0.2.3", + "jshint": "~2.9.4" }, "engines": { - "node": ">=4.0" + "node": ">=0.10.0" + }, + "peerDependencies": { + "grunt": ">=0.4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "node_modules/grunt-contrib-jshint/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=0.10.0" } }, - "node_modules/estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "node_modules/grunt-contrib-jshint/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "node_modules/grunt-contrib-jshint/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/eve-raphael": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz", - "integrity": "sha1-F8dUt5K+7z+maE15z1pHxjxM2jA=" - }, - "node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", - "dev": true + "node_modules/grunt-contrib-jshint/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "node_modules/grunt-contrib-jshint/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "node_modules/events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "engines": { - "node": ">=0.8.x" + "node_modules/grunt-contrib-jshint/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "node_modules/grunt-contrib-jshint/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "node_modules/grunt-contrib-jshint/node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "domelementtype": "1" } }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/grunt-contrib-jshint/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "dom-serializer": "0", + "domelementtype": "1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/grunt-contrib-jshint/node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true }, - "node_modules/execa/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "node_modules/grunt-contrib-jshint/node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "node_modules/grunt-contrib-jshint/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, - "node_modules/execa/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/grunt-contrib-jshint/node_modules/jshint": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz", + "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.10", + "minimatch": "~3.0.2", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x" }, "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "jshint": "bin/jshint" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "node_modules/grunt-contrib-jshint/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 0.8.0" + "node": "*" } }, - "node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "engines": { - "node": ">=0.8" + "node_modules/grunt-contrib-jshint/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "node_modules/grunt-contrib-jshint/node_modules/shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==", "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" + "bin": { + "shjs": "bin/shjs" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/grunt-contrib-jshint/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/grunt-contrib-jshint/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/grunt-contrib-jshint/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "node_modules/grunt-contrib-nodeunit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-nodeunit/-/grunt-contrib-nodeunit-2.1.0.tgz", + "integrity": "sha512-cg3+lf6T5tDmnOFFf4+78b8xa5tsrw9u1NSlfCHjUrjeO+S/Ly0Dpo1BUV3QgsJ4k/0bgMmhbVjNXoP4AyYHuA==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" + "nodeunit-x": "^0.13.0" }, "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "node": ">=0.10.0" } }, - "node_modules/extract-zip/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/grunt-contrib-qunit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-4.0.0.tgz", + "integrity": "sha512-XP9Ks+uoSQzic0eic6koD8kYAKQnSYfu2G1HBqvrvUyXaDDnSSXOKELND8j7dwudnJj4N6KgW6OU7AHeM5PGKA==", "dev": true, "dependencies": { - "ms": "2.1.2" + "eventemitter2": "^6.4.2", + "p-each-series": "^2.1.0", + "puppeteer": "^4.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/grunt-contrib-qunit/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", "dev": true }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "node_modules/grunt-contrib-uglify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-1.0.2.tgz", + "integrity": "sha512-p8bFuwILMWTRfpfrjZ5faBLOUZ3fFEUNCVoQ/d+7QV7h9Qd/FLhYhkb/Gwe3Vdaf8yvAXIykC5Oz2f/Js9FdAw==", "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dependencies": { + "chalk": "^1.0.0", + "lodash": "^4.0.1", + "maxmin": "^1.1.0", + "uglify-js": "~2.6.2", + "uri-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "node_modules/grunt-contrib-uglify-es": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify-es/-/grunt-contrib-uglify-es-3.3.0.tgz", + "integrity": "sha512-E+9EbUQiBjFynaZp4wsdjktMo2oHEetGaBIhy9XTbhneHiXomXQWlfgY5Ib5c/FU9WiL/OfXbmo6nwgIN1hLAA==", + "deprecated": "deprecated", "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "chalk": "^1.0.0", + "maxmin": "^1.1.0", + "uglify-es": "~3.3.0", + "uri-path": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "node_modules/fastclick": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fastclick/-/fastclick-1.0.6.tgz", - "integrity": "sha1-FhYlsnsaWAZAWTa9qaLBkm0Gvmo=" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "node_modules/grunt-contrib-uglify-es/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "dependencies": { - "reusify": "^1.0.4" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "node_modules/grunt-contrib-uglify-es/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, "engines": { - "node": ">=0.4.0" + "node": ">=0.10.0" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "node_modules/grunt-contrib-uglify-es/node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", "dev": true, "dependencies": { - "pend": "~1.2.0" + "pako": "~0.2.0" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "node_modules/grunt-contrib-uglify-es/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "engines": { - "node": "^12.20 || >= 14.13" + "node": ">=0.10.0" } }, - "node_modules/fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" + "node_modules/grunt-contrib-uglify-es/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } }, - "node_modules/figures": { + "node_modules/grunt-contrib-uglify-es/node_modules/figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5", @@ -10559,745 +13269,669 @@ "node": ">=0.10.0" } }, - "node_modules/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" - }, - "node_modules/file-saverjs": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/file-saverjs/-/file-saverjs-1.3.6.tgz", - "integrity": "sha1-t6RU4Sb1bPcfy3AVm4NWFCZU544=" - }, - "node_modules/file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", - "dev": true - }, - "node_modules/file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/grunt-contrib-uglify-es/node_modules/gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha512-mu66twX6zg8WB6IPfUtrquS7fjwGnDJ7kdVcggd5rpjwBItQKjHtvhu6VcQMkqPYAR7DjWpEaN3xiBSNmxvzPg==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "browserify-zlib": "^0.1.4", + "concat-stream": "^1.4.1" + }, + "bin": { + "gzip-size": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "node_modules/grunt-contrib-uglify-es/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/grunt-contrib-uglify-es/node_modules/maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha512-jypoV6wTPuz/ngkc2sDZnFvpvx14QICNKS/jK9RbkmiQQJZ4JWstIszA8iT/z9tPSF/vXQ5qtG0h65N9tiLIKA==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^1.0.0", + "pretty-bytes": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "node_modules/grunt-contrib-uglify-es/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "node_modules/grunt-contrib-uglify-es/node_modules/pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha512-LNisJvAjy+hruxp3GV4IkZZscTI34+ISfeM1hesB9V6ezIDfXYrBi9TIXVjjMcEB4QFN7tL+dFDEk4s8jMBMyA==", "dev": true, "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + }, + "bin": { + "pretty-bytes": "cli.js" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "node_modules/grunt-contrib-uglify-es/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { - "glob": "~5.0.0" - }, - "engines": { - "node": ">= 0.6.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/findup-sync/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "node_modules/grunt-contrib-uglify-es/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "safe-buffer": "~5.1.0" } }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "node_modules/grunt-contrib-uglify-es/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "node_modules/grunt-contrib-uglify-es/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=0.8.0" } }, - "node_modules/flot": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/flot/-/flot-0.8.3.tgz", - "integrity": "sha512-xg2otcTJDvS+ERK+my4wxG/ASq90QURXtoM4LhacCq0jQW2jbyjdttbRNqU2cPykrpMvJ6b2uSp6SAgYAzj9tQ==" - }, - "node_modules/follow-redirects": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", - "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==", + "node_modules/grunt-contrib-uglify/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=", + "node_modules/grunt-contrib-uglify/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, "engines": { - "node": ">=0.10.3" + "node": ">=0.10.0" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "node_modules/grunt-contrib-uglify/node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "pako": "~0.2.0" } }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "node_modules/grunt-contrib-uglify/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "dependencies": { - "for-in": "^1.0.1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "node_modules/foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "node_modules/grunt-contrib-uglify/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, + "engines": [ + "node >= 0.8" + ], "dependencies": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "node_modules/grunt-contrib-uglify/node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/grunt-contrib-uglify/node_modules/gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha512-mu66twX6zg8WB6IPfUtrquS7fjwGnDJ7kdVcggd5rpjwBItQKjHtvhu6VcQMkqPYAR7DjWpEaN3xiBSNmxvzPg==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "browserify-zlib": "^0.1.4", + "concat-stream": "^1.4.1" + }, + "bin": { + "gzip-size": "cli.js" }, "engines": { - "node": ">= 0.12" + "node": ">=0.10.0" } }, - "node_modules/form-data-encoder": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.2.tgz", - "integrity": "sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==", + "node_modules/grunt-contrib-uglify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/grunt-contrib-uglify/node_modules/maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha512-jypoV6wTPuz/ngkc2sDZnFvpvx14QICNKS/jK9RbkmiQQJZ4JWstIszA8iT/z9tPSF/vXQ5qtG0h65N9tiLIKA==", "dev": true, + "dependencies": { + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^1.0.0", + "pretty-bytes": "^1.0.0" + }, "engines": { - "node": ">= 14.17" + "node": ">=0.10.0" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "node_modules/grunt-contrib-uglify/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "node_modules/grunt-contrib-uglify/node_modules/pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha512-LNisJvAjy+hruxp3GV4IkZZscTI34+ISfeM1hesB9V6ezIDfXYrBi9TIXVjjMcEB4QFN7tL+dFDEk4s8jMBMyA==", "dev": true, "dependencies": { - "fetch-blob": "^3.1.2" + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + }, + "bin": { + "pretty-bytes": "cli.js" }, "engines": { - "node": ">=12.20.0" + "node": ">=0.10.0" } }, - "node_modules/frac": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", - "engines": { - "node": ">=0.8" + "node_modules/grunt-contrib-uglify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", - "dev": true + "node_modules/grunt-contrib-uglify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/grunt-contrib-uglify/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=0.10.0" } }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/grunt-contrib-uglify/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=0.8.0" } }, - "node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "node_modules/grunt-contrib-watch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", "dev": true, "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" + "async": "^2.6.0", + "gaze": "^1.1.0", + "lodash": "^4.17.10", + "tiny-lr": "^1.1.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/ftp/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/grunt-contrib-watch/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "lodash": "^4.17.14" } }, - "node_modules/ftp/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/fullcalendar": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.0.tgz", - "integrity": "sha512-0OtsHhmdYhtFmQwXzyo8VqHzYgamg+zVOoytv5N13gI+iF6CGjevpCi/yBaQs0O4wY3OAp8I688IxdNYe0iAvw==", + "node_modules/grunt-exec": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.7.tgz", + "integrity": "sha512-AJw+ccLkJnycdyiTXFpt1ELpRbiMDn0uj3b04W0kmmjEZCz3j1LSO2bH9GxgQniUZc2mQFMEew9Bw9tWCu+1zw==", + "dev": true, + "engines": { + "node": ">=0.8.0" + }, "peerDependencies": { - "jquery": "2 - 3", - "moment": "^2.20.1" + "grunt": ">=0.4" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function-loop": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", - "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", - "dev": true + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.10.0" } }, - "node_modules/function.prototype.name/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "chalk": "~4.1.0", + "lodash": "~4.17.19" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/function.prototype.name/node_modules/es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "node_modules/grunt-legacy-log-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/function.prototype.name/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "node_modules/grunt-legacy-log-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/function.prototype.name/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/grunt-legacy-log-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/function.prototype.name/node_modules/is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "node_modules/grunt-legacy-log-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/grunt-legacy-log-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/function.prototype.name/node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/grunt-legacy-log-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/function.prototype.name/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/grunt-processhtml": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/grunt-processhtml/-/grunt-processhtml-0.4.3.tgz", + "integrity": "sha512-yq3/U1VYBC4X0qhR6R60PYttxEG8WZ+yHnAEXxUny6nopjmA0ZQyR3ICMzba0hoIu2tKDdcX2+GC45Mwu4XM2w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "htmlprocessor": "0.3.2", + "lodash": "4.17.21" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 8.17.0" } }, - "node_modules/function.prototype.name/node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "node_modules/grunt-processhtml/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/grunt-script-link-tags": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt-script-link-tags/-/grunt-script-link-tags-1.0.2.tgz", + "integrity": "sha512-w0rBSheBIIExtoriQGOsD5Afv5qpQeFXMqFaXaHRthlpOCjv58vLuMC76fAMC1l551h3rMg18M0s6mNpL5uekw==", + "dev": true + }, + "node_modules/grunt-war": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/grunt-war/-/grunt-war-0.5.1.tgz", + "integrity": "sha512-RmrDhGlyKsZCtU2QF9r1IpBkZAdCGLYICrXduaHh8D4mgU6ILzTWPGW5SvFjmO+HLStEg7AN8PW3B9if/qETsg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "archiver": ">= 0.12.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/function.prototype.name/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/grunt/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/function.prototype.name/node_modules/object.assign/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/grunt/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/function.prototype.name/node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "duplexer": "^0.1.1", + "pify": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/function.prototype.name/node_modules/string.prototype.trimend/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/function.prototype.name/node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/function.prototype.name/node_modules/string.prototype.trimstart/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "node_modules/gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { - "globule": "^1.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.4.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/geojson-equality": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/geojson-equality/-/geojson-equality-0.1.6.tgz", - "integrity": "sha512-TqG8YbqizP3EfwP5Uw4aLu6pKkg6JQK9uq/XZ1lXQntvTHD1BBKJWhNpJ2M0ax6TuWMP3oyx6Oq7FCIfznrgpQ==", - "dependencies": { - "deep-equal": "^1.0.0" - } - }, - "node_modules/geojson-rbush": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.2.0.tgz", - "integrity": "sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==", "dependencies": { - "@turf/bbox": "*", - "@turf/helpers": "6.x", - "@turf/meta": "6.x", - "@types/geojson": "7946.0.8", - "rbush": "^3.0.1" - } - }, - "node_modules/geojson-rbush/node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.10.0" } }, - "node_modules/get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, + "node_modules/has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/get-symbol-description": { + "node_modules/has-property-descriptors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dependencies": { - "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-symbol-description/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-symbol-description/node_modules/has-symbols": { + "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -11305,442 +13939,442 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/get-uri/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { - "ms": "2.1.2" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-uri/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, - "node_modules/getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dependencies": { - "assert-plus": "^1.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/git-url-parse": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.0.0.tgz", - "integrity": "sha512-X1kozCqKL82dMrCLi4vie9SHDC+QugKskAMs4VUbIkhURKg5yDwxDmf6Ixg73J+/xVgK5TXKhzn8a94nHJHpnA==", + "node_modules/hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==", "dev": true, "dependencies": { - "git-up": "^7.0.0" + "is-stream": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "node_modules/hasha/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "dev": true }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "he": "bin/he" } }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", "dev": true, "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "parse-passwd": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/globby/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "dependencies": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "engines": { - "node": ">= 0.10" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/globule/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12" } }, - "node_modules/globule/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", "dependencies": { - "brace-expansion": "^1.1.7" + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" }, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/got": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.3.1.tgz", - "integrity": "sha512-tS6+JMhBh4iXMSXF6KkIsRxmloPln31QHDlcb6Ec3bzxjjFJFr/8aXdpyuLmVc9I4i2HyBHYw1QU5K1ruUdpkw==", - "dev": true, + "node_modules/html2pdf.js": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/html2pdf.js/-/html2pdf.js-0.10.1.tgz", + "integrity": "sha512-3onwwhOWsZfNjIZwV6YIJ6FVhXk+X9YxHSqzeS6hup+1dGi2DHI+zZYUJ+iFnvtaYcjlhyrILL1fvRCUOa8Fcg==", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.0.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "es6-promise": "^4.2.5", + "html2canvas": "^1.0.0", + "jspdf": "^2.3.1" } }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grunt": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", - "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==", + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "dateformat": "~3.0.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~0.3.0", - "glob": "~7.1.6", - "grunt-cli": "~1.4.3", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.14.0", - "minimatch": "~3.0.4", - "mkdirp": "~1.0.4", - "nopt": "~3.0.6", - "rimraf": "~3.0.2" - }, - "bin": { - "grunt": "bin/grunt" - }, - "engines": { - "node": ">=8" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" } }, - "node_modules/grunt-babel": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/grunt-babel/-/grunt-babel-7.0.0.tgz", - "integrity": "sha512-AFilvH/iPbnIYhL4Wx36AJQCaVEvK55xh0tujAt1DIM5tuxYxRsgUPEpwijBU147B+as/ssGuY9/6JYfTiAWpw==", + "node_modules/htmlprocessor": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/htmlprocessor/-/htmlprocessor-0.3.2.tgz", + "integrity": "sha512-SsW4k9tNht/eVA8Ngd6KRmRqyIIU0Vb5dr3bc1hst+IvvBPxxfasR8sJONBRmLjG8IIgpa/qfUlAStKau06S4g==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "lodash": "^4.17.21" }, - "peerDependencies": { - "babel-core": "^6.0.0 || ^7.0.0-alpha", - "grunt": ">=0.4.0" + "bin": { + "htmlprocessor": "bin/htmlprocessor" } }, - "node_modules/grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "findup-sync": "~0.3.0", - "grunt-known-options": "~1.1.0", - "nopt": "~3.0.6", - "resolve": "~1.1.0" - }, - "bin": { - "grunt": "bin/grunt" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/grunt-contrib-clean": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", - "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "dependencies": { - "async": "^1.5.2", - "rimraf": "^2.5.1" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">= 0.10.0" - }, - "peerDependencies": { - "grunt": ">=0.4.5" + "node": ">=8.0.0" } }, - "node_modules/grunt-contrib-clean/node_modules/rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "dependencies": { - "glob": "^7.0.5" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 6" } }, - "node_modules/grunt-contrib-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", - "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { - "chalk": "^1.0.0", - "source-map": "^0.5.3" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=12.0.0" }, "peerDependencies": { - "grunt": ">=0.4.0" - } - }, - "node_modules/grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", - "dev": true, - "dependencies": { - "chalk": "^1.1.1", - "file-sync-cmp": "^0.1.0" + "@types/express": "^4.17.13" }, - "engines": { - "node": ">=0.10.0" + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/grunt-contrib-cssmin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-4.0.0.tgz", - "integrity": "sha512-jXU+Zlk8Q8XztOGNGpjYlD/BDQ0n95IHKrQKtFR7Gd8hZrzgqiG1Ra7cGYc8h2DD9vkSFGNlweb9Q00rBxOK2w==", + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "clean-css": "^5.0.1", - "maxmin": "^3.0.0" + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" }, "engines": { - "node": ">=10.0" + "node": ">=12" } }, - "node_modules/grunt-contrib-cssmin/node_modules/ansi-styles": { + "node_modules/http-server/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -11755,10 +14389,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/grunt-contrib-cssmin/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "node_modules/http-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -11771,7 +14405,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/grunt-contrib-cssmin/node_modules/color-convert": { + "node_modules/http-server/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -11783,318 +14417,351 @@ "node": ">=7.0.0" } }, - "node_modules/grunt-contrib-cssmin/node_modules/color-name": { + "node_modules/http-server/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/grunt-contrib-cssmin/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/http-server/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-server/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/grunt-contrib-cssmin/node_modules/gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "dependencies": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">=6" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/grunt-contrib-cssmin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, "engines": { - "node": ">=8" + "node": ">=10.19.0" } }, - "node_modules/grunt-contrib-cssmin/node_modules/maxmin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", - "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "figures": "^3.2.0", - "gzip-size": "^5.1.1", - "pretty-bytes": "^5.3.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/grunt-contrib-cssmin/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=14.18.0" } }, - "node_modules/grunt-contrib-cssmin/node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "ms": "^2.0.0" } }, - "node_modules/grunt-contrib-cssmin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/grunt-contrib-jshint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", - "integrity": "sha512-N8jtQ/FmvuRdJoEGphmGt+ov1oi5bJq4hPBPT/g54ed1glF34l2z5VAdHHhcgOaezBxur3kcMPChB0pfZxxcFw==", + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "dependencies": { - "chalk": "^1.1.1", - "hooker": "^0.2.3", - "jshint": "~2.9.4" - }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "grunt": ">=0.4.0" + "postcss": "^8.1.0" } }, - "node_modules/grunt-contrib-jshint/node_modules/jshint": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz", - "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "dependencies": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.10", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "bin": { - "jshint": "bin/jshint" + "engines": { + "node": ">= 4" } }, - "node_modules/grunt-contrib-jshint/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "minimatch": "^9.0.0" }, "engines": { - "node": "*" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/grunt-contrib-nodeunit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-nodeunit/-/grunt-contrib-nodeunit-2.1.0.tgz", - "integrity": "sha512-cg3+lf6T5tDmnOFFf4+78b8xa5tsrw9u1NSlfCHjUrjeO+S/Ly0Dpo1BUV3QgsJ4k/0bgMmhbVjNXoP4AyYHuA==", + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "nodeunit-x": "^0.13.0" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0" } }, - "node_modules/grunt-contrib-qunit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-4.0.0.tgz", - "integrity": "sha512-XP9Ks+uoSQzic0eic6koD8kYAKQnSYfu2G1HBqvrvUyXaDDnSSXOKELND8j7dwudnJj4N6KgW6OU7AHeM5PGKA==", + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "eventemitter2": "^6.4.2", - "p-each-series": "^2.1.0", - "puppeteer": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/grunt-contrib-qunit/node_modules/eventemitter2": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz", - "integrity": "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==", - "dev": true - }, - "node_modules/grunt-contrib-uglify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-1.0.2.tgz", - "integrity": "sha1-rmekb5FT7dTLEYE6Vetpxw19svs=", + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, - "dependencies": { - "chalk": "^1.0.0", - "lodash": "^4.0.1", - "maxmin": "^1.1.0", - "uglify-js": "~2.6.2", - "uri-path": "^1.0.0" + "optional": true, + "bin": { + "image-size": "bin/image-size.js" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/grunt-contrib-uglify-es": { + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==", + "dev": true + }, + "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify-es/-/grunt-contrib-uglify-es-3.3.0.tgz", - "integrity": "sha1-wV97Ef1BMgPU4MkTf10/r1Wo34A=", - "deprecated": "deprecated", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "chalk": "^1.0.0", - "maxmin": "^1.1.0", - "uglify-es": "~3.3.0", - "uri-path": "^1.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/grunt-contrib-uglify-es/node_modules/commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/grunt-contrib-uglify-es/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/grunt-contrib-uglify-es/node_modules/uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { - "commander": "~2.13.0", - "source-map": "~0.6.1" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "bin": { - "uglifyjs": "bin/uglifyjs" + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/grunt-contrib-watch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", - "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "dependencies": { - "async": "^2.6.0", - "gaze": "^1.1.0", - "lodash": "^4.17.10", - "tiny-lr": "^1.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.19" } }, - "node_modules/grunt-contrib-watch/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { - "lodash": "^4.17.14" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/grunt-exec": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.7.tgz", - "integrity": "sha1-QAUf+k6wyWV+BTuV6I1ENSocLCU=", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "engines": { - "node": ">=0.8.0" - }, - "peerDependencies": { - "grunt": ">=0.4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", - "dev": true, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/inline-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/grunt-legacy-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", - "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", - "dev": true, - "dependencies": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.19" - }, - "engines": { - "node": ">= 0.10.0" - } + "node_modules/inputmask": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/inputmask/-/inputmask-3.3.11.tgz", + "integrity": "sha512-qyqC+MmJjOZrqojwY5T6KvWbdlPW3BO+1W7+2Y5bdSmwv//gkF8A5nXjPpZHD+rk1KRRBvsZ5oNGpJAKfVnqjw==" }, - "node_modules/grunt-legacy-log-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", - "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "dependencies": { - "chalk": "~4.1.0", - "lodash": "~4.17.19" + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=12.0.0" } }, - "node_modules/grunt-legacy-log-utils/node_modules/ansi-styles": { + "node_modules/inquirer/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -12109,7 +14776,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/grunt-legacy-log-utils/node_modules/chalk": { + "node_modules/inquirer/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -12125,7 +14792,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/grunt-legacy-log-utils/node_modules/color-convert": { + "node_modules/inquirer/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -12137,13 +14804,13 @@ "node": ">=7.0.0" } }, - "node_modules/grunt-legacy-log-utils/node_modules/color-name": { + "node_modules/inquirer/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/grunt-legacy-log-utils/node_modules/has-flag": { + "node_modules/inquirer/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -12152,7 +14819,7 @@ "node": ">=8" } }, - "node_modules/grunt-legacy-log-utils/node_modules/supports-color": { + "node_modules/inquirer/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -12164,325 +14831,148 @@ "node": ">=8" } }, - "node_modules/grunt-legacy-util": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", - "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", - "dev": true, - "dependencies": { - "async": "~3.2.0", - "exit": "~0.1.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.21", - "underscore.string": "~3.3.5", - "which": "~2.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-legacy-util/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/grunt-legacy-util/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/grunt-processhtml": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/grunt-processhtml/-/grunt-processhtml-0.4.3.tgz", - "integrity": "sha512-yq3/U1VYBC4X0qhR6R60PYttxEG8WZ+yHnAEXxUny6nopjmA0ZQyR3ICMzba0hoIu2tKDdcX2+GC45Mwu4XM2w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "htmlprocessor": "0.3.2", - "lodash": "4.17.21" - }, - "engines": { - "node": ">= 8.17.0" - } - }, - "node_modules/grunt-processhtml/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/grunt-script-link-tags": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt-script-link-tags/-/grunt-script-link-tags-1.0.2.tgz", - "integrity": "sha1-3QQbpneJRSp3RHnJ4sPvf+i+PiM=", - "dev": true - }, - "node_modules/grunt-war": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/grunt-war/-/grunt-war-0.5.1.tgz", - "integrity": "sha1-zpmwQUgtHbENeb6bJo5pkBUw9/U=", - "dev": true, - "dependencies": { - "archiver": ">= 0.12.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/grunt/node_modules/grunt-cli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", - "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", - "dev": true, - "dependencies": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" - }, - "bin": { - "grunt": "bin/grunt" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt/node_modules/grunt-cli/node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" }, "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/grunt/node_modules/grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "insert-module-globals": "bin/cmd.js" } }, - "node_modules/grunt/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, + "node_modules/insert-module-globals/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/gzip-size": { + "node_modules/insert-module-globals/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", - "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", - "dev": true, - "dependencies": { - "browserify-zlib": "^0.1.4", - "concat-stream": "^1.4.1" - }, - "bin": { - "gzip-size": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, + "node_modules/insert-module-globals/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + }, + "node_modules/insert-module-globals/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "loose-envify": "^1.0.0" } }, - "node_modules/has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "engines": { - "node": ">=0.10.0" + "node_modules/ion-rangeslider": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/ion-rangeslider/-/ion-rangeslider-2.3.1.tgz", + "integrity": "sha512-6V+24FD13/feliI485gnRHZYD9Ev64M5NAFTxnVib516ATHa9PlXQrC+nOiPngouRYTCLPJyokAJEi3e1Umi5g==", + "peerDependencies": { + "jquery": ">=1.8" } }, - "node_modules/has-flag": { + "node_modules/ionicons": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-3.0.0.tgz", + "integrity": "sha512-aAxjhc681QPsjVPwar2CtbcOiw6SMI2zT21eoBIWrmCi8ZXc+thL3vdQU9eVfG9XPeHXri/XVjv/ydKkORb6+Q==", "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.3" } }, - "node_modules/has-property-descriptors/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true }, - "node_modules/has-property-descriptors/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10" } }, - "node_modules/has-tostringtag": { + "node_modules/is-absolute": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/has-tostringtag/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -12490,3262 +14980,3293 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, - "node_modules/hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "dependencies": { - "is-stream": "^1.0.1" + "has-bigints": "^1.0.1" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { - "parse-passwd": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "node_modules/html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "dependencies": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html2pdf.js": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/html2pdf.js/-/html2pdf.js-0.10.1.tgz", - "integrity": "sha512-3onwwhOWsZfNjIZwV6YIJ6FVhXk+X9YxHSqzeS6hup+1dGi2DHI+zZYUJ+iFnvtaYcjlhyrILL1fvRCUOa8Fcg==", + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, "dependencies": { - "es6-promise": "^4.2.5", - "html2canvas": "^1.0.0", - "jspdf": "^2.3.1" + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "node_modules/html2pdf.js/node_modules/core-js": { - "version": "3.23.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.4.tgz", - "integrity": "sha512-vjsKqRc1RyAJC3Ye2kYqgfdThb3zYnx9CrqoCcjMOENMtQPC7ZViBvlDxwYU/2z2NI/IPuiXw5mT4hWhddqjzQ==", - "hasInstallScript": true, - "optional": true, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html2pdf.js/node_modules/jspdf": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", - "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dependencies": { - "@babel/runtime": "^7.14.0", - "atob": "^2.1.2", - "btoa": "^1.2.1", - "fflate": "^0.4.8" + "has-tostringtag": "^1.0.0" }, - "optionalDependencies": { - "canvg": "^3.0.6", - "core-js": "^3.6.0", - "dompurify": "^2.2.0", - "html2canvas": "^1.0.0-rc.5" - } - }, - "node_modules/htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/htmlparser2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/htmlparser2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "node_modules/htmlprocessor": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/htmlprocessor/-/htmlprocessor-0.3.2.tgz", - "integrity": "sha512-SsW4k9tNht/eVA8Ngd6KRmRqyIIU0Vb5dr3bc1hst+IvvBPxxfasR8sJONBRmLjG8IIgpa/qfUlAStKau06S4g==", + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true, - "dependencies": { - "lodash": "^4.17.21" + "engines": { + "node": ">=0.10.0" }, - "bin": { - "htmlprocessor": "bin/htmlprocessor" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/http-parser-js": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", - "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" }, "engines": { - "node": ">= 6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, - "dependencies": { - "debug": "4" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">= 6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, - "node_modules/http-server": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.0.tgz", - "integrity": "sha512-5lYsIcZtf6pdR8tCtzAHTWrAveo4liUlJdWc7YafwK/maPgYHs+VNP6KpCClmUnSorJrARVMXqtT055zBv11Yg==", + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, - "dependencies": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.5", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" }, - "bin": { - "http-server": "bin/http-server" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=12" + "node": ">=0.12.0" } }, - "node_modules/http-server/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-server/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-server/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "isobject": "^3.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=0.10.0" } }, - "node_modules/http-server/node_modules/color-name": { + "node_modules/is-regex": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/http-server/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-server/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "is-unc-path": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "call-bind": "^1.0.2" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10.19.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "node_modules/https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { - "agent-base": "5", - "debug": "4" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dependencies": { - "ms": "2.1.2" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" - }, - "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "engines": { - "node": ">= 4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.13" } }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { "node": ">=8" } }, - "node_modules/import-local/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", "dev": true, + "dependencies": { + "append-transform": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { - "find-up": "^4.0.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=0.8.19" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "node_modules/istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "dependencies": { - "repeating": "^2.0.0" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node": ">=6" } }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dependencies": { - "source-map": "~0.5.3" + "node_modules/istanbul-lib-report/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/inputmask": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/inputmask/-/inputmask-3.3.11.tgz", - "integrity": "sha1-FCHJSuKMPc0bTSYze1CLs0mY4tg=" - }, - "node_modules/inquirer": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.0.tgz", - "integrity": "sha512-eukdjrBljg9t55ZnvJjvGi1OyYEzVBFsO/8o5d2MV3mc28u3x4X2kS4eJ/+9U10KiREfPkEBSeCrU/S2G/uRtw==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "dependencies": { - "ansi-escapes": "^5.0.0", - "chalk": "^5.0.1", - "cli-cursor": "^4.0.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^4.0.1", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^6.1.2", - "run-async": "^2.4.0", - "rxjs": "^7.5.6", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "through": "^2.3.6", - "wrap-ansi": "^8.0.1" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=6" } }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", - "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6" } }, - "node_modules/inquirer/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/inquirer/node_modules/figures": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", - "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", + "node_modules/istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "dev": true, "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" + "html-escaper": "^2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/inquirer/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", - "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "node_modules/jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "node_modules/jdataview": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/jdataview/-/jdataview-2.5.0.tgz", + "integrity": "sha512-ZJop3D5nyDcWPBPv4NPnhCvx3HgQNsCXMfw8gpNKY16BobgxmVF+kJ08aHuqk6bJQVeL2mkf6nDCcZPMompalw==" + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 10.13.0" } }, - "node_modules/internal-slot/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/internal-slot/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jquery": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", + "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==" + }, + "node_modules/jquery-knob": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/jquery-knob/-/jquery-knob-1.2.11.tgz", + "integrity": "sha512-gyeWDmtr2x8XJLSNS2JGNYDUNmfmMrwmFcGPDJ074jnPPvMYf3PJFud4/6AubCT8ahOY7UL4YvALtSwCrxtBBQ==" + }, + "node_modules/jquery-slimscroll": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/jquery-slimscroll/-/jquery-slimscroll-1.3.8.tgz", + "integrity": "sha512-3cNGNCq6i3b+rZQOx1tSBlSFewk4X35eUuQmoRVSA4MSytw3rGPvCw6cEB2oEHf+u15RVzgfh4hN+/3dDNzwiQ==", "dependencies": { - "loose-envify": "^1.0.0" + "jquery": ">= 1.7" } }, - "node_modules/ion-rangeslider": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ion-rangeslider/-/ion-rangeslider-2.3.0.tgz", - "integrity": "sha512-7TtH9/X4Aq/xCzboWxjwlv20gVqR90Ysc3aehMlTuH2/ULaSxpB80hq+yvD1N0FwWbPDtxQpjQrz/iX+LWXKmg==", + "node_modules/jquery-sparkline": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jquery-sparkline/-/jquery-sparkline-2.4.0.tgz", + "integrity": "sha512-SzjpMkOwlnqZpH4Ni2UbdRU5GxDl/BljgN8Smlun7CXUDqRhjPf2eolJ37KKcaG0/ufsMKY+XDERfPTV1hIcjg==" + }, + "node_modules/jquery-ui": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.2.tgz", + "integrity": "sha512-wBZPnqWs5GaYJmo1Jj0k/mrSkzdQzKDwhXNtHKcBdAcKVxMM3KNYFq+iJ2i1rwiG53Z8M4mTn3Qxrm17uH1D4Q==", "dependencies": { - "jquery": ">=1.8" + "jquery": ">=1.8.0 <4.0.0" } }, - "node_modules/ionicons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-3.0.0.tgz", - "integrity": "sha1-QLja9P16MRUL0AIWD2ZJbiKpjDw=", - "engines": { - "node": ">=0.10.3" + "node_modules/jquery-ui-dist": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.13.2.tgz", + "integrity": "sha512-oVDRd1NLtTbBwpRKAYdIRgpWVDzeBhfy7Gu0RmY6JEaZtmBq6kDn1pm5SgDiAotrnDS+RoTRXO6xvcNTxA9tOA==", + "dependencies": { + "jquery": ">=1.8.0 <4.0.0" } }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true + "node_modules/jquery.easing": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jquery.easing/-/jquery.easing-1.4.1.tgz", + "integrity": "sha512-BVpRacWCbNfo/ALWxnLkIY/WRa4Ydg/LtwzIJZvDm7vrhV8Txv+ACi6EGnU11zT19sTc3KEPathWx6CtjWLD1w==" }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-xlsx": { + "version": "0.8.22", + "resolved": "https://registry.npmjs.org/js-xlsx/-/js-xlsx-0.8.22.tgz", + "integrity": "sha512-3N4a9RBHTr777rxxlvwJVpC+er/neRC+40sm2M/g3RIpWiCJG0iyaGJa8Za1K3NvjhZcKn9Sz5n36TY9ti5RMQ==", "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "adler-32": "", + "cfb": ">=0.10.0", + "codepage": "~1.3.6", + "commander": "", + "crc-32": "", + "jszip": "2.4.0", + "ssf": "~0.8.1" + }, + "bin": { + "xlsx": "bin/xlsx.njs" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "node_modules/js-xlsx/node_modules/jszip": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.4.0.tgz", + "integrity": "sha512-m+yvNmYfRCaf1gr5YFT5e3fnSqLnE9McbNyRd0fNycsT0HltS19NKc18fh3Lvl/AIW/ovL6/MQ1JnfFg4G3o4A==", "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "pako": "~0.2.5" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "node_modules/js-xlsx/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, + "node_modules/jshint": { + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", + "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "jshint": "bin/jshint" } }, - "node_modules/is-boolean-object/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, + "node_modules/jshint/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/jshint/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/jshint/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/is-boolean-object/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, + "node_modules/jshint/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/jshint/node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "domelementtype": "1" } }, - "node_modules/is-boolean-object/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/jshint/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-builtin-module": { + "node_modules/jshint/node_modules/entities": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" + }, + "node_modules/jshint/node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", "dependencies": { - "builtin-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" } }, - "node_modules/is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/jshint/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, + "node_modules/jshint/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dependencies": { - "ci-info": "^3.2.0" + "brace-expansion": "^1.1.7" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": "*" } }, - "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "node_modules/jshint/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/is-date-object": { + "node_modules/jshint/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-better-errors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { - "is-docker": "cli.js" + "json5": "lib/cli.js" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, + "node_modules/jsonlint": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.3.tgz", + "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==", "dependencies": { - "number-is-nan": "^1.0.0" + "JSV": "^4.0.x", + "nomnom": "^1.5.x" + }, + "bin": { + "jsonlint": "lib/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "engines": { - "node": ">= 0.4" + "node_modules/jspdf": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", + "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", + "dependencies": { + "@babel/runtime": "^7.14.0", + "atob": "^2.1.2", + "btoa": "^1.2.1", + "fflate": "^0.4.8" }, + "optionalDependencies": { + "canvg": "^3.0.6", + "core-js": "^3.6.0", + "dompurify": "^2.2.0", + "html2canvas": "^1.0.0-rc.5" + } + }, + "node_modules/jspdf/node_modules/core-js": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", + "hasInstallScript": true, + "optional": true, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, + "node_modules/jstat": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz", + "integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug==" + }, + "node_modules/JSV": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", + "integrity": "sha512-ZJ6wx9xaKJ3yFUhq5/sk82PJMuUyLk277I8mQeyDgCTjGdjWJIvPfaU5LIXaMuaN2UO1X3kZH4+lgphublZUHw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/jvectormap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jvectormap/-/jvectormap-1.2.2.tgz", + "integrity": "sha512-rSNE/z2umGcDURvGgnE5Tgwxszw9CkgWQY/NY1LyM+CKGSui11mGTZf/zGrX4WxPwcietgWwMqIV67EJxmU0wQ==", + "deprecated": "jvectormap is not maintened since Aug 2015. You can use jvectormap-next or jqvmap instead.", + "dependencies": { + "jquery": ">=1.5" } }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "source-map-support": "^0.5.5" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" + "node_modules/keycloak-js": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-20.0.0.tgz", + "integrity": "sha512-nd84PGuZZaU32iTvNYkHyw8UvmO6b6k9hCu/7kftwSaYTmOytQG9eK3DyL6idHmZQFHwz8QhJnqzEJYUtgmDIQ==", + "dependencies": { + "base64-js": "^1.5.1", + "js-sha256": "^0.9.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "json-buffer": "3.0.1" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" } }, - "node_modules/is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, "dependencies": { - "has-symbols": "^1.0.1" + "package-json": "^8.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", "dev": true, "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "readable-stream": "^2.0.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6.3" } }, - "node_modules/is-shared-array-buffer/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/is-shared-array-buffer/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "~5.1.0" } }, - "node_modules/is-shared-array-buffer/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "lcov-parse": "bin/cli.js" } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } + "node_modules/leaflet": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", + "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/leaflet-draw": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/leaflet-draw/-/leaflet-draw-1.0.4.tgz", + "integrity": "sha512-rsQ6saQO5ST5Aj6XRFylr5zvarWgzWnrg46zQ1MEOEIHsppdC/8hnN8qMoFvACsPvTioAuysya/TVtog15tyAQ==" + }, + "node_modules/leaflet-geosearch": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/leaflet-geosearch/-/leaflet-geosearch-3.8.0.tgz", + "integrity": "sha512-YYFigq2JkqaZrgEjxWyvyQy4seh0Il9xPlG+IP2Z3+K7DrQ+bYc7qDizmxKbAn2jSNUCvokz75gXj7wXcFDB9A==", + "optionalDependencies": { + "@googlemaps/js-api-loader": "^1.14.3", + "leaflet": "^1.6.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, + "node_modules/leaflet-groupedlayercontrol": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/leaflet-groupedlayercontrol/-/leaflet-groupedlayercontrol-0.6.1.tgz", + "integrity": "sha512-xkGeH6ygcryFQI0FUWn6Bz93zlwrOSpeXgJQ3jLRoUQJ5h/Qgrz+GqR9nhBFfikjUKtC1sCKL3eDR9wNTWhLlA==", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "leaflet": "^1.0.1" } }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "node_modules/leaflet-measure": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leaflet-measure/-/leaflet-measure-3.1.0.tgz", + "integrity": "sha512-ln5c9UNaWDEd24tIzDt9hwnpb8OaCPBfSWNBg2H8rb9SA3cbXW9+NqohA6/8TdsNDGJZr36woXMrqRq07Pcl3w==", "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "@turf/area": "^5.1.5", + "@turf/length": "^5.1.5", + "lodash": "^4.17.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "leaflet": "^1.0.0" + } + }, + "node_modules/leaflet-measure/node_modules/@turf/area": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-5.1.5.tgz", + "integrity": "sha512-lz16gqtvoz+j1jD9y3zj0Z5JnGNd3YfS0h+DQY1EcZymvi75Frm9i5YbEyth0RfxYZeOVufY7YIS3LXbJlI57g==", + "dependencies": { + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" } }, - "node_modules/is-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.4.tgz", - "integrity": "sha512-ILaRgn4zaSrVNXNGtON6iFNotXW3hAPF3+0fB1usg2jFlWqo5fEDdmJkz0zBfoi7Dgskr8Khi2xZ8cXqZEfXNA==", + "node_modules/leaflet-measure/node_modules/@turf/distance": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-5.1.5.tgz", + "integrity": "sha512-sYCAgYZ2MjNKMtx17EijHlK9qHwpA0MuuQWbR4P30LTCl52UlG/reBfV899wKyF3HuDL9ux78IbILwOfeQ4zgA==", "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "node_modules/leaflet-measure/node_modules/@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==" }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, + "node_modules/leaflet-measure/node_modules/@turf/invariant": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", + "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" + "@turf/helpers": "^5.1.5" } }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/leaflet-measure/node_modules/@turf/length": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/length/-/length-5.1.5.tgz", + "integrity": "sha512-0ryx68h512wCoNfwyksLdabxEfwkGNTPg61/QiY+QfGFUOUNhHbP+QimViFpwF5hyX7qmroaSHVclLUqyLGRbg==", + "dependencies": { + "@turf/distance": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/meta": "^5.1.5" } }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, + "node_modules/leaflet-measure/node_modules/@turf/meta": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz", + "integrity": "sha512-ZjQ3Ii62X9FjnK4hhdsbT+64AYRpaI8XMBMcyftEOGSmPMUVnkbvuv3C9geuElAXfQU7Zk1oWGOcrGOD9zr78Q==", "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@turf/helpers": "^5.1.5" } }, - "node_modules/is-weakref/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, + "node_modules/leaflet-search": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/leaflet-search/-/leaflet-search-3.0.9.tgz", + "integrity": "sha512-Jg6b9pwYNAeo67VxRKOunzH5BicscmG0Zp9sjyV2dO+lWEV+eq5N13H+q5vtTA9jcYCriOX1EN4UUxhVUs8n3g==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "leaflet": "*" } }, - "node_modules/is-weakref/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, + "node_modules/leaflet-simple-map-screenshoter": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/leaflet-simple-map-screenshoter/-/leaflet-simple-map-screenshoter-0.4.5.tgz", + "integrity": "sha512-bvd++mQstpgb7F7c2v5jCLlUitQ6CcYLZ56do7PVyyVpGvnlhIEk5S6dLXqpe3itSr2D/re5yUAOf8zBt95ViQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dom-to-image-more": "^2.8.0", + "file-saver": "^2.0.2" } }, - "node_modules/is-weakref/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/leaflet-wfst": { + "version": "2.0.1-beta.27", + "resolved": "https://registry.npmjs.org/leaflet-wfst/-/leaflet-wfst-2.0.1-beta.27.tgz", + "integrity": "sha512-zqs+ooIw9mjqnUPytxt3nWVKda02ceWt2yR9FMNiZxRv/hNKgZq6/dvirT1TMWlFmULLIfkCKik+zIrjGIVNjQ==" + }, + "node_modules/leaflet.awesome-markers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/leaflet.awesome-markers/-/leaflet.awesome-markers-2.0.5.tgz", + "integrity": "sha512-Ne/xDjkGyaujwNVVkv2tyXQUV0ZW7gZ0Mo0FuQY4jp2qWrvXi0hwDBvmZyF/8YOvybyMabTMM/mFWCTd1jZIQA==" + }, + "node_modules/leaflet.markercluster": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", + "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", + "peerDependencies": { + "leaflet": "^1.3.1" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/leaflet.pattern": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/leaflet.pattern/-/leaflet.pattern-0.1.0.tgz", + "integrity": "sha512-E4sxvvK0XHi1EhE1yUTG1bzafXZoXUPqWPjHz5fSpv/pOcT4CtS0qR1lhFSRtSUYios8OwlZmUGB9n91zQEgcw==", + "dependencies": { + "leaflet": "~0.7.1" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/leaflet.pattern/node_modules/leaflet": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-0.7.7.tgz", + "integrity": "sha512-H1lR7J5VxhvQJQHlW2UywtxO63zilLrnwVsDvjKeyfntffj63Ml94gCk9YPYWBkiQgxisdiA8aJ30Zoou4VhEA==" + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "dependencies": { - "is-docker": "^2.0.0" + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" } }, - "node_modules/is-yarn-global": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.0.tgz", - "integrity": "sha512-HneQBCrXGBy15QnaDfcn6OLoU8AQPAa0Qn0IeJR/QCo4E8dNZaGGwxpCwWyEBQC5QvFonP8d6t60iGpAHVAfNA==", + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, "engines": { - "node": ">=12" + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "dependencies": { - "append-transform": "^1.0.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "node_modules/license-checker": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz", + "integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==", "dev": true, "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "chalk": "^2.4.1", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "read-installed": "~4.0.3", + "semver": "^5.5.0", + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-satisfies": "^4.0.0", + "treeify": "^1.1.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { - "semver": "bin/semver.js" + "license-checker": "bin/license-checker" } }, - "node_modules/istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "node_modules/license-checker/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "ms": "^2.1.1" + } + }, + "node_modules/license-checker/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "abbrev": "1", + "osenv": "^0.1.4" }, - "engines": { - "node": ">=6" + "bin": { + "nopt": "bin/nopt.js" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "node_modules/license-checker/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6" + "bin": { + "semver": "bin/semver" } }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "webpack-sources": "^3.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "webpack": { + "optional": true + }, + "webpack-sources": { "optional": true } } }, - "node_modules/istanbul-lib-source-maps/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 8" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, "dependencies": { - "html-escaper": "^2.0.0" + "error-ex": "^1.2.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dev": true, "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" + "is-utf8": "^0.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jdataview": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/jdataview/-/jdataview-2.5.0.tgz", - "integrity": "sha1-MIGz/qZR+TF+xr1P6y3cmKpB1ZU=" - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, "engines": { - "node": ">= 10.13.0" + "node": ">=6.11.5" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 12.13.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, - "node_modules/jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/jquery-knob": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/jquery-knob/-/jquery-knob-1.2.11.tgz", - "integrity": "sha1-83w528HHpqbBLNsu1Pa/+2g/ENY=" + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true }, - "node_modules/jquery-slimscroll": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/jquery-slimscroll/-/jquery-slimscroll-1.3.8.tgz", - "integrity": "sha1-hIHETnpHaHZTkIoo9/cK7WTITjY=", - "dependencies": { - "jquery": ">= 1.7" - } + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, - "node_modules/jquery-sparkline": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jquery-sparkline/-/jquery-sparkline-2.4.0.tgz", - "integrity": "sha1-G+i3twTdOFcVJwiu+x1KSzpp+zM=" + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true }, - "node_modules/jquery-ui": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.2.tgz", - "integrity": "sha512-wBZPnqWs5GaYJmo1Jj0k/mrSkzdQzKDwhXNtHKcBdAcKVxMM3KNYFq+iJ2i1rwiG53Z8M4mTn3Qxrm17uH1D4Q==", - "dependencies": { - "jquery": ">=1.8.0 <4.0.0" - } + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true }, - "node_modules/jquery-ui-dist": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.12.1.tgz", - "integrity": "sha1-XAgV08xvkP9fqvWyaKbiO0ypBPo=" + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true }, - "node_modules/jquery.easing": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jquery.easing/-/jquery.easing-1.4.1.tgz", - "integrity": "sha1-R5gsWDa9dY/UhJSSPEoQHvbpPjs=" + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true }, - "node_modules/js-sha256": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true }, - "node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, - "node_modules/js-xlsx": { - "version": "0.8.22", - "resolved": "https://registry.npmjs.org/js-xlsx/-/js-xlsx-0.8.22.tgz", - "integrity": "sha512-3N4a9RBHTr777rxxlvwJVpC+er/neRC+40sm2M/g3RIpWiCJG0iyaGJa8Za1K3NvjhZcKn9Sz5n36TY9ti5RMQ==", - "dependencies": { - "adler-32": "", - "cfb": ">=0.10.0", - "codepage": "~1.3.6", - "commander": "", - "crc-32": "", - "jszip": "2.4.0", - "ssf": "~0.8.1" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true }, - "node_modules/js-xlsx/node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true, "engines": { - "node": ">=0.8" + "node": ">=0.8.6" } }, - "node_modules/js-xlsx/node_modules/codepage": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.3.8.tgz", - "integrity": "sha1-Ty5dfAl13ij4hJgFjcta/KtqX3E=", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "dependencies": { - "commander": "", - "concat-stream": "", - "voc": "" - }, - "bin": { - "codepage": "bin/codepage.njs" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=0.8" - } - }, - "node_modules/js-xlsx/node_modules/codepage/node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-xlsx/node_modules/codepage/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/js-xlsx/node_modules/codepage/node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/js-xlsx/node_modules/colors": { - "version": "0.6.2", - "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/js-xlsx/node_modules/commander": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", - "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/js-xlsx/node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.8" + "node": ">=7.0.0" } }, - "node_modules/js-xlsx/node_modules/frac": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/frac/-/frac-0.3.1.tgz", - "integrity": "sha1-V3Z3t/3L5vr3xGHxgB00E3zaQ1Q=", - "engines": { - "node": ">=0.8" - } + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/js-xlsx/node_modules/jszip": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.4.0.tgz", - "integrity": "sha512-m+yvNmYfRCaf1gr5YFT5e3fnSqLnE9McbNyRd0fNycsT0HltS19NKc18fh3Lvl/AIW/ovL6/MQ1JnfFg4G3o4A==", - "dependencies": { - "pako": "~0.2.5" + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/js-xlsx/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/js-xlsx/node_modules/ssf": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.8.2.tgz", - "integrity": "sha1-udTcahwbz3b4q/qW19dlb7Kr7NY=", + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "colors": "0.6.2", - "frac": "0.3.1", - "voc": "" - }, - "bin": { - "ssf": "bin/ssf.njs" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=8" } }, - "node_modules/js-xlsx/node_modules/voc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/voc/-/voc-1.2.0.tgz", - "integrity": "sha512-BOuDjFFYvJdZO6e/N65AlaDItXo2TgyLjeyRYcqgAPkXpp5yTJcvkL2n+syO1r9Qc5g96tfBD2tuiMhYDmaGcA==", - "bin": { - "voc": "voc.njs" - }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "dev": true, "engines": { - "node": ">=0.8" + "node": ">=0.10.0" } }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "loose-envify": "cli.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/jshint": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", - "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", "dependencies": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "strip-json-comments": "1.0.x" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" }, - "bin": { - "jshint": "bin/jshint" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jshint/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, "engines": { - "node": "*" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } }, - "node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "node_modules/macos-release": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.2.0.tgz", + "integrity": "sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, - "node_modules/jsonlint": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.3.tgz", - "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==", + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, "dependencies": { - "JSV": "^4.0.x", - "nomnom": "^1.5.x" - }, - "bin": { - "jsonlint": "lib/cli.js" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "engines": [ - "node >= 0.2.0" - ] + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } }, - "node_modules/JSONStream": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", - "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" }, "engines": { - "node": "*" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "kind-of": "^6.0.2" }, "engines": { - "node": ">=0.6.0" + "node": ">=0.10.0" } }, - "node_modules/jsprim/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/jstat": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/jstat/-/jstat-1.7.1.tgz", - "integrity": "sha512-lcWi9NKovcx8jdCvgsIzua3KB5rs+TK9cyH1NWyctj+e09jKZTk70vv/EdYSG5mp8MiID2TdepavXn4LUr8rZQ==" - }, - "node_modules/JSV": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", - "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=", + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jszip/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "node_modules/mathjax": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.2.2.tgz", + "integrity": "sha512-Bt+SSVU8eBG27zChVewOicYs7Xsdt40qm4+UpHyX7k0/O9NliPc+x77k1/FEsPsjKPZGJvtRZM1vO+geW0OhGw==" }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/maxmin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", + "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", + "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "chalk": "^4.1.0", + "figures": "^3.2.0", + "gzip-size": "^5.1.1", + "pretty-bytes": "^5.3.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/maxmin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jvectormap": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jvectormap/-/jvectormap-1.2.2.tgz", - "integrity": "sha1-LkQIskpgRz/xBsHnJD43WuXKhdo=", - "deprecated": "jvectormap is not maintened since Aug 2015. You can use jvectormap-next or jqvmap instead.", + "node_modules/maxmin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "jquery": ">=1.5" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/keycloak-js": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-20.0.0.tgz", - "integrity": "sha512-nd84PGuZZaU32iTvNYkHyw8UvmO6b6k9hCu/7kftwSaYTmOytQG9eK3DyL6idHmZQFHwz8QhJnqzEJYUtgmDIQ==", + "node_modules/maxmin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "base64-js": "^1.5.1", - "js-sha256": "^0.9.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/keycloak-js/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/maxmin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "node_modules/maxmin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "json-buffer": "3.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/maxmin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dependencies": { + "hash-base": "^3.0.0", "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "package-json": "^8.1.0" + "fs-monkey": "^1.0.4" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4.0.0" } }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/lcov-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { - "lcov-parse": "bin/cli.js" + "semver": "bin/semver" } }, - "node_modules/leaflet": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", - "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" - }, - "node_modules/leaflet-draw": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/leaflet-draw/-/leaflet-draw-1.0.4.tgz", - "integrity": "sha512-rsQ6saQO5ST5Aj6XRFylr5zvarWgzWnrg46zQ1MEOEIHsppdC/8hnN8qMoFvACsPvTioAuysya/TVtog15tyAQ==" + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true }, - "node_modules/leaflet-geosearch": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/leaflet-geosearch/-/leaflet-geosearch-3.6.0.tgz", - "integrity": "sha512-TkJOi+eVbsQB7wC0ssGzV9eGQv5BgEwDyb0QOunYA64qe53lB+ostUemvQD7Cmari0shtgBr3Patn5galjr3WA==", - "optionalDependencies": { - "leaflet": "^1.6.0" + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" } }, - "node_modules/leaflet-groupedlayercontrol": { + "node_modules/merge-source-map/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/leaflet-groupedlayercontrol/-/leaflet-groupedlayercontrol-0.6.1.tgz", - "integrity": "sha1-y3CXx5jGtN7mROirhMDnC2o+HKo=", - "dependencies": { - "leaflet": "^1.0.1" + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/leaflet-measure": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leaflet-measure/-/leaflet-measure-3.1.0.tgz", - "integrity": "sha512-ln5c9UNaWDEd24tIzDt9hwnpb8OaCPBfSWNBg2H8rb9SA3cbXW9+NqohA6/8TdsNDGJZr36woXMrqRq07Pcl3w==", - "dependencies": { - "@turf/area": "^5.1.5", - "@turf/length": "^5.1.5", - "lodash": "^4.17.5" - }, - "peerDependencies": { - "leaflet": "^1.0.0" + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" } }, - "node_modules/leaflet-search": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/leaflet-search/-/leaflet-search-3.0.2.tgz", - "integrity": "sha512-DtI8LTthhjRzxfNQTgYNuvrk+5hLTISFdemSVrtvnyPA31/a8NGE3GInS19eLGZIgHAYtbUFOHO1/OLbxhi6Yw==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mgrs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", + "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "leaflet": "*" + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/leaflet-simple-map-screenshoter": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/leaflet-simple-map-screenshoter/-/leaflet-simple-map-screenshoter-0.4.5.tgz", - "integrity": "sha512-bvd++mQstpgb7F7c2v5jCLlUitQ6CcYLZ56do7PVyyVpGvnlhIEk5S6dLXqpe3itSr2D/re5yUAOf8zBt95ViQ==", + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dependencies": { - "dom-to-image-more": "^2.8.0", - "file-saver": "^2.0.2" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/leaflet-wfst": { - "version": "2.0.1-beta.21", - "resolved": "https://registry.npmjs.org/leaflet-wfst/-/leaflet-wfst-2.0.1-beta.21.tgz", - "integrity": "sha512-OOLN+gHvIkLU8vojg1kyRGBwYlSLa52OJI6zoBGl98+4HuplciQUZZznazWPsvoBfopKT3M6/YDB6BTpiyUHnw==" + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/leaflet.awesome-markers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/leaflet.awesome-markers/-/leaflet.awesome-markers-2.0.5.tgz", - "integrity": "sha512-Ne/xDjkGyaujwNVVkv2tyXQUV0ZW7gZ0Mo0FuQY4jp2qWrvXi0hwDBvmZyF/8YOvybyMabTMM/mFWCTd1jZIQA==" + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/leaflet.markercluster": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", - "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", - "peerDependencies": { - "leaflet": "^1.3.1" + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/leaflet.pattern": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/leaflet.pattern/-/leaflet.pattern-0.1.0.tgz", - "integrity": "sha512-E4sxvvK0XHi1EhE1yUTG1bzafXZoXUPqWPjHz5fSpv/pOcT4CtS0qR1lhFSRtSUYios8OwlZmUGB9n91zQEgcw==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { - "leaflet": "~0.7.1" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/leaflet.pattern/node_modules/leaflet": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-0.7.7.tgz", - "integrity": "sha1-HjUrpU5j0HZFH6NjyQCJDLLPde4=" + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/license-checker": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz", - "integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==", - "dev": true, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "chalk": "^2.4.1", - "debug": "^3.1.0", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "read-installed": "~4.0.3", - "semver": "^5.5.0", - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-satisfies": "^4.0.0", - "treeify": "^1.1.0" + "brace-expansion": "^1.1.7" }, - "bin": { - "license-checker": "bin/license-checker" + "engines": { + "node": "*" } }, - "node_modules/license-checker/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/license-checker/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/license-checker/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/license-checker/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/license-checker/node_modules/nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/license-checker/node_modules/spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/license-checker/node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/license-checker/node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/license-checker/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" } }, - "node_modules/liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/liftup/node_modules/findup-sync": { + "node_modules/minipass-json-stream/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/liftup/node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/liftup/node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/liftup/node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/livereload-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", - "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true, - "engines": { - "node": ">=6.11.5" + "node": ">= 8" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8.9.0" + "node": ">=8" } }, - "node_modules/loader-utils/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/mitt": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz", + "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "minimist": "^1.2.6" }, - "engines": { - "node": ">=6" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/locate-path/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dependencies": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true + "node_modules/module-deps/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + "node_modules/module-deps/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true, - "engines": { - "node": ">=0.8.6" + "node_modules/module-deps/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, + "node_modules/module-deps/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, + "safe-buffer": "~5.1.0" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true, + "node_modules/morris.js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/morris.js/-/morris.js-0.5.0.tgz", + "integrity": "sha512-qNJUNEcJKzsQoE1OZNzJqmxsFVsuzgN72GUAcwfe6bBl7w381IzOYorRk0jsq2zEgCXC4DYnqQdYwzKjtvU1gg==", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.8 <0.11" } }, - "node_modules/longest": { + "node_modules/mrmime": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" }, "bin": { - "loose-envify": "cli.js" + "multicast-dns": "cli.js" } }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" } }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "optional": true, "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "ms": "^2.1.1" } }, - "node_modules/macos-release": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", - "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, - "node_modules/make-dir/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "dev": true }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">= 0.4.0" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "node_modules/new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", "dev": true, "dependencies": { - "kind-of": "^6.0.2" + "type-fest": "^2.5.1" }, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-iterator/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" } }, - "node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], "engines": { - "node": ">=0.10.0" + "node": ">=10.5.0" } }, - "node_modules/mathjax": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.1.2.tgz", - "integrity": "sha512-BojKspBv4nNWzO1wC6VEI+g9gHDOhkaGHGgLxXkasdU4pwjdO5AXD5M/wcLPkXYPjZ/N+6sU8rjQTlyvN2cWiQ==" - }, - "node_modules/maxmin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", - "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", + "node_modules/node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", "dev": true, "dependencies": { - "chalk": "^1.0.0", - "figures": "^1.0.1", - "gzip-size": "^1.0.0", - "pretty-bytes": "^1.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" } }, - "node_modules/md5.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "node_modules/node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">=0.10.0" + "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", "dev": true, - "dependencies": { - "source-map": "^0.6.1" + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/merge-source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "engines": { - "node": ">= 8" + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mgrs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", - "integrity": "sha1-+5FYjnjJACVnI5XLQLJffNatGCk=" + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/nodeunit-x": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/nodeunit-x/-/nodeunit-x-0.13.0.tgz", + "integrity": "sha512-64AZrL+3JaiLm76KclMlZu2i0YKU10i8I4mQzERqs8Xf7UgqoQ5CuXPJmx4c+x8duiwategZ+g2DQCNORuGXLA==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "ejs": "^2.5.2", + "tap": "^12.6.2" }, - "engines": { - "node": ">=8.6" + "bin": { + "nodeunit": "bin/nodeunit" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "node_modules/nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha512-5s0JxqhDx9/rksG2BTMVN1enjWSvPidpoSgViZU4ZXULyTe+7jxcCRLB6f42Z0l1xYJpleCBtSyY6Lwg3uu5CQ==", + "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", + "dependencies": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + } + }, + "node_modules/nomnom/node_modules/ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=0.8.0" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/nomnom/node_modules/chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, + "node_modules/nomnom/node_modules/strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", "bin": { - "mime": "cli.js" + "strip-ansi": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=0.8.0" } }, - "node_modules/mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" } }, - "node_modules/mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "dev": true, "dependencies": { - "mime-db": "1.46.0" + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">= 0.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, "engines": { - "node": "*" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "dev": true, "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minipass/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/minipass/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/mitt": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz", - "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/npm-install-checks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "semver": "^7.1.1" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, "engines": { - "node": "*" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/morris.js": { - "version": "0.5.1", - "resolved": "git+ssh://git@github.com/morrisjs/morris.js.git#14530d0733801d5bef1264cf3d062ecace7e326b", - "integrity": "sha512-1QwL4R990HvQC4haEO9DVSbzK3IujWEcXiEbuICO7Gu6SqpXH03taEu8F2sW24ik0SNiDbLgPr9tHzuSOi1Gkg==", - "license": "BSD-2-Clause", + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, "engines": { - "node": ">=0.8 <0.11" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, "engines": { - "node": ">= 0.4.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { - "type-fest": "^2.5.1" + "path-key": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -15754,295 +18275,366 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { - "node": ">=12.20" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, "engines": { - "node": ">=10.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-fetch": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", - "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "boolbase": "^1.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "node_modules/nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/nyc/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "node_modules/nodeunit-x": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/nodeunit-x/-/nodeunit-x-0.13.0.tgz", - "integrity": "sha512-64AZrL+3JaiLm76KclMlZu2i0YKU10i8I4mQzERqs8Xf7UgqoQ5CuXPJmx4c+x8duiwategZ+g2DQCNORuGXLA==", + "node_modules/nyc/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "dependencies": { - "ejs": "^2.5.2", - "tap": "^12.6.2" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" }, - "bin": { - "nodeunit": "bin/nodeunit" + "engines": { + "node": ">=6" } }, - "node_modules/nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", + "node_modules/nyc/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "dependencies": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/nomnom/node_modules/ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "node_modules/nyc/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/nyc/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/nomnom/node_modules/chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "node_modules/nyc/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, "dependencies": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "node_modules/nomnom/node_modules/strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "bin": { - "strip-ansi": "cli.js" + "node_modules/nyc/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "node_modules/nyc/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "dependencies": { - "abbrev": "1" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": ">=6" } }, - "node_modules/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "node_modules/nyc/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, - "node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "node_modules/nyc/node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/nyc/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "node_modules/nyc/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "node_modules/nyc/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "dependencies": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "bin": { - "nyc": "bin/nyc.js" + "pify": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/nyc/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/nyc/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/nyc/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "node_modules/nyc/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "node_modules/nyc/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.1" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/nyc/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/nyc/node_modules/read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/nyc/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/nyc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/nyc/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/nyc/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/nyc/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=6" } }, "node_modules/nyc/node_modules/strip-ansi": { @@ -16057,16 +18649,41 @@ "node": ">=6" } }, - "node_modules/nyc/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/nyc/node_modules/test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "dev": true, - "bin": { - "uuid": "bin/uuid" + "dependencies": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" } }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, "node_modules/nyc/node_modules/yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -16085,11 +18702,15 @@ "yargs-parser": "^13.1.2" } }, - "node_modules/nyc/node_modules/yargs/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "node_modules/nyc/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } }, "node_modules/oauth-sign": { "version": "0.9.0", @@ -16103,63 +18724,27 @@ "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is/node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, "engines": { "node": ">= 0.4" }, @@ -16176,13 +18761,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -16232,33 +18818,60 @@ "node": ">=0.10.0" } }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -16299,148 +18912,119 @@ } }, "node_modules/ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "dependencies": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ora/node_modules/bl": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", - "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/ora/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ora/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ora/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6" + "node": ">=7.0.0" } }, - "node_modules/ora/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/ora/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" + "engines": { + "node": ">=8" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, "node_modules/os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/os-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz", - "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", + "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", "dev": true, "dependencies": { - "macos-release": "^3.0.1", + "macos-release": "^3.1.0", "windows-release": "^5.0.1" }, "engines": { @@ -16453,7 +19037,7 @@ "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16472,13 +19056,13 @@ "node_modules/own-or": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", + "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", "dev": true }, "node_modules/own-or-env": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", - "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", + "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", "dev": true, "dependencies": { "own-or": "^1.0.0" @@ -16506,160 +19090,181 @@ } }, "node_modules/p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", - "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^5.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "dependencies": { - "debug": "4" + "@types/retry": "0.12.0", + "retry": "^0.13.1" }, "engines": { - "node": ">= 6.0.0" + "node": ">=8" } }, - "node_modules/pac-proxy-agent/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">= 4" } }, - "node_modules/pac-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-6.0.3.tgz", + "integrity": "sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "pac-resolver": "^6.0.1", + "socks-proxy-agent": "^8.0.1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 14" } }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/pac-proxy-agent/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", + "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/pac-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/pac-proxy-agent/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", + "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "agent-base": "^7.0.1", + "debug": "^4.3.4", + "socks": "^2.7.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 14" } }, "node_modules/pac-resolver": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", - "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-6.0.2.tgz", + "integrity": "sha512-EQpuJ2ifOjpZY5sg1Q1ZeAxvtLwR7Mj3RgY8cysPGbsRu3RBXyJFWxnMus9PScjxya/0LzvVDxNh/gl0eXBU4w==", "dev": true, "dependencies": { - "degenerator": "^3.0.2", - "ip": "^1.1.5", + "degenerator": "^4.0.4", + "ip": "^1.1.8", "netmask": "^2.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 14" } }, "node_modules/pace": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/pace/-/pace-0.0.4.tgz", - "integrity": "sha1-1mQF1fW8EtJUQabibIeNvGnnenc=", + "integrity": "sha512-B1tKMCrHnTmMxaZTzK5+4HRisYaeH8WHMjeg21dbBXB9eFnrZ5uw9+grRnLmLzTcL4R4A8v/XDCnP2Qf+37rPw==", "dependencies": { "charm": "~0.1.0" }, @@ -16683,9 +19288,9 @@ } }, "node_modules/package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", "dev": true, "dependencies": { "got": "^12.1.0", @@ -16700,43 +19305,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "node_modules/pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" }, "bin": { - "semver": "bin/semver.js" + "pacote": "lib/bin.js" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/package-json/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/parent-module": { "version": "1.0.1", @@ -16753,21 +19357,21 @@ "node_modules/parents": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", "dependencies": { "path-platform": "~0.11.15" } }, "node_modules/parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dependencies": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "node_modules/parse-filepath": { @@ -16785,15 +19389,30 @@ } }, "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { - "error-ex": "^1.2.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" } }, "node_modules/parse-passwd": { @@ -16823,6 +19442,44 @@ "parse-path": "^7.0.0" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parsedbf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parsedbf/-/parsedbf-1.1.1.tgz", @@ -16832,22 +19489,44 @@ "text-encoding-polyfill": "^0.6.7" } }, - "node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, + "node_modules/parsedbf/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "pinkie-promise": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } @@ -16869,7 +19548,7 @@ "node_modules/path-platform": { "version": "0.11.15", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", "engines": { "node": ">= 0.8.0" } @@ -16895,24 +19574,50 @@ "node": ">=0.10.0" } }, - "node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -16927,26 +19632,24 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "devOptional": true }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -16955,18 +19658,18 @@ } }, "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16975,7 +19678,7 @@ "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "dependencies": { "pinkie": "^2.0.0" @@ -16984,28 +19687,30 @@ "node": ">=0.10.0" } }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "node_modules/piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "dev": true, "dependencies": { - "find-up": "^3.0.0" + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" }, - "engines": { - "node": ">=6" + "optionalDependencies": { + "nice-napi": "^1.0.2" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "find-up": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/point-in-polygon": { @@ -17013,50 +19718,173 @@ "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" }, - "node_modules/polygon-clipping": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.3.tgz", - "integrity": "sha512-ho0Xx5DLkgxRx/+n4O74XyJ67DcyN3Tu9bGYKsnTukGAW6ssnuak6Mwcyb1wHy9MZc9xsUWqIoiazkZB5weECg==", + "node_modules/polygon-clipping": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.3.tgz", + "integrity": "sha512-ho0Xx5DLkgxRx/+n4O74XyJ67DcyN3Tu9bGYKsnTukGAW6ssnuak6Mwcyb1wHy9MZc9xsUWqIoiazkZB5weECg==", + "dependencies": { + "splaytree": "^3.1.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", + "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.1.3", + "jiti": "^1.18.2", + "klona": "^2.0.6", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, "dependencies": { - "splaytree": "^3.1.0" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">= 0.12.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "dependencies": { - "lodash": "^4.17.14" + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/portfinder/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "node_modules/prelude-ls": { @@ -17069,24 +19897,20 @@ } }, "node_modules/pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, - "dependencies": { - "get-stdin": "^4.0.1", - "meow": "^3.1.0" - }, - "bin": { - "pretty-bytes": "cli.js" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/printj": { "version": "1.1.2", - "resolved": "http://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", "bin": { "printj": "bin/printj.njs" @@ -17104,18 +19928,27 @@ "node": ">= 0.6" } }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", @@ -17127,245 +19960,45 @@ } }, "node_modules/proj4": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.4.3.tgz", - "integrity": "sha1-87t+Yxv/wEfDaho8wUUzoDu+mWk=", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.9.0.tgz", + "integrity": "sha512-BoDXEzCVnRJVZoOKA0QHTFtYoE8lUxtX1jST38DJ8U+v1ixY70Kpwi0Llu6YqSWEH2xqu4XMEBNGcgeRIEywoA==", "dependencies": { "mgrs": "1.0.0", - "wkt-parser": "^1.1.3" - } - }, - "node_modules/promise.allsettled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.5.tgz", - "integrity": "sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==", - "dev": true, - "dependencies": { - "array.prototype.map": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "iterate-value": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/object.assign/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "wkt-parser": "^1.3.1" } }, - "node_modules/promise.allsettled/node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true }, - "node_modules/promise.allsettled/node_modules/string.prototype.trimend/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/promise.allsettled/node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "node_modules/promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", "dev": true, "dependencies": { + "array.prototype.map": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/promise.allsettled/node_modules/string.prototype.trimstart/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "iterate-value": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -17386,87 +20019,107 @@ "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", - "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.2.1.tgz", + "integrity": "sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q==", "dev": true, "dependencies": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^5.0.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^6.0.3", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.1" }, "engines": { - "node": ">= 8" + "node": ">= 14" } }, "node_modules/proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 14" } }, "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", + "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "dependencies": { - "yallist": "^3.0.2" + "engines": { + "node": ">=12" } }, - "node_modules/proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/proxy-agent/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", + "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } }, "node_modules/proxy-from-env": { "version": "1.1.0", @@ -17474,16 +20127,23 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", "dev": true }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "node_modules/public-encrypt": { @@ -17499,10 +20159,10 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/public-encrypt/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/pump": { "version": "3.0.0", @@ -17517,7 +20177,7 @@ "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/pupa": { "version": "3.1.0", @@ -17558,27 +20218,32 @@ "node": ">=10.18.1" } }, - "node_modules/puppeteer/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/puppeteer/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "dependencies": { - "ms": "2.1.2" + "agent-base": "5", + "debug": "4" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 6.0.0" } }, "node_modules/puppeteer/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "bin": { "mime": "cli.js" @@ -17587,11 +20252,20 @@ "node": ">=4.0.0" } }, - "node_modules/puppeteer/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/puppeteer/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/qs": { "version": "6.5.3", @@ -17602,28 +20276,18 @@ "node": ">=0.6" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", "engines": { "node": ">=0.4.x" } }, "node_modules/queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", - "dev": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -17652,9 +20316,9 @@ } }, "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" }, "node_modules/raf": { "version": "3.4.1", @@ -17682,15 +20346,24 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/rangeslide.js": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/rangeslide.js/-/rangeslide.js-0.13.0.tgz", "integrity": "sha512-4GL1TJoSjUuzYx2uGGt4wp/pRVcUVAqKIQn+t5lSmrqd+1Bvlk6W/CdaFCqMLGoWkE2u8ZNbMUV8IdduB9hufg==" }, "node_modules/raphael": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/raphael/-/raphael-2.2.8.tgz", - "integrity": "sha512-0kWKcGn4lXTw4eUiOhjspYiG+v0m6zSmTmlO62E0hl2CYKUvCuHER9YKqXYvOn2nj24mYp8jzHOLeBuj/Gn28Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/raphael/-/raphael-2.3.0.tgz", + "integrity": "sha512-w2yIenZAQnp257XUWGni4bLMVxpUpcIl7qgxEgDIXtmSypYtlNxfXWpOBxs7LBTps5sDwhRnrToJrMUrivqNTQ==", "dependencies": { "eve-raphael": "0.5.0" } @@ -17698,7 +20371,7 @@ "node_modules/raw-body": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", - "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", "dev": true, "dependencies": { "bytes": "1", @@ -17711,15 +20384,15 @@ "node_modules/raw-body/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, "node_modules/rbush": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", - "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", + "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", "dependencies": { - "quickselect": "^2.0.0" + "quickselect": "^1.0.1" } }, "node_modules/rc": { @@ -17737,6 +20410,12 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -17749,7 +20428,7 @@ "node_modules/read-installed": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", - "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", + "integrity": "sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ==", "dev": true, "dependencies": { "debuglog": "^1.0.1", @@ -17763,50 +20442,210 @@ "graceful-fs": "^4.1.2" } }, + "node_modules/read-installed/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-installed/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-installed/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/read-installed/node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-installed/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", "dependencies": { "readable-stream": "^2.0.2" } }, + "node_modules/read-only-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/read-only-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/read-only-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/read-package-json": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", - "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "dependencies": { - "glob": "^7.1.1", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.2" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/read-package-json/node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dev": true, "dependencies": { "load-json-file": "^1.0.0", @@ -17820,7 +20659,7 @@ "node_modules/read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dev": true, "dependencies": { "find-up": "^1.0.0", @@ -17830,18 +20669,122 @@ "node": ">=0.10.0" } }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/readdir-scoped-modules": { @@ -17861,8 +20804,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -17871,12 +20812,12 @@ } }, "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "dependencies": { - "resolve": "^1.1.6" + "resolve": "^1.9.0" }, "engines": { "node": ">= 0.10" @@ -17885,7 +20826,7 @@ "node_modules/redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", "dev": true, "dependencies": { "indent-string": "^2.1.0", @@ -17895,74 +20836,70 @@ "node": ">=0.10.0" } }, - "node_modules/regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "node_modules/redent/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", "dev": true, "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "regenerate": "^1.4.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/regexp.prototype.flags/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@babel/runtime": "^7.8.4" } }, - "node_modules/regexp.prototype.flags/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -17971,23 +20908,29 @@ } }, "node_modules/regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, "dependencies": { - "@pnpm/npm-conf": "^1.0.4" + "@pnpm/npm-conf": "^2.1.0" }, "engines": { "node": ">=14" @@ -18011,13 +20954,13 @@ "node_modules/regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", "dev": true }, "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -18029,40 +20972,40 @@ "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/release-it": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.4.1.tgz", - "integrity": "sha512-w6adXfE+bN/fdcG1KehgS7gYcTfZLYIPml4jPOUEtYQ6NJyaiCtCF/ks032w1jf6EUgvGgWruRP+2TyyyDDBgA==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.11.0.tgz", + "integrity": "sha512-lZwoGEnKYKwGnfxxlA7vtR7vvozPrOSsIgQaHO4bgQ5ARbG3IA6Dmo0IVusv6nR1KmnjH70QIeNAgsWs6Ji/tw==", "dev": true, "dependencies": { "@iarna/toml": "2.2.5", - "@octokit/rest": "19.0.4", + "@octokit/rest": "19.0.11", "async-retry": "1.3.3", - "chalk": "5.0.1", - "cosmiconfig": "7.0.1", - "execa": "6.1.0", - "form-data": "4.0.0", - "git-url-parse": "13.0.0", - "globby": "13.1.2", - "got": "12.3.1", - "inquirer": "9.1.0", + "chalk": "5.2.0", + "cosmiconfig": "8.1.3", + "execa": "7.1.1", + "git-url-parse": "13.1.0", + "globby": "13.1.4", + "got": "12.6.1", + "inquirer": "9.2.6", "is-ci": "3.0.1", + "issue-parser": "6.0.0", "lodash": "4.17.21", "mime-types": "2.1.35", "new-github-release-url": "2.0.0", - "node-fetch": "3.2.10", - "open": "8.4.0", - "ora": "6.1.2", - "os-name": "5.0.1", - "promise.allsettled": "1.0.5", - "proxy-agent": "5.0.0", - "semver": "7.3.7", + "node-fetch": "3.3.1", + "open": "9.1.0", + "ora": "6.3.1", + "os-name": "5.1.0", + "promise.allsettled": "1.0.6", + "proxy-agent": "6.2.1", + "semver": "7.5.1", "shelljs": "0.8.5", "update-notifier": "6.0.2", "url-join": "5.0.0", @@ -18076,10 +21019,43 @@ "node": ">=14.9" } }, + "node_modules/release-it/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/release-it/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/release-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/release-it/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -18088,89 +21064,107 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/release-it/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/release-it/node_modules/cli-width": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", + "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/release-it/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 8" + "node": ">=7.0.0" } }, - "node_modules/release-it/node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "node_modules/release-it/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/release-it/node_modules/cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/release-it/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "node_modules/release-it/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, "engines": { - "node": ">=8.6.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/release-it/node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" }, "engines": { - "node": ">= 6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/release-it/node_modules/figures/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/release-it/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -18186,36 +21180,92 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "node_modules/release-it/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=12.20.0" + "node": ">=8" } }, - "node_modules/release-it/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/release-it/node_modules/inquirer": { + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.6.tgz", + "integrity": "sha512-y71l237eJJKS4rl7sQcEUiMhrR0pB/ZnRMMTxLpjJhWL4hdWCT03a6jJnC1w6qIPSRZWEozuieGt3v7XaEJYFw==", "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.2", + "chalk": "^5.2.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, "engines": { - "node": ">= 4" + "node": ">=14.18.0" } }, - "node_modules/release-it/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/release-it/node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/release-it/node_modules/inquirer/node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/release-it/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/release-it/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -18228,46 +21278,72 @@ "node": ">=10" } }, - "node_modules/release-it/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/release-it/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/release-it/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/release-it/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/release-it/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/release-it/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "node_modules/release-it/node_modules/ora": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", "dev": true, "dependencies": { - "path-key": "^4.0.0" + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -18276,10 +21352,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/npm-run-path/node_modules/path-key": { + "node_modules/release-it/node_modules/ora/node_modules/cli-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "engines": { "node": ">=12" @@ -18288,13 +21379,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/release-it/node_modules/ora/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/ora/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, "dependencies": { - "mimic-fn": "^4.0.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { "node": ">=12" @@ -18303,44 +21407,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "node_modules/release-it/node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "ansi-regex": "^6.0.1" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/release-it/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/release-it/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/release-it/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "lru-cache": "^6.0.0" }, "bin": { - "shjs": "bin/shjs" + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/release-it/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/release-it/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -18353,16 +21474,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/release-it/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, "node_modules/release-it/node_modules/url-join": { @@ -18374,40 +21495,30 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/release-it/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/release-it/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, "node_modules/release-it/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/release-it/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "dependencies": { "es6-error": "^4.0.1" @@ -18416,16 +21527,10 @@ "node": ">=4" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, "engines": { "node": ">=0.10" @@ -18434,7 +21539,7 @@ "node_modules/repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "dev": true, "dependencies": { "is-finite": "^1.0.0" @@ -18475,40 +21580,18 @@ "node": ">= 6" } }, - "node_modules/request/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -18523,13 +21606,24 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/resolve-alpn": { "version": "1.2.1", @@ -18549,15 +21643,6 @@ "node": ">=8" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", @@ -18572,55 +21657,109 @@ } }, "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, "dependencies": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { "node": ">=8" } }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "mimic-fn": "^2.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "engines": { "node": ">= 4" @@ -18630,7 +21769,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -18639,7 +21777,7 @@ "node_modules/rgbcolor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=", + "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", "optional": true, "engines": { "node": ">= 0.8.15" @@ -18648,7 +21786,7 @@ "node_modules/right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", "dev": true, "dependencies": { "align-text": "^0.1.1" @@ -18658,54 +21796,163 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/robust-predicates": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", + "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==" + }, + "node_modules/rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/robust-predicates": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", - "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==" - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -18719,7 +21966,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -18739,36 +21985,97 @@ } }, "node_modules/rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", - "dev": true, + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { "tslib": "^2.1.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, "node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-json-parse": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", - "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", + "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==", "dev": true }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.63.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", + "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz", + "integrity": "sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==", + "dev": true, + "dependencies": { + "klona": "^2.0.6", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } }, "node_modules/sax": { "version": "1.2.4", @@ -18776,17 +22083,18 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/schema-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", - "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -18796,21 +22104,44 @@ "node_modules/secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "node_modules/select2": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.8.tgz", - "integrity": "sha512-H/I2mq71oiEe51S74hdUv4QubH1EJNLEMnjfQucftLa8GiuT5+RKIHwlV/7I/YUqZg0wsYQM946eFG/ntRPF/Q==" + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz", + "integrity": "sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==" }, - "node_modules/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-diff": { @@ -18828,11 +22159,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver-diff/node_modules/lru-cache": { + "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -18840,25 +22170,54 @@ "node": ">=10" } }, - "node_modules/semver-diff/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/semver-diff/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/serialize-javascript": { @@ -18870,10 +22229,103 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, "node_modules/setimmediate": { @@ -18911,15 +22363,6 @@ "node": ">=8" } }, - "node_modules/shallow-clone/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/shasum-object": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", @@ -18950,20 +22393,40 @@ } }, "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, "bin": { "shjs": "bin/shjs" }, "engines": { - "node": ">=0.8.0" + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/shp-write": { @@ -18983,6 +22446,11 @@ "pako": "~0.2.5" } }, + "node_modules/shp-write/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, "node_modules/shpjs": { "version": "3.6.3", "resolved": "https://registry.npmjs.org/shpjs/-/shpjs-3.6.3.tgz", @@ -19006,18 +22474,12 @@ "node_modules/shpjs/node_modules/lru-cache": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "node_modules/shpjs/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==" }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -19027,47 +22489,52 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sigstore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", + "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/tuf": "^1.0.1", + "make-fetch-happen": "^11.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" + "bin": { + "sigstore": "bin/sigstore.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, "node_modules/simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/simple-is": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", + "integrity": "sha512-GJXhv3r5vdj5tGWO+rcrWgjU2azLB+fb7Ehh3SmZpXE0o4KrrFLti0w4mdDCbR29X/z0Ls20ApjZitlpAXhAeg==", "dev": true }, "node_modules/skmeans": { @@ -19076,18 +22543,18 @@ "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==" }, "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", "dev": true, "engines": { "node": "*" @@ -19096,7 +22563,7 @@ "node_modules/slimscroll": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/slimscroll/-/slimscroll-0.9.1.tgz", - "integrity": "sha1-9nXNxgHYCtog8WAE0ifRVv0Rh7I=", + "integrity": "sha512-3j8F/QCsJpuhPE1yZte3876WIYZ0WfhhzYLS1464hq4mSdQ9kQ4fcDXjLz2/vhwNv7Y9pKX+GzX3udTHKpR9Pw==", "dependencies": { "browserify": ">=3.46.0", "classie": ">=0.0.1", @@ -19117,69 +22584,66 @@ "npm": ">= 3.0.0" } }, - "node_modules/socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "node_modules/socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "node_modules/sockjs/node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">= 6" + "node": ">=0.8.0" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "dependencies": { - "debug": "4" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "dependencies": { - "ms": "2.1.2" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/socks-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/socks/node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -19187,18 +22651,49 @@ "dev": true }, "node_modules/sortablejs": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.13.0.tgz", - "integrity": "sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg==" + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -19232,38 +22727,6 @@ "which": "^1.3.0" } }, - "node_modules/spawn-wrap/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/spawn-wrap/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -19287,53 +22750,42 @@ "spdx-ranges": "^2.0.0" } }, - "node_modules/spdx-compare/node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { - "spdx-exceptions": "^2.1.0", + "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-compare/node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, - "node_modules/spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { - "spdx-license-ids": "^1.0.2" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, "node_modules/spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "node_modules/spdx-ranges": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.0.tgz", - "integrity": "sha512-OOWghvosfmECc9edy/A9j7GabERmn8bJWHc0J1knVytQtO5Rw7VfxK6CDqmivJhfMJqWhWWUfffNNMPYvyvyQA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", + "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", "dev": true }, "node_modules/spdx-satisfies": { @@ -19347,39 +22799,55 @@ "spdx-ranges": "^2.0.0" } }, - "node_modules/spdx-satisfies/node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/spdx-satisfies/node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } }, "node_modules/splaytree": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.1.tgz", - "integrity": "sha512-9FaQ18FF0+sZc/ieEeXHt+Jw2eSpUgUtTLDYB/HXKWvhYVyOc7h1hzkn5MMO3GPib9MmXG1go8+OsBBzs/NMww==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.2.tgz", + "integrity": "sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==" }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/ssf": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.2.tgz", - "integrity": "sha512-rDhAPm9WyIsY8eZEKyE8Qsotb3j/wBdvMWBUsOhJdfhKGLfQidRjiBUV0y/MkyCLiXQ38FG6LWW/VYUtqlIDZQ==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.8.2.tgz", + "integrity": "sha512-+ZkFDAG+ImJ48DcZvabx6YTrZ67DKkM0kbyOOtH73mbUEvNhQWWgRZrHC8+k7GuGKWQnACYLi7bj0eCt1jmosQ==", "dependencies": { - "frac": "~1.1.2" + "colors": "0.6.2", + "frac": "0.3.1", + "voc": "" }, "bin": { "ssf": "bin/ssf.njs" @@ -19388,10 +22856,18 @@ "node": ">=0.8" } }, + "node_modules/ssf/node_modules/colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", @@ -19413,10 +22889,22 @@ "node": ">=0.10.0" } }, + "node_modules/ssri": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/stack-utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", - "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" @@ -19435,10 +22923,13 @@ } }, "node_modules/stackblur-canvas": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.2.0.tgz", - "integrity": "sha512-5Gf8dtlf8k6NbLzuly2NkGrkS/Ahh+I5VUjO7TnFizdJtgpfpLLEdQlLe9umbcnZlitU84kfYjXE67xlSXfhfQ==", - "optional": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", + "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", + "optional": true, + "engines": { + "node": ">=0.1.14" + } }, "node_modules/statuses": { "version": "2.0.1", @@ -19449,13 +22940,122 @@ "node": ">= 0.8" } }, - "node_modules/stream-combiner2": { + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdin-discarder/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/stdin-discarder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" } }, "node_modules/stream-splicer": { @@ -19467,116 +23067,188 @@ "readable-stream": "^2.0.2" } }, - "node_modules/string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "node_modules/stream-splicer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/stream-splicer/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-splicer/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==", "dev": true }, "node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "is-utf8": "^0.2.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "dev": true, "dependencies": { "get-stdin": "^4.0.1" @@ -19591,7 +23263,7 @@ "node_modules/strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", "bin": { "strip-json-comments": "cli.js" }, @@ -19602,25 +23274,26 @@ "node_modules/subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", "dependencies": { "minimist": "^1.1.0" } }, "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -19637,6 +23310,15 @@ "node": ">=12.0.0" } }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -19729,6 +23411,54 @@ "readable-stream": "^2.1.5" } }, + "node_modules/tap-mocha-reporter/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/tap-mocha-reporter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "optional": true + }, + "node_modules/tap-mocha-reporter/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/tap-mocha-reporter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/tap-mocha-reporter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/tap-mocha-reporter/node_modules/tap-parser": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", @@ -19759,45 +23489,37 @@ "tap-parser": "bin/cmd.js" } }, - "node_modules/tap/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/tap-parser/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "node_modules/tap/node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "node_modules/tap/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "node_modules/tap/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/tap/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, - "dependencies": { - "glob": "^7.1.3" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=4.2.0" } }, "node_modules/tapable": { @@ -19809,6 +23531,23 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -19821,165 +23560,74 @@ "tar-stream": "^2.1.4" } }, - "node_modules/tar-fs/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/tar-fs/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-fs/node_modules/bl/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "node_modules/tar-fs/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/tar-fs/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/tar-fs/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "readable-stream": "^3.1.1" }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/tar-fs/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/tar-fs/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/terser": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.0.tgz", - "integrity": "sha512-pdL757Ig5a0I+owA42l6tIuEycRuM7FPY4n62h44mRLRfnOxJkkOHd6i89dOpwZlpF6JXBwaAHF6yWzFrt+QyA==", + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -20028,145 +23676,94 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/test-exclude/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/test-exclude/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/test-exclude/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "node_modules/test-exclude/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "pify": "^3.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/test-exclude/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/test-exclude/node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" + "randombytes": "^2.1.0" } }, - "node_modules/test-exclude/node_modules/read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "node_modules/terser/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/test-exclude/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/text-encoding-polyfill": { @@ -20182,10 +23779,16 @@ "utrie": "^1.0.2" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/through2": { "version": "2.0.5", @@ -20196,10 +23799,15 @@ "xtend": "~4.0.1" } }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -20212,12 +23820,29 @@ }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/tiny-lr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", @@ -20241,29 +23866,23 @@ "ms": "^2.1.1" } }, - "node_modules/tiny-lr/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" }, - "node_modules/tiny-lr/node_modules/qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, "engines": { - "node": ">=0.6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, "node_modules/tmatch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", @@ -20283,19 +23902,17 @@ } }, "node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -20325,6 +23942,11 @@ "topoquantize": "bin/topoquantize" } }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/topojson-server": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.1.tgz", @@ -20336,6 +23958,11 @@ "geo2topo": "bin/geo2topo" } }, + "node_modules/topojson-server/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -20350,9 +23977,9 @@ } }, "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" @@ -20364,6 +23991,15 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/treeify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", @@ -20385,17 +24021,20 @@ "node_modules/trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/trivial-deferred": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", - "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.1.2.tgz", + "integrity": "sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g==", + "dev": true, + "engines": { + "node": ">= 8" + } }, "node_modules/ts-node": { "version": "8.10.2", @@ -20438,15 +24077,33 @@ "dev": true }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -20463,7 +24120,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "node_modules/type-check": { @@ -20479,9 +24136,9 @@ } }, "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { "node": ">=10" @@ -20490,10 +24147,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", @@ -20505,22 +24214,53 @@ } }, "node_modules/typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true, + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" + } + }, + "node_modules/uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "dev": true, + "dependencies": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-es/node_modules/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "node_modules/uglify-es/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/uglify-js": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", + "integrity": "sha512-5uPOZS1EDeuBIFwTYTlJefbQXWn+auebcRQpj5EtWr9E/7XwWVZ6YTgulZVSTHAEU9y/mYMYh2Mjt7TJ1iRNxQ==", "dev": true, "dependencies": { "async": "~0.2.6", @@ -20538,19 +24278,60 @@ "node_modules/uglify-js/node_modules/async": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", "dev": true }, + "node_modules/uglify-js/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js/node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dev": true, + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dev": true, + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, "node_modules/uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", "dev": true }, "node_modules/ui-select": { "version": "0.19.8", "resolved": "https://registry.npmjs.org/ui-select/-/ui-select-0.19.8.tgz", - "integrity": "sha1-dIYISKf9i8SU2YVtL2J3bqmGN8E=" + "integrity": "sha512-NSHm75s46oGph4BWUSQ4mgAGdZs0/YTP5nNo0efuwHBCPtTlye8zLSSxi3P5r1jI/BD9bJ8ODXyYWPoJZTRImQ==" }, "node_modules/umd": { "version": "3.0.3", @@ -20560,55 +24341,16 @@ "umd": "bin/cli.js" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive/node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive/node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20624,70 +24366,6 @@ "through": "^2.3.8" } }, - "node_modules/unbzip2-stream/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/unbzip2-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/unbzip2-stream/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -20736,16 +24414,77 @@ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/unicode-length": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", - "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", + "integrity": "sha512-rZKNhIqioUp7H49afr26tivLDCvUSqOXwmwEEnsCwnPX67S1CYbOL45Y5IP3K/XHN73/lg21HlrB8SNlYXKQTg==", "dev": true, "dependencies": { "punycode": "^1.3.2", "strip-ansi": "^3.0.1" } }, + "node_modules/unicode-length/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unicode-length/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", @@ -20758,6 +24497,30 @@ "node": ">= 0.8.0" } }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", @@ -20797,11 +24560,19 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -20856,9 +24627,9 @@ } }, "node_modules/update-notifier/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -20867,52 +24638,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { "punycode": "^2.1.0" } }, "node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" @@ -20921,19 +24659,19 @@ "node_modules/uri-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", - "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", + "integrity": "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==", "dev": true, "engines": { "node": ">= 0.10" } }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" } }, "node_modules/url-join": { @@ -20942,20 +24680,50 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "node_modules/url/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/util-extend": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", - "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" + "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } }, "node_modules/utrie": { "version": "1.0.2", @@ -20965,11 +24733,15 @@ "base64-arraybuffer": "^1.0.2" } }, - "node_modules/v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", - "dev": true + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } }, "node_modules/v8flags": { "version": "3.2.0", @@ -20984,33 +24756,108 @@ } }, "node_modules/validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, "dependencies": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/vm2": { "version": "3.9.19", "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", "dev": true, "dependencies": { "acorn": "^8.7.0", @@ -21023,6 +24870,18 @@ "node": ">=6.0" } }, + "node_modules/vm2/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/vm2/node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -21032,6 +24891,17 @@ "node": ">=0.4.0" } }, + "node_modules/voc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/voc/-/voc-1.2.0.tgz", + "integrity": "sha512-BOuDjFFYvJdZO6e/N65AlaDItXo2TgyLjeyRYcqgAPkXpp5yTJcvkL2n+syO1r9Qc5g96tfBD2tuiMhYDmaGcA==", + "bin": { + "voc": "voc.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -21045,6 +24915,15 @@ "node": ">=10.13.0" } }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -21070,9 +24949,9 @@ "dev": true }, "node_modules/webpack": { - "version": "5.86.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", - "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -21084,7 +24963,7 @@ "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -21094,7 +24973,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -21117,24 +24996,22 @@ } }, "node_modules/webpack-cli": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", - "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.1", - "@webpack-cli/info": "^1.2.2", - "@webpack-cli/serve": "^1.3.0", - "colorette": "^1.2.1", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", "commander": "^7.0.0", - "enquirer": "^2.3.6", - "execa": "^5.0.0", + "cross-spawn": "^7.0.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", "webpack-merge": "^5.7.3" }, "bin": { @@ -21143,6 +25020,10 @@ "engines": { "node": ">=10.13.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, "peerDependencies": { "webpack": "4.x.x || 5.x.x" }, @@ -21150,9 +25031,6 @@ "@webpack-cli/generators": { "optional": true }, - "@webpack-cli/init": { - "optional": true - }, "@webpack-cli/migrate": { "optional": true }, @@ -21165,9 +25043,9 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", - "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "engines": { "node": ">= 10" @@ -21182,35 +25060,156 @@ "node": ">= 0.10" } }, - "node_modules/webpack-cli/node_modules/rechoir": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", - "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "node_modules/webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webpack-cli/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -21229,6 +25228,97 @@ "node": ">=10.13.0" } }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -21264,18 +25354,6 @@ "node": ">=12" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -21287,15 +25365,18 @@ } }, "node_modules/which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -21315,23 +25396,22 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -21340,6 +25420,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -21391,9 +25480,9 @@ } }, "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -21406,9 +25495,9 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/wildcard-match": { @@ -21420,39 +25509,25 @@ "node_modules/window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/windows-release": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz", - "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==", - "dev": true, - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", + "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "execa": "^5.1.1" }, "engines": { - "node": ">= 8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/windows-release/node_modules/execa": { @@ -21490,6 +25565,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/windows-release/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/windows-release/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -21502,31 +25586,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/windows-release/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/windows-release/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/windows-release/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/windows-release/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "path-key": "^3.0.0" }, - "bin": { - "node-which": "bin/node-which" + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" } }, "node_modules/wkt-parser": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.2.2.tgz", - "integrity": "sha512-2aCAsY3VIKraNfMnAU2HYQyPQUnyeBvwXZofBXTR/Cev1vbL5Q4/Nw47JEFvkLtBm96RtK6fQbdPmc1kk8uhMw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.3.tgz", + "integrity": "sha512-ZnV3yH8/k58ZPACOXeiHaMuXIiaTk1t0hSUVisbO0t4RjA5wPpUytcxeyiN2h+LZRrmuHIh/1UlrR9e7DHDvTw==" }, "node_modules/word-wrap": { "version": "1.2.3", @@ -21540,63 +25648,113 @@ "node_modules/wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "2.4.3", @@ -21662,15 +25820,72 @@ "node": ">=0.8" } }, + "node_modules/xlsx/node_modules/adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", + "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "adler32": "bin/adler32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/codepage": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", + "integrity": "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==", + "dependencies": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "bin": { + "codepage": "bin/codepage.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/codepage/node_modules/commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + }, "node_modules/xlsx/node_modules/commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" }, + "node_modules/xlsx/node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/ssf": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.3.tgz", + "integrity": "sha512-pRuUdW0WwyB2doSqqjWyzwCD6PkfxpHAHdZp39K3dp/Hq7f+xfMwNAWIi16DyrRg4gg9c/RvLYkJTSawTPTm1w==", + "dependencies": { + "frac": "~1.1.2" + }, + "bin": { + "ssf": "bin/ssf.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" }, "node_modules/xml-js": { "version": "1.6.11", @@ -21683,88 +25898,62 @@ "xml-js": "bin/cli.js" } }, - "node_modules/xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { - "node": ">= 6" + "node": ">=10" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/yapool": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", - "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", + "integrity": "sha512-RONBZndo8Lo8pKPfORRxr2DIk2NZKIml654o4kaIu7RXVxQCKsAN6AqrcoZsI3h+2H5YO2mD/04Wy4LbAgd+Pg==", "dev": true }, "node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/yargs/node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "dependencies": { "buffer-crc32": "~0.2.3", @@ -21793,24 +25982,31 @@ } }, "node_modules/zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "dev": true, "dependencies": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 10" + } + }, + "node_modules/zone.js": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", + "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", + "dependencies": { + "tslib": "^2.3.0" } }, "node_modules/zrender": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.3.0.tgz", - "integrity": "sha512-Ln2QB5uqI1ftNYMtCRxd+XDq6MOttLgam2tmhKAVA+j0ko47UT+VNlDvKTkqe4K2sJhBvB0EhYNLebqlCTjatQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.3.tgz", + "integrity": "sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==", "dependencies": { "tslib": "2.3.0" } diff --git a/package.json b/package.json index bfa45e6fc..7d92f6a03 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,23 @@ }, "license": "Apache 2.0", "devDependencies": { + "@angular-devkit/build-angular": "^16.1.3", + "@angular/cli": "^16.1.3", + "@angular/compiler-cli": "^16.1.3", "@babel/cli": "^7.17.3", "@babel/core": "^7.17.5", "@release-it/keep-a-changelog": "^3.1.0", + "@types/angular": "^1.8.5", + "@types/angular-animate": "^1.5.11", + "@types/angular-aria": "^1.7.2", + "@types/angular-cookies": "^1.8.1", + "@types/angular-mocks": "^1.7.1", + "@types/angular-resource": "^1.5.17", + "@types/angular-route": "^1.7.3", + "@types/angular-sanitize": "^1.8.1", + "@types/jasmine": "^4.3.5", + "@types/jquery": "^3.5.16", + "@types/node": "^20.4.8", "babel-core": "^6.26.0", "babel-plugin-angularjs-annotate": "^0.10.0", "babel-plugin-transform-es2015-destructuring": "^6.23.0", @@ -39,16 +53,32 @@ "http-server": "^14.1.0", "license-checker": "^25.0.1", "release-it": "^15.4.1", + "typescript": "^5.1.6", "webpack": "^5.1.0", "webpack-cli": "^4.5.0" }, "scripts": { - "build": "npm install --force && webpack && grunt", - "start": "http-server -p 8000 -c-1 ./app --cors --gzip", - "release": "release-it" + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "release": "release-it", + "tsc": "tsc", + "tsc:w": "tsc -w" }, "dependencies": { + "@angular/animations": "^16.1.3", + "@angular/common": "^16.1.3", + "@angular/compiler": "^16.1.3", + "@angular/core": "^16.1.3", + "@angular/forms": "^16.1.3", + "@angular/platform-browser": "^16.1.3", + "@angular/platform-browser-dynamic": "^16.1.3", + "@angular/router": "^16.1.3", + "@angular/upgrade": "^16.1.3", "@fortawesome/fontawesome-free": "^6.1.1", + "@ng-bootstrap/ng-bootstrap": "^15.1.0", + "@popperjs/core": "^2.11.8", "@turf/turf": "^6.5.0", "admin-lte": "^2.4.15", "ag-grid-community": "^26.2.1", @@ -58,7 +88,7 @@ "angular-sanitize": "^1.7.8", "angular-ui-bootstrap": "^2.5.6", "angularjs-dropdown-multiselect": "^2.0.0-beta.10", - "bootstrap": "^3.3.7", + "bootstrap": "^3.4.1", "bootstrap-datepicker": "^1.7.0", "bootstrap-daterangepicker": "^2.1.25", "bootstrap-iconpicker-latest": "^1.12.0", @@ -67,6 +97,7 @@ "classybrew": "0.0.3", "code-prettify": "^0.1.0", "codemirror": "^5.59.1", + "colorbrewer": "^1.5.3", "crypto-js": "^4.0.0", "docx": "^7.3.0", "echarts": "^5.3.0", @@ -77,9 +108,9 @@ "html2pdf.js": "^0.10.1", "ion-rangeslider": "^2.3.0", "ionicons": "^3.0.0", - "jquery": "^3.5.1", + "jquery": "^3.7.0", "jquery-slimscroll": "^1.3.8", - "jquery-ui-dist": "^1.12.1", + "jquery-ui-dist": "^1.13.2", "jquery.easing": "^1.4.1", "js-xlsx": "^0.8.22", "jshint": "^2.13.5", @@ -100,12 +131,15 @@ "leaflet.pattern": "^0.1.0", "mathjax": "^3.1.2", "rangeslide.js": "^0.13.0", + "rxjs": "^7.8.1", "shp-write": "^0.3.2", "shpjs": "^3.4.3", "slimscroll": "^0.9.1", "sortablejs": "^1.13.0", "tableexport": "^5.0.5", - "ui-select": "^0.19.8" + "tslib": "^2.6.0", + "ui-select": "^0.19.8", + "zone.js": "^0.13.1" }, "jshintConfig": { "undef": true, diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 000000000..78a25acd9 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,17 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [ + "@angular/localize" + ] + }, + "files": [ + "app/main.ts" + ], + "include": [ + "app/**/*.d.ts" + ] + } + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..28bfcbd0d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,36 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./app", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "noImplicitAny": false, + "lib": [ + "ES2022", + "dom" + ], + "types": ["jquery"], + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true, + + + } + } \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index c3df2f239..c90de5566 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -6,7 +6,7 @@ const nodeModulePathConstant = './node_modules/'; module.exports = { entry: { - app: "./app/app.js", + app: "./app/app.ajs.js", }, output: { path: __dirname + "/app/dependencies",